标签:自定义标签库 标签 标签库 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