1,关于自定义标签的几个重要组成部分:
继承的类:javax.servlet.jsp.tagext.*:TagSupport
一个属性: protected PageContext pageContext
两个方法: public int doStartTag()
public int doEndTag()
三个常量: SKIP_BODY,SKIP_PAGE,EVAL_PAGE
SKIP_PAGE,EVAL_PAGE是doEndTag()方法的返回值
标签库描述文件 (*.tld)
2,流程(工具:eclipse):
1.新建一个web project
2.在项目下新建一个包,包里建类,继承TagSupport
3.完成标签处理类
package demo.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.*;
//需要导入的几个常用的包
@SuppressWarnings(\"serial\")
public class TagDemo extends TagSupport ...{
private int pageSize;//pageSize属性,控制页面显示的个数,并且要生成get和set方法
public int getPageSize() ...{
return pageSize;
}
public void setPageSize(int pageSize) ...{
this.pageSize = pageSize;
}
// public int doEndTag() throws JspException {
// 在这里没有用
// return super.doEndTag();
// }
public int doStartTag() throws JspException ...{
JspWriter out = pageContext.getOut();//用pageContext获取out,他还能获取session等,基本上jsp的内置对象都能获取,非常有用
for (int i=0; i<pageSize; i++) ...{
try ...{
out.println(\"<table>\");
out.println(\"<tr>\");
out.println(\"<td>\"); [Page]
out.println(i);
out.println(\"</td>\");
out.println(\"<td>\");
out.println(i*10);
out.println(\"</td>\");
out.println(\"</tr>\");
out.println(\"</table>\");
} catch (IOException e) ...{
e.printStackTrace();
}
}
return SKIP_BODY;
}
}
1. 标签处理类应该继承自TagSupport类
2. 标签处理类应该覆盖父类的至少一个方法 doStartTag() 或 doEndTag(),如果你覆盖是doStartTag()方法应该返回 SKIP_BODY, 如果你覆盖是doEndTag()方法应该返回 SKIP_PAGE,EVAL_PAGE
3. 充分利用标签处理类的pageContext属性,可以通过该属性获取使用自定义标签的JSP页面的各种对象:
getOut(): 获取JSP页面的输出流 out
getRequest: 获取JSP页面的请求对象 request
getSession: 获取JSP页面的会话对象 session
getServletContext: 获取JSP页面的应用对象 application [Page]
4. 如果我们要完成一个带属性自定义标签,需要在标签处理类声明相关属性