第一個自定義tag

這是我寫的第一個自定義tag,雖然簡單,但是還是很開心
功能       自定義一個標籤,當定義了其中一個屬性                                                                                                                                                                                                                                                                       sys = “true” 的時候,就證明這是系統button,是不允許點擊的,並且這樣的按鈕是不會顯示到頁面上                                                                                     sys=“”的時候,就說明這是一般的 button,可以被點擊                                                                                                                                                                                                                     sys=“false”的時候,用戶是可以看見這個按鈕,但是卻是不可用的

代碼     總的來說就我寫的這個標籤一共牽涉到6個文件:                                                                                                                          

 (1)jsp頁面上(test.jsp)用作測試的代碼                                                                                                                                   

<html>                                                                                                                                                                                                                

 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"  pageEncoding="ISO-8859-1"%>

<%@taglib uri="/struts-tags" prefix="s"%>
<%@taglib uri="/WEB-INF/sunny-tags.tld" prefix="sunny"%>
<body> 
<head>
<title>Insert title here</title>
</head>


<div>
<sunny:myButton  sys=""  /> 
</div>
<br>


<div>
<sunny:myButton  sys="true"  />
</div>
<br>
<div>
<sunny:myButton  sys="false"  />
</div>
</body>
</html>




(2)sunny-tags.tld文件
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" versio n="2.0"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
    <description>Sunny_taglib</description>
    <tlib-version>2.0</tlib-version>
    <short-name>sunny</short-name>
    <uri>/sunny</uri>
<tag>
<name>myButton</name>
<tag-class>com.sunny.base.web.taglib.tagMyButton</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>sys</name>
<required>true</required>
    <rtexprvalue>true</rtexprvalue>
    </attribute>
    </tag>

(3)tagMyButton.java文件
package com.sunny.base.web.taglib;




import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;




import org.apache.struts2.components.Component;
import org.apache.struts2.views.jsp.ui.AbstractUITag;




import com.opensymphony.xwork2.util.ValueStack;
import com.sunny.base.helper.BaseConstants;








@SuppressWarnings("serial")
public class tagMyButton extends AbstractUITag{

private String sys ;

public String getSys() {
return sys;
}
public void setSys(String sys) {
this.sys = sys;
}

@Override
public Component getBean(ValueStack arg0, HttpServletRequest arg1,
HttpServletResponse arg2) {
// TODO Auto-generated method stub
return new CompButton(arg0,arg1,arg2);
}
@Override
protected void populateParams() {
// TODO Auto-generated method stub
super.populateParams();
CompButton btn = (CompButton) component;
btn.setProp1(sys);

}
}
(4) CompButton.java 文件

package com.sunny.base.web.taglib;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.apache.struts2.components.UIBean;
import org.apache.struts2.views.annotations.StrutsTag;


import com.opensymphony.xwork2.util.ValueStack;


@StrutsTag(name = "myButton", tldTagClass = "com.sunny.base.web.taglib.tagMyButton", description = "ButtonForMe")
public class CompButton extends UIBean {
public static final String TEMPLATE_NAME = "myButton.ftl";
private String prop1;




public CompButton(ValueStack stack, HttpServletRequest request,
HttpServletResponse response) {
super(stack, request, response);
}


@Override
protected String getDefaultTemplate() {
return TEMPLATE_NAME;
}


protected void evaluateExtraParams() {
super.evaluateExtraParams();
if (prop1 == null)
prop1 = "";
addParameter("value1", findString(prop1));
}


public String getProp1() {
return prop1;
}


public void setProp1(String prop1) {
this.prop1 = prop1;
}


}
(5) myButton.ftl文件
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />
<label id="myButton"></label>
<div id="buttonParams">
<#if parameters.value1 = ""><button  name="${parameters.value1}" style="width:80px;heigth:15px"/>can use</#if>
<#if parameters.value1 = "false"><button  name="${parameters.value1}" disabled="true" style="width:80px;heigth:15px">disable</button></#if>
<#if parameters.value1 = "true">
<button  name="${parameters.value1}" style="display:none">disappear</button>
</#if>
</div>    
                                                       


(6)/WEB-INF/web.xml中需要添加上下面的話,才能讓jsp頁面讀取到*.ftl中的內容
<servlet>
<servlet-name>sitemesh-freemarker</servlet-name>
<servlet-class>com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet</servlet-class>
<init-param>
 <param-name>TemplatePath</param-name>
 <param-value>/</param-value>
</init-param>
<init-param>
 <param-name>default_encoding</param-name>
 <param-value>ISO-8859-1</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>sitemesh-freemarker</servlet-name>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping>

分析
自定義tag的執行流程大致如下:
(1) 在解析jsp頁面的時候碰到 sunny:myButton 標籤的時候,系統會根據標籤前綴自動去引入的模板文件中進行查找,這裏是
sunny-tags.tld
(2) 進入到sunny-tags.tld中之後,會通過xml解析,找到定義的tag節點,該節點對應的值應該是myBotton,隨後通過tag-class
找打對應的tagMyButton類,進入tagMyButton.java文件中執行
(3) 其實在tagMyButton.java中,主要完成了一件事情,那就是將自己定義中需要的屬性封裝成一個Component bean,供父類調用
(到底是如何調用的,詳情不知道????)
(4) 緊接着,就要去完成最後一步,將我們定義的標籤翻譯成jsp能夠解析的樣式,需要用到myButton.ftl文件,在這個例子中,我
   是通過判斷屬性sys(在代碼裏別設置到了parameters.value1裏面)的值,去決定翻譯成什麼樣的html代碼
總結

其實在這個例子裏面,我還有很多東西沒有搞懂
1.AbstractUITag類中到底是如何調用我tagMyButton類中封裝的bean的,又是如何翻譯成html文件格式
2.在web.xml中定義的sitemesh-freemarker肯定是個servlet,定義這個的目的,絕不是僅僅讓框架讀取到ftl文件這麼簡單
 那它到底都做了什麼呢???
 
 
上面的問題,可能需要我去研究以下struts 2.0的源碼纔可以了,看了之後再來解答上面的問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章