标签:自定义标签库 标签 标签库 tag tagsupport
1、public void setPageContext(PageContext pc),JSP引擎实例化标签处理器后,将调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器,标签处理器以后可以通过这个pageContext对象与JSP页面进行通信。
2、public void setParent(Tag t),setPageContext方法执行完后,WEB容器接着调用的setParent方法将当前标签的父标签传递给当前标签处理器,如果当前标签没有父标签,则传递给setParent方法的参数值为null。
3、public int doStartTag(),调用了setPageContext方法和setParent方法之后,WEB容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag方法。
4、public int doEndTag(),WEB容器执行完自定义标签的标签体后,就会接着去执行自定义标签的结束标记,此时,WEB容器会去调用标签处理器的doEndTag方法。
5、public void release(),通常WEB容器执行完自定义标签后,标签处理器会驻留在内存中,为其它请求服务器,直至停止web应用时,web容器才会调用release方法。
public class Demo1 extends TagSupport { // 如何控制是否执行 // EVAL_BODY_INCLUDE 想执行标签体 // SKIP_BODY 不想执行标签体 @Override public int doStartTag() throws JspException { // TODO Auto-generated method stub return SKIP_BODY; }
public class Demo2 extends TagSupport { // 控制标签后内容 // EVAL_PAGE 执行后面内容 // SKIP_PAGE 不执行后面内容 @Override public int doEndTag() throws JspException { return SKIP_PAGE; } }
times--;
if (times > 0) {
return EVAL_BODY_AGAIN;
}else {
return SKIP_BODY;
}
public class Demo3 extends TagSupport { private int times = 10; // 执行标签体内容 @Override public int doStartTag() throws JspException { return EVAL_BODY_INCLUDE; } // 重复标签体 // EVAL_BODY_AGAIN 重复执行标签体 // SKIP_BODY 继续执行 ---- doEndTag @Override public int doAfterBody() throws JspException { if (times > 1) { times--; return EVAL_BODY_AGAIN; } else { times = 10; return SKIP_BODY; } } }
public class Demo4 extends BodyTagSupport { // 改变标签体内容 // 将标签体内容输出到缓存中 @Override public int doStartTag() throws JspException { return EVAL_BODY_BUFFERED; } // 取出缓存中标签体内容 // 转换成大写输出 @Override public int doEndTag() throws JspException { // 从缓存取出标签体内容 BodyContent bodyContent = getBodyContent(); String content = bodyContent.getString(); content = content.toUpperCase(); // 输出 try { pageContext.getOut().println(content); } catch (IOException e) { e.printStackTrace(); } return super.doEndTag(); } }
元素名 |
是否必须指定 |
描 述 |
description |
否 |
用于指定属性的描述信息。 |
name |
是 |
用于指定属性的名称。属性名称是大小写敏感的,并且不能以jsp、_jsp、java和sun开头。 |
required |
否 |
用于指定在JSP页面中调用自定义标签时是否必须设置这个属性。其取值包括true和false,默认值为false,true表示必须设置,否则可以设置也可以不设置该属性。 |
rtexprvalue |
否 |
rtexprvalue是runtime expression value(运行时表达式)的英文简写,用于指定属性值是一个静态值或动态值。其取值包括true和false,默认值为false,false表示只能为该属性指定静态文本值,例如"123";true表示可以为该属性指定一个JSP动态元素,动态元素的结果作为属性值,例如JSP表达式<%=value %>。 |
type |
否 |
用于指定属性值的Java类型。 |
public class Demo5 extends TagSupport { private int times; // 一定注意:成员变量名称要和属性一致 // 必须存在set方法 public void setTimes(int times) { this.times = times; } // 先执行 setTimes 再执行 doStartTag @Override public int doStartTag() throws JspException { return EVAL_BODY_INCLUDE; } @Override public int doAfterBody() throws JspException { if (times > 1) { times--; return EVAL_BODY_AGAIN; } else { return SKIP_BODY; } } }
public class Demo1 extends SimpleTagSupport { @Override public void doTag() throws JspException, IOException { // 不执行 什么都不用写 // 执行 // JspFragment fragment = getJspBody(); // 获得标签体内容对象 // 输出页面上 // 获得 pageContext // PageContext pageContext = (PageContext) getJspContext(); // fragment.invoke(pageContext.getOut()); // 简化代码 getJspBody().invoke(null); // 默认写入out流 } }
public class Demo2 extends SimpleTagSupport { @Override public void doTag() throws JspException, IOException { // 剩余页面内容想执行 什么也不用写 // 如果你想剩下页面部分不执行 throw new SkipPageException(); } }
public class Demo3 extends SimpleTagSupport { @Override public void doTag() throws JspException, IOException { for (int i = 0; i < 3; i++) { getJspBody().invoke(null); } } }
public class Demo4 extends SimpleTagSupport { private int times; // 配置tld文件 @Override public void doTag() throws JspException, IOException { // 获得标签体对象 JspFragment fragment = getJspBody(); // 只能调用invoke方法 将标签体内容输出到 指定输出流 StringWriter buffer = new StringWriter(); // 输出流,流方向String缓冲区里 fragment.invoke(buffer); // 将标签体内容写入缓存 // 获得内容 String content = buffer.toString(); // 转换大写 content = content.toUpperCase(); // 输出页面 PageContext pageContext = (PageContext) getJspContext(); pageContext.getOut().println(content); } public void setTimes(int times) { this.times = times; } }
package cn.demo; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyTagSupport; public class HTMLTag extends BodyTagSupport { @Override public int doStartTag() throws JspException { return EVAL_BODY_BUFFERED; // 将 标签体内容存入 缓存里 } @Override public int doEndTag() throws JspException { // 从缓存 获得标签体内容 String content = getBodyContent().getString(); content = filter(content); // 输出内容 JspWriter out = pageContext.getOut(); try { out.println(content); } catch (IOException e) { e.printStackTrace(); } // 控制标签后页面内容是否继续执行 return EVAL_PAGE; } public static String filter(String message) { if (message == null) return (null); char content[] = new char[message.length()]; message.getChars(0, message.length(), content, 0); StringBuffer result = new StringBuffer(content.length + 50); for (int i = 0; i < content.length; i++) { switch (content[i]) { case '<': result.append("<"); break; case '>': result.append(">"); break; case '&': result.append("&"); break; case '"': result.append("""); break; default: result.append(content[i]); } } return (result.toString()); } }tld配置:
package cn.demo; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; // 防止盗链 本质控制标签后页面是否继续执行 demo2 public class RefererTag extends TagSupport { @Override public int doEndTag() throws JspException { // 获得request对象和out对象 HttpServletRequest request = (HttpServletRequest) pageContext .getRequest(); JspWriter out = pageContext.getOut(); // 判断referer String referer = request.getHeader("referer"); // 什么情况是盗链 referer == null || referer不是以当前资源网站路径开始 String currentURL = request.getRequestURL().toString(); String currentURI = request.getRequestURI(); String currentPath = currentURI.substring(request.getContextPath() .length()); // URL截掉currentPath String prefix = currentURL.substring(0, currentURL .lastIndexOf(currentPath)); if (referer == null || !referer.startsWith(prefix)) { // 盗链 try { out.println("你当前的请求是盗链!"); } catch (IOException e) { e.printStackTrace(); } // 接下来页面不需要执行 return SKIP_PAGE; } else { // 不是盗链,执行接下来页面 return EVAL_PAGE; } } }tld配置:
标签:自定义标签库 标签 标签库 tag tagsupport
原文地址:http://blog.csdn.net/qhwc2009/article/details/45825293