天天看點

Struts2的自定義标簽

       最近閑來無事,就想把以前的畢業設計給重新改造一番,改造前的架構為Struts2+Spring+Hibernate+Sql Server 2005,改造為Struts2+Spring+mybatis+mysql,最近兩年mybatis用的比較多,而mysql以前沒用涉及過,最終的表結構重新設計了一份,加入了外鍵,增加了窄表的設計,系統入口增加url過濾,系統異常日志使用攔截器統一處理,其他業務邏輯大緻保持原樣,為了使呈現層更加多樣性,特意增加了Struts2的自定義标簽,下面是詳細的開發過程。

       先來了解下Struts2的自定義标簽,struts的擴充開發都是由struts2-core-xx.jar的具體支援,架構在struts初始化過程中會加載諸多配置檔案,我們要做的就是要弄明白,具體的檔案放置在何處。

       我們的标簽需要在jsp中引用,就像struts的s标簽的引用,就像<%@taglib prefix="s" uri="/struts-tags"%>,我們自定義的标簽也一樣,<%@taglib prefix="f" uri="/feng"%>,那麼該标簽定義在哪裡呢?沒錯,就是tld檔案,feng.tld檔案要放置在“項目/WEB-INF/”目錄下,内容如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
	<tlib-version>2.2.3</tlib-version>
	<jsp-version>1.2</jsp-version>
	<short-name>f</short-name>
	<uri>/feng</uri>
	<display-name>"feng Tags"</display-name>
	<tag>
		<name>date</name>
		<tag-class>com.struts.extend.tag.date.DateTag</tag-class>
		<body-content>empty</body-content>
		<description></description>
		<attribute>
			<name>name</name>
			<required>true</required>
			<rtexprvalue>false</rtexprvalue>
			<description><![CDATA[input日期的名字,該屬性必須有,作為傳遞參數名稱使用]]></description>
		</attribute>
		<attribute>
			<name>id</name>
			<required>true</required>
			<rtexprvalue>false</rtexprvalue>
			<description><![CDATA[該屬性必須有,作為元件辨別使用,如果沒有意義,則可是使用name相同的值]]></description>
		</attribute>
		...
	</tag>
</taglib>
      

        其中<attribute>為标簽的傳入參數,<tag-class>表示标簽動态生成的java類,該類需要繼承AbstractUITag或者其父類ComponentTagSupport,實作以下方法:

public Component getBean(ValueStack vs, HttpServletRequest res, HttpServletResponse req)
{
	return new Date(vs, res, req);
}
//實體類設定參數
protected void populateParams()
{
        Date date = (Date) this.component;
	date.setId(this.id);
	date.setName(this.name);
}
           

       其中Date為具體的實體類,需要繼承org.apache.struts2.components.UIBean,實作以下方法:

public Date(ValueStack stack, HttpServletRequest request, HttpServletResponse response)
{
	super(stack, request, response);
}
//模闆的名稱
protected String getDefaultTemplate()
{
	return "date";
}
//參數初始化
public void evaluateParams()
{
	super.evaluateParams();
	if (this.id != null)
	{
		addParameter("id", findString(this.id));
	}
	addParameter("name", findString(this.name));
}
           

        最後,就是具體的模闆了,模闆要放置在“項目/template”檔案夾的simple或者xhtml中,LZ使用的ftl作為模闆,名稱date.ftl,ftl的文法不做贅述,樣例如下:

<input<#rt/>
 id="${parameters.id}" name="${parameters.name}"  type="text" <#rt/>
/><#rt/>
           

         上述模闆的類型,檔案目錄和類型可在strtus.propertis或者strtus.xml中配置:

### Standard UI theme
### Change this to reflect which path should be used for JSP control tag templates by default
struts.ui.theme=xhtml
struts.ui.templateDir=template
#sets the default template type. Either ftl, vm, or jsp
struts.ui.templateSuffix=ftl      

       好了,最後看看做好的标簽怎麼使用呢,就這麼簡單

<f:date name="test" id="test"/>
           

       整個struts請求到jsp頁面到最終渲染成html靜态頁面的過程如上述,過程稍顯繁雜,但熟悉之後會發現封裝性還是很好的,模闆中可以和其他js進行關聯,待靜态頁面生成後效果顯現。