01-标签简介和开发第一个标签
自定义标签简介
⑴编写一个实现Tag接口的Java类,把页面java代码移到这个java类中(标签处理类。)
⑵编写标签库描述符(tld)文件,在tld文件中对标签处理器类描述成一个标签。(放在WEB-INF下)
例题:使用标签输出客户机IP、
1.jsp
在jsp页面中导入和使用自定义标签
- 您的ip是:<itcast:viewIP/>
1.编写一个实现tag接口的java类
- public class ViewIPTag extends TagSupport {
- @Override
- public int doStartTag() throws JspException {
- HttpServletRequest request =(HttpServletRequest)this.pageContext.getRequest();//返回的是ServletRequest,所以要强转
- JspWriter out = this.pageContext.getOut();
- String ip = request.getRemoteAddr();
- try {
- out.print(ip);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- return super.doStartTag();
- }
- }
2.在tld文件中对标签处理类进行描述(tld文件的位置:WEB-INF下)
tld模版
- <?xml version="1.0" encoding="UTF-8" ?>
- <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
- version="2.0">
- <description>JSTL 1.1 core library</description>
- <display-name>JSTL core</display-name>
- <tlib-version>1.1</tlib-version>
- <short-name>itcast</short-name>
- <uri>http://www.itcast.cn</uri><!--此行填写你自己标签库的uri-->
- <tag>
- <name>viewIP</name>
- <tag-class>cn.itcast.web.tag.ViewIPTag</tag-class>
- <body-content>empty</body-content> <!-- 有无标签体 -->
- </tag>
- </taglib>
02-自定义标签运行原理
(暂空)
03-自定义标签功能概述
Tag接口的执行流程
● jsp引擎将遇到自定义标签时,首先创建标签处理类的实例对象,然后按照
JSP规范定义的通信规则依次调用它的方法。
1、
public void setPageContext(PageContext pageContext),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方法。
自定义标签功能扩展
四.传统标签库功能详解
2.jsp
控制
jsp页面某一部分内容是否执行(继承Tag接口)
使用
Tag的默认实现类TagSupport的doEndTag方法dedoStartTag方法
- public int doStartTag() throws JspException {
- return this.EVAL_BODY_INCLUDE; //显示标签体内容
- return this.SKIP_BODY; //不显示标签体内容
- }
3.jsp用标签体控制整个
jsp是否输出(继承Tag接口,使用Tagd的默认实现类TagSupport)
使用
Tag的默认实现类TagSupport的doEndTag方法
- public int doEndTag() throws JspException {
- // TODO Auto-generated method stub
- return Tag.SKIP_PAGE; //不显示标签结束之后的内容
- return Tag.EVAL_PAGE;//显示标签结束后的内容
- }
4.jsp 使用标签控制页面内容重复执行(此时Tag接口不够用,用继承了Tag接口的IterationTag接口,)
使用
Tag的默认实现类TagSupport的2个方法doStartTag()与doAfterBody()
- public int doStartTag() throws JspException {
- return Tag.EVAL_BODY_INCLUDE;// 先使用doStartTag显示标签体内容
- }
- // 执行完标签体调用次方法
- public int doAfterBody() throws JspException {
- x--;
- if(x>0){
- return IterationTag.EVAL_BODY_AGAIN; //再次执行次方法
- }else{
- return IterationTag.SKIP_BODY; //停止执行次方法
- }
- }
5.jsp
用标签修改jsp页面内容(使用BodyTag接口)
使用BodyTag的默认实现类
BodyTagSupport的doStartTag()方法
①当返回
EVAL_BODY_BUFFERED 时 服务器把标签体作为对象通过setBodyContent ()传递给标签处理器类。
②在
doEndTag()中拿到标签体,修改标签体
- public int doStartTag() throws JspException {
- // TODO Auto-generated method stub
- return BodyTag.EVAL_BODY_BUFFERED;// 服务器把封装到一个类中,传递进来
- }
- @Override
- public int doEndTag() throws JspException {
- BodyContent bc = this.getBodyContent();// 得到标签体
- String content = bc.getString();
- content = content.toUpperCase();
- try {
- this.pageContext.getOut().write(content);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- return Tag.EVAL_PAGE;// 继续显示标签体后的HTML
- }
05-简单标签库功能详解
①setJspBody(JspFragment jspBody);//服务器在调用标签时,调用setJspBody方法,把标签体作为JspFragment对象传入。
②doTag(); //在标签执行时调用doTag方法。执行标签体、如果抛出SkipPageException异常,余下JSP就不会执行。
1.jsp
用简单标签控制是否执行标签提(使用SimpleTag接口的实现类,SimpleTagSupport)
- public void doTag() throws JspException, IOException {
- JspFragment jf = this.getJspBody();
- //如果不标签体,doTag方法为空就行
- jf.invoke(this.getJspContext().getOut());// 输出给浏览器。
- }
2.jsp
迭代标签体(使用SimpleTag接口的实现类,SimpleTagSupport)
- public void doTag() throws JspException, IOException {
- JspFragment jf = this.getJspBody();
- for(int i=0;i<5;i++){
- jf.invoke(null);//同jf.invoke(this.getJspContext().getOut());输出给浏览器。
- }
- }
3.jsp
修改标签体(使用SimpleTag接口的实现类,SimpleTagSupport)
- public void doTag() throws JspException, IOException {
- JspFragment jf = this.getJspBody();
- StringWriter sw = new StringWriter();
- jf.invoke(sw);
- String content = sw.toString().toUpperCase();
- this.getJspContext().getOut().write(content);
- }
4.jsp
控制标签余下的jsp不执行(使用SimpleTag接口的实现类,SimpleTagSupport)
- public void doTag() throws JspException, IOException {
- throw new SkipPageException();
- }
简单标签执行流程图
(暂空)
06-开发带属性的标签
①在标签处理器中添加属性对应的变量与set方法
- private int count;
- public void setCount(int count) {
- this.count = count;
- }
- @Override
- public void doTag() throws JspException, IOException {
- JspFragment jf = this.getJspBody();
- for (int i = 0; i < count; i++) {
- jf.invoke(null);
- }
- }
②在
TLD文件中描述标签的属性
- <tag>
- <name>demo5</name>
- <tag-class>cn.itcast.web.simpletag.SimpleTagDemo5</tag-class>
- <body-content>scriptless</body-content><!-- 简单的标签为空。-->
- <attribute>
- <name>count</name>
- <required>turn</required><!-- 属性是否必须 -->
- <rtexprvalue>true</rtexprvalue><!-- 属性复制时是否可以使用EL表达式 -->
- </attribute>
- </tag>
(待续)
转载于:https://blog.51cto.com/dwt1220/713995