jsp自定义标签的优势体现在于jsp页面上面减少了java代码.
jsp自定义标签有三大部分组成,首先是类继承TagSupport,实现doStartTag方法.
public int doStartTag() throws JspException { log.info("partsMgrService:" + partsMgrService); log.info("Log style: " + style); log.info("Log rowid: " + rowid); StringBuffer html = new StringBuffer(); List li = partsMgrService.listTreePartsType(); for (int i = 0; i < li.size(); i++) { PartsTypeDTO dto = (PartsTypeDTO) li.get(i); if (style.equals("header") || style == "header") { styleHeaderJsp(html, dto); } else if (style.equals("mall") || style == "mall") { styleMallJsp(i, html, dto); } } log.info("html:" + html.toString()); JspWriter out = pageContext.getOut(); try { out.print(html.toString()); } catch (IOException e) { e.printStackTrace(); } return Tag.SKIP_BODY; }
如果存在属性,需要提供get,set方法。另外一个是tag中的Service对象不能依赖注入。需要使用getBean()方法获取。
第二步,创建tld文件。
<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.0" 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 web-jsptaglibrary_2_0.xsd"> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <tag> <name>show</name> <tag-class>com.bn.car.core.tag.PartsTypeTag</tag-class> <body-content>empty</body-content> <attribute> <name>style</name> <!-- 属性名字 --> <required>false</required> <!-- 是否必须 --> <rtexprvalue>true</rtexprvalue> <!-- 表示是否可以使用JSP表达式 --> </attribute> <attribute> <name>rowid</name> <!-- 属性名字 --> <required>false</required> <!-- 是否必须 --> <rtexprvalue>true</rtexprvalue> <!-- 表示是否可以使用JSP表达式 --> </attribute> </tag> </taglib>
第三步,在jsp页面上引用。
<%@ taglib uri="/WEB-INF/tld/partstypetag.tld" prefix="dd"%> <dd:show style="mall" rowid="<%=_ul %>"/>
允许动态传参。需要在tld文件中配置rtexprvalue项。
需要的jar: jstl.jar,servlet.jar,standard.jar lib包。更多详细代码请看以下链接:
http://developer.51cto.com/art/200907/134263.htm
(文章写的挺好,但是在tld配置文件中出现了requried,rtexprvale 写法错误! 有误导,正确的写法应该是 required, rtexprvalue)