使用XML自定义TAG实战

      Programme 2005-3-8 10:59
  很多字段在显示时需要截取一部分,避免破坏页面布局。之前我一直用js达到这一功能,时间长了发现很多弊端:js对“\”的转义有问题;文本段落换行也会造成js错误;且代码比较难看,要在html里插入很多类似<script>......</script>的代码;在action里实现过于繁琐,因为字段过多;在jsp里用java代码实现那我还用struts干吗?
  于是决定用自定义的tag。

首先定义TLD文件:
在WEB-INF下建立partage.tld,内容如下
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>partage</short-name>
<uri>http://jakarta.apache.org/struts/tags-logic-1.0</uri>
<display-name>Nif partage</display-name>
<description>Nif partage library</description>

<tag>
<name>out</name>
<!-- 这里是自己定义的tag类 -->
<tag-class>com.elite.btb.webapp.taglib.PartageTag</tag-class>
<body-content>empty</body-content>
<!-- 我只需要value和length两个属性 -->
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>length</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>

</taglib>



写对应的tag类Partage.java,内容如下:
package com.elite.btb.webapp.taglib;

import javax.servlet.jsp.tagext.BodyTagSupport;

import org.apache.struts.util.ResponseUtils;
import javax.servlet.jsp.*;
import org.apache.taglibs.standard.tag.el.core.ExpressionUtil;

public class PartageTag extends BodyTagSupport {
public void setvalue(String value) {
this.value = value;
}

public void setLength(int length) {
this.length = length;
}

public String getvalue() {
return value;
}

public int getLength() {
return length;
}

public PartageTag() {
}

private String value;
private int length;

public int doStartTag() throws JspException {
try {
//-- 这里的value通过使用JSTL的c:out来取值,可以取得 ${}的内容。
value = (String) ExpressionUtil.evalNotNull("out", "value", value, Object.class, this, pageContext);
if (value != null || !value.equals("")) {
//-- 对内容进行过滤。
value = ResponseUtils.filter(value);
if (value.length() > length) {
String output = value.substring(0, length) + "...";
ResponseUtils.write(pageContext, output);
return 0;
}
ResponseUtils.write(pageContext, value);
}
}
catch (Exception ex1) {
value = null;
}
return 0;
}
}



在JSP里使用自定义标签partage
首先声明<%@ taglib uri="/WEB-INF/partage.tld" prefix="partage" %>
在需要截取的地方使用标签<partage:out value="${infoList.introText}" length="20"/>
其中${infoList.introText}是我要截取的内容,length是长度,若内容大于长度截取完后会自动在末尾添加“...”。


Tomcat测试通过,感觉自定义tag非常好用,利于代码复用,也不会在jsp里造成杂乱的代码,保持了html的tag风格。:)
标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}