1、新建menu.tld
<?xml version="1.0" encoding="UTF-8"?>
<!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>t</short-name>
<uri>/menu-tags</uri>
<display-name>"自定义标签"</display-name>
<!-- 菜单生成控件 -->
<tag>
<name>menu</name>
<tag-class>com.uu.yy.common.tag.MenuTag</tag-class>
<body-content>JSP</body-content>
<display-name>左侧菜单生成控件</display-name>
<small-icon>111</small-icon>
<description>左侧菜单生成控件可选样式ace,bootstrap</description>
<attribute>
<name>menu</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>菜单信息</description>
</attribute>
</tag>
</taglib>
2.实体
package com.uu.yy.common.tag;
import java.io.IOException;
import java.util.List;
import java.util.Random;
import javax.servlet.ServletContext;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class MenuTag extends TagSupport {
private static final long serialVersionUID = 1L;
protected Menu menu;//菜单
public Menu getMenu() {
return menu;
}
public void setMenu(Menu menu) {
this.menu = menu;
}
public int doStartTag() throws JspTagException {
return EVAL_PAGE;//继续处理页面,让服务器继续执行页面 )
}
public int doEndTag() throws JspTagException {
try {
JspWriter out = this.pageContext.getOut();
//out.print("标签示例");
out.print(menu);
} catch (IOException e) {
e.printStackTrace();
}
return EVAL_PAGE;
}
}
3、jsp中引入
<%@ taglib prefix="t" uri="/menu-tags"%>
4、jsp使用示例
<t:menu></t:menu>
可套入自定义funs函数
<t:menu menu="${fns:getTopMenu()}"></t:menu>
摘要:
标签中静态常量:
EVAL_BODY_INCLUDE:告诉服务器正文的内容,并把这些内容送入输出流
SKIP_BODY:告诉服务器不要处理正文内容
EVAL_PAGE:让服务器继续执行页面
SKIP_PAGE:让服务器不要处理剩余的页面
EVAL_BODY_AGAIN:让服务器继续处理正文内容,只有doAfterBody方法可以返回
EVAL_BODY_BUFFERED:BodyTag接口的字段,在doStartTag()返回
EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回,而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。
他们执行顺序如下:
doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()
doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY,
如果返回EVAL_BODY_INCLUDE则继续执行;
如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行,
而直接执行doEndTag()方法。
setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。
标签体内容执行完后,会调用doAfterBody()方法,此方法可返回EVAL_BODY_TAG, SKIP_BODY, EVAL_PAGE或SKIP_PAGE。
如果返回EVAL_BODY_TAG则会再次设置标签体内容,直到返回SKIP_BODY;
如果返回EVAL_PAGE则标签体执行完后会继续执行JSP页面中接下来的部分;
如果返回SKIP_PAGE,则JSP页面的后续内容将不再执行。