1 TagSupport与BodyTagSupport的区别
TagSupport与BodyTagSupport的区别主要是标签处理类是否需要与标签体交互,如果不需要交互的就用TagSupport,否则如果不需要交互就用BodyTagSupport。
交互就是标签处理类是否要读取标签体的内容和改变标签体返回的内容。
2 doStartTag(),doEndTag()
doStartTag()方法是遇到标签开始时会呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE与SKIP_BODY,前者表示将显示标签间的文字,后者表示不显示标签间的文字;doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的返回值是EVAL_PAGE与SKIP_PAGE,前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页
预定的处理顺序是:doStartTag()返回SKIP_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE.
如果继承了TagSupport之后,如果没有改写任何的方法,标签处理的执行顺序是:
doStartTag() ->不显示文字 ->doEndTag()->执行接下来的网页
如果您改写了doStartTag(),则必须指定返回值,如果指定了EVAL_BODY_INCLUDE,则执行顺序是
doStartTag()->显示文字->doAfterBodyTag()->doEndTag()->执行下面的网页
java代码示例如下:
package com.huanlv.app.util.platform.tags;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import com.huanlv.app.dao.SysUserDao;
import com.huanlv.app.entity.vo.LoginUser;
import com.huanlv.app.util.StaticVar;
import com.huanlv.util.SpringConfigTool;
@SuppressWarnings("serial")
public class JcdfAuthTag extends TagSupport {
/**权限编码*/
private String code;
private SysUserDao sysUserDao=(SysUserDao)SpringConfigTool.getBean("sysUserDao");
@SuppressWarnings("static-access")
@Override
public int doStartTag() throws JspException {
Object user = pageContext.getSession().getAttribute(StaticVar.LOGIN_USER_KEY);
if (null != user) {
LoginUser loginUser = (LoginUser)user;
//如果是超级管理员,则默认放行
if (StaticVar.USER_TYPE_OF_SUPER_USER == loginUser.getUserType()) {
return this.EVAL_BODY_INCLUDE;
//普通用户进行权限校验
} else {
List<String> menuCodes =sysUserDao.queryUserMenuCode(loginUser.getUserId());//(List<String>)JedisOpExecuter.getSingleObject(StaticVar.REDIS_MENU_CODE_KEY_PREFIX+loginUser.getUserId());
if(null != code && menuCodes.contains(code)) {
return this.EVAL_BODY_INCLUDE;
}
}
}
return this.SKIP_BODY;
}
@Override
public int doAfterBody() throws JspException {
return super.doAfterBody();
}
@Override
public int doEndTag() throws JspException {
return super.doEndTag();
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
/WEB-INF之下的.tld如下:
<?xml version="1.0" encoding="UTF-8"?>
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<tag>
<name>upload</name>
<tagclass>com.huanlv.app.util.platform.tags.JcdfUploadTag</tagclass>
<bodycontent>jsp</bodycontent>
<!-- 定义属性 -->
<attribute>
<name>messageDiv</name> <!-- 属性名字 -->
<type>String</type> <!-- 属性类型 -->
<requried>false</requried> <!-- 是否必须 -->
<rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表达式 -->
</attribute>
<!-- 定义属性 -->
<attribute>
<name>localFile</name> <!-- 属性名字 -->
<type>String</type> <!-- 属性类型 -->
<requried>false</requried> <!-- 是否必须 -->
<rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表达式 -->
</attribute>
</tag>
<!-- 系统权限标签 -->
<tag>
<name>auth</name><!-- 标签名称 -->
<tagclass>com.huanlv.app.util.platform.tags.JcdfAuthTag</tagclass><!-- 标签对应的业务处理类 -->
<bodycontent>jsp</bodycontent><!-- jsp:接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指令和动作,empty:空标记,即起始标记和结束标记之间没有内容。 -->
<!-- 定义属性 -->
<attribute>
<name>code</name> <!-- 属性名字 -->
<type>String</type> <!-- 属性类型 -->
<requried>true</requried> <!-- 是否必须 -->
<rtexprvale>false</rtexprvale> <!-- 是否可以使用JSP表达式(el),false:表示仅支持写死的值 -->
</attribute>
</tag>
</taglib>