阅读本文之前建议先浏览《Struts2自定义简单标签》,了解Struts2标签的执行流程!
闲话不谈,直接进正题,以一个简单的<a>标签为例
1、在项目src下新建一个com.tag包,com.tag包下建立一个ATag.java类
========================-- start --============================
package com.tag;
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.dwplay.common.tag.uibean.menuTemplate;
import com.opensymphony.xwork2.util.ValueStack;
/**
* Struts2自定义标签
* @author RSun
* @Date 2012-10-27下午05:52:40
*/
public class ATag extends AbstractUITag {
private static final long serialVersionUID = 3056187271821937613L;
/** 链接内容 **/
private String content;
/** 链接地址 */
private String murl;
/** 链接的target **/
private String mtarget;
@Override
public Component getBean(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
return new Auibean(stack, request, response);
}
/** 初始化参数 **/
@Override
protected void populateParams() {
super.populateParams();
Auibean ab = (Auibean) component;
ab.setContent(content);
ab.setMurl(murl);
ab.setMtarget(mtarget);
}
// 以下是set方法
public void setContent(String content) {
this.content = content;
}public void setMurl(String murl) {
this.murl = murl;
}public void setMtarget(String mtarget) {
this.mtarget = mtarget;
}
}
========================-- end --=============================
2、在com.tag包下建立一个uibean包,com.tag.uibean包下建立Auibean.java类
========================-- start --=============================
package com.tag.uibean;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.components.UIBean;
import org.apache.struts2.views.annotations.StrutsTag;
import org.apache.struts2.views.annotations.StrutsTagAttribute;
import com.opensymphony.xwork2.util.ValueStack;
/**
* Struts2自定义标签的UIBean
* @author RSun
* @Date 2012-3-5
*/
//strutsTag注解指明了该UIBean的名字和Tag类的类名和tld文件中的<body-content>yin</body-content>。
@StrutsTag(name="alink", tldBodyContent="yin", tldTagClass="com.tag.ATag", description="这是一个链接的tag")
public class Auibean extends UIBean {
/** freemarker模板文件名字 **/
public static final String TEMPLATE = "alink";
/** 链接内容 **/
private String content;
/** 链接地址 */
private String murl;
/** 链接的target **/
private String mtarget;
public Auibean(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
super(stack, request, response);
}
/**
* 返回UIBean模板的名字 <br>
* Struts2会自动在template.simple目录下面
* 找到 xxx.ftl 的模板文件
*/
@Override
protected String getDefaultTemplate() {
return TEMPLATE;
}
/**
* UIBean初始化后会调用此方法来设置参数 <br>
* addParameter方法,会在freemarker里的parameters里加入一个key value <br>
* 这里要注意findString,还有相关的findxxxx方法,它们是已经封装好了
* 的解释ognl语法的工具,具体是怎么样的,大家可以查看一下UIBean的api doc。
*/
@Override
protected void evaluateExtraParams() {
super.evaluateExtraParams();
if (null != content) {
addParameter("content", findString(content));
}
if(null != murl){
addParameter("murl", findString(murl));
}
if(null != mtarget){
addParameter("mtarget", mtarget);
}
}
/**
* 设置UIBean的属性 <br>
* 注解type="String"说明该属性是字符串(也可以是其它)
* @param content
*/
@StrutsTagAttribute(description="set content", type="String", defaultValue="true")
public void setContent(String content) {
this.content = content;
}
@StrutsTagAttribute(description="set murl", type="String", defaultValue="true")
public void setMurl(String murl) {
this.murl = murl;
}
@StrutsTagAttribute(description="set mtarget", type="String", defaultValue="true")
public void setMtarget(String mtarget) {
this.mtarget = mtarget;
}
}
========================-- end --=============================
3、同样src下建立template.simple包,也就是template包下面建立simple包,然后新建文件alink.ftl
========================-- start--=============================
<a href="${parameters.murl}" target="${parameters.mtarget}">${parameters.content}</a>
以上就是ftl文件的内容,注意不能有空格
========================-- end --=============================
4、在WEB-INF下新建tld文件RSun-tags.tld,内部实现如下:
========================-- start --===========================
<?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"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>struts2_tags_test</description>
<tlib-version>2.0</tlib-version>
<short-name>RSun</short-name>
<uri>/RSun-tags</uri> <!-- 页面引用tld名称 -->
<!-- 关联tag类相关配置 -->
<tag>
<description><![CDATA[struts2结合freemarker自定义标签]]></description>
<name>alink</name>
<tag-class>com.tag.ATag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>content</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>murl</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>mtarget</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<dynamic-attributes>false</dynamic-attributes>
</tag>
</taglib>
==========================-- end--============================
4、相关配置已实现,下面看jsp页面引用示例
同样需要引入:<%@ taglib uri="/RSun-tags" prefix="st" %>
然后页面调用:<st:alink content="点击看看效果" murl="http://write.blog.csdn.net/postedit/8176633" mtarget="_blank" />
结果示例:页面显示 <a href="http://write.blog.csdn.net/postedit/8176633" target="_blank">点击看看效果</a>
下面介绍执行流程:
整个标签包含4个部分,tag类、tag的uibean、ftl文件和tld定义文件
页面使用标签时,会根据tld文件,找到<name>alink</name>
然后<name>alink</name>声明找到对应的类ATag.java
在ATag初始化参数方法执行时,会给Auibean赋值
在Auibean执行过程中会调用关联的ftl文件解析显示
提示:对于WEB下面中比较常用的显示模块,可以使用xml传数据到自定义标签解析后统一显示,这样可以简化前端的繁杂操作,同时也可以加快访问速度。可以再ftl文件里面控制显示样式