struts2 标签的使用
struts2 标签的使用
Struts2中实现自定义标签很简单,主要分为3步:
1.创建taglib文件(.tld),编写标签声明。
2.编写自定义标签类。
3.在页面中使用标签。
下面以一个自定义的分页标签为例,进行说明。
其实,开发自定义标签并不需要Struts2的支持,一般情况下,只需要继承javax.servlet.jsp.tagext.BodyTagSupport类,重写doStartTag,doEndTag等方法即可。这里在实现自定义标签时,继承的2个类分别是org.apache.struts2.views.jsp.ComponentTagSupport和org.apache.struts2.components.Component,ComponentTagSupport实际上是对BodyTagSupport的一次封装,看一下ComponentTagSupport类的继承关系就明了了:
Java代码
1.java.lang.Object
2. extended by javax.servlet.jsp.tagext.TagSupport
3. extended by javax.servlet.jsp.tagext.BodyTagSupport
4. extended by org.apache.struts2.views.jsp.StrutsBodyTagSupport
5. extended by org.apache.struts2.views.jsp.ComponentTagSupport
继承ComponentTagSupport类是为了获得标签中的属性值,并包装成Component对象。继承Component类是为了从Struts2中的ValueStack中获得相对应的值。
1. 创建taglib文件.microblog.tld 文件: (是否在其他配置文件中引用??项目自动找寻tld文件??)
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>microblog tags</short-name>
<uri>/microblog-tags</uri>
<display-name>microblog taglib</display-name>
<!-- 页面头部用户信息 -->
<tag>
<name>headuserinfo</name>
<tag-class>com.people.t.web.tag.HeadUserInfoTag</tag-class>
<body-content>empty</body-content>
<!-- 也可以只用以上部分,attrubute看情况 -->
<attribute>
<name>userIdVar</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue> //表示该自定义标签的某属性的值可以直接指定或者通过动态计算指定
</attribute>
<attribute>
<name>defaultUserIdVar</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>indexVar</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
2. 编写自定义标签类:HeadUserInfoTag.java类:
//ComponentTagSupport为struts2包中的类
public class HeadUserInfoTag extends ComponentTagSupport {
private String userIdVar;
private String defaultUserIdVar;
private String indexVar;
@Override
public Component getBean(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
return new HeadUserInfo(stack, request, response);
}
@Override
protected void populateParams() {
super.populateParams();
HeadUserInfo headInfo = (HeadUserInfo)component;
// component 为继承类中的参数。
headInfo.setUserIdVar(userIdVar);
headInfo.setDefaultUserIdVar(defaultUserIdVar);
headInfo.setIndexVar(indexVar);
}
//省略getter,setter方法。
}
3。编写自定义标签类:HeadUserInfo.java类:
//Component为struts2包中的类
public class HeadUserInfo extends Component {
private String userIdVar;
private String defaultUserIdVar;
private String indexVar;
//request,response必须
private HttpServletRequest request;
private HttpServletResponse response;
public HeadUserInfo(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
super(stack);
this.request = request;
this.response = response;
}
@Override
public boolean end(Writer writer, String body) {
StringBuilder html = new StringBuilder();
String contextPath = request.getContextPath();
try{
//获得数据
Integer userId = (Integer)stack.findValue(userIdVar);
Integer defaultUserId = (Integer)stack.findValue(defaultUserIdVar);
Integer index = (Integer)stack.findValue(indexVar);
//逻辑。。。。
//组织到变量html中,最后输出此string
writer.write(html.toString());
}catch(Exception e){
logger.error("页面头部用户信息" + e.getMessage());
}
return true;
}
//省略getter,setter方法。
}
4. 在页面中使用标签:jsp中使用
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="m" uri="/microblog-tags"%>
直接使用:<m:headuserinfo userIdVar="userId" defaultUserIdVar="cookieUid" indexVar="index"/>