第一个自定义tag <2011-11-30>

来源:互联网 发布:前端如何解析json数据 编辑:程序博客网 时间:2024/05/06 06:02

这是我写的第一个自定义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的源码才可以了,看了之后再来解答上面的问题

原创粉丝点击