笔记121-133

来源:互联网 发布:好的打工软件 编辑:程序博客网 时间:2024/06/05 10:46
121 自定义标签运行原理

当web服务器遇到自定义标签时,首先实例化标签对应的标签处理器类,接着调用setPageContext方法,把页面的pageContext对象传递给标签处理器类。看标签是不有父标签,若有,则把父标签作为一个对象传递给处理器类。完成初始化工作后,服务器就开始执行标签,遇到标签的开始标签后调用相关方法,特别的,若标签内有标签体,一般会执行标签体,遇到标签的结束标签后同样执行相关方法。最后当应用结束后,服务器一般会调用release方法来释放其所占用的内存。想要详细了解其执行过程可以观察由jsp生成的servlet



122 自定义标签功能概述

自定义标签除了要消除页面中的jsp代码外,还可以实现jsp页面中的逻辑输出。比如:判断语句,条件语句,修改语句等功能



123 传统标签库功能详解

doStartTag方法的返回值控制是否执行标签的标签体,所以可以通过控制返回值来控制标签体里面的内容是否输出。返回值为Tag类的静态常量。EVAL_BODY_INCLUDE会执行标签体,SKIP_BODY则不会执行标签体

<body-content>内控制标签内内容类型

doEndTag方法的返回值可以控制是否继续执行jsp页面。Tag.EVAL_PAGE会继续执行,Tag.SKIP_PAGE则会中断jsp解释。

想要使用tag处理器作出循环效果,需要使用IterationTag接口的doAfterBody方法。其方法在方法体执行完后执行,若其返回Tag.eval_BODY_AGAIN则会继续循环。SKIP_BODY则不会继续循环

TagSupport接口中也包含有doAfterBody方法

修改标签体内容时使用EVAL_SCOT_SUFFERED返回值,会将标签体以对象形式返回,在endTag方法中使用getbodycontent可以得到标签体,修改后再将其用out对象输出。需要继承bodyTagSupport类

在jsp2.0以后的版本,可以直接使用simpletag接口来直接作出以上三个功能

例:

import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.tagext.IterationTag;import javax.servlet.jsp.tagext.Tag;import javax.servlet.jsp.tagext.TagSupport;public class IfTag extends TagSupport {    private int time = 5;    private static final long serialVersionUID = 1L;    public int doStartTag() throws JspException {        JspWriter out = this.pageContext.getOut();        try {            out.print(time);        } catch (IOException e) {            e.printStackTrace();        }        return Tag.EVAL_BODY_INCLUDE;      }    public int doAfterBody() throws JspException {        time--;        JspWriter out = this.pageContext.getOut();        try {            out.print(time);        } catch (IOException e) {            e.printStackTrace();        }        if (time != 0) {            time=5;            return IterationTag.EVAL_BODY_AGAIN;        } else {            return IterationTag.SKIP_BODY;        }    }}


tld文件配置:

     <tag>        <name>reprint</name>        <tag-class>tagHandler.ReprintTag</tag-class>        <body-content>scriptless</body-content>    </tag>

<tldlib>中的uri标签设置在jsp文件中引用时需要设置的uri



124 简单标签库功能详解

简单标签库中统一使用doTag来调用标签,在执行之前使用setJspBody方法传入标签体jspFragment对象。其默认实现类为simpletagsupport。可以使用对象的invoke(this.getjspcontext.getout)来执行其标签体,该方法将jspFrame写入流式中。jspcontent中应填入scriptless,声明其中为无脚本的jsp代码。使用this.getJspBody()方法来得到jspFramement对象。

简单标签的生命周期:当遇到简单标签时,首先实例化标签处理器类。之后调用setjspcontext,反页面pagecontext和jspframement传递给标签处理器类,紧接着也将父节点传递进入。然后调用dotag方法执行标签。在标签执行完成后立刻销毁
 
simpletag中主要有dotag,getparent,setjspbody,setjspcontext,setparent等方法

例:

public class ReprintTag extends SimpleTagSupport{    public void doTag(){        for(int i=0;i<3;i++){            JspWriter out=this.getJspContext().getOut();            JspFragment context=this.getJspBody();            try {                StringWriter sw=new StringWriter();                context.invoke(sw);                System.out.println(sw.toString());                String s=sw.toString();                out.write(s);            } catch (JspException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }        }    }}



125 开发带属性的标签

要想一个自定义标签具有属性,通常需要完成两个任务:
1.在标签处理器中编写每个属性民对应的setter方法
2.在tld文件中描述标签的属性

<attribute>中name标签用于指定属性名称,required指定是否必须。rtexprvalue指定是否其内部支持脚本表达式。

例:

public class ReprintTag extends SimpleTagSupport{    private int count;    private String value;      public void setCount(int count) {        this.count = count;    }    public void setValue(String value) {        this.value = value;    }    public void doTag(){        for(int i=0;i<count;i++){            JspWriter out=this.getJspContext().getOut();            try {                out.write(value);            } catch (IOException e) {                e.printStackTrace();            }        }    }}

属性配置:

<attribute>        <name>count</name>        <required>true</required>        <rtexprvalue>true</rtexprvalue></attribute>



133 sun公司的jstl标签库

jsp五类标签,核心标签库,数据库标签,xml标签,jstl函数标签。因为数据处理因放在servlet中处理,所以不推荐使用数据库标签和xml标签。


<c:out value=""/>可以在里面填入el表达式
<c:set value="" var="" scope=""/> <c:set value="" target="" property=""/>可以在任意域或者javabean内存入值,也可以将其中的值加入标签内
<c:remove var="name"/>用于删除某个变量
<c:if>标签的value内一般存放需要进行条件判断的el表达式,var属性则可以保存test属性判断完后的结果,如果判断成功则执行其标签体
<c:choose><c:when><c:otherwise>联合使用,相当于java中的switch语句
<c:forEach>用于遍历集合对象
<c:forToken>用于jsp中的字符串处理,其中,items属性用于存放需要遍历的字符串,delims属性可以去掉指定的分隔符,var为循环中使用的临时变量。如果在字符串中没有找到指定的分隔符,则把整个字符串做为一个对象传入。state属性存入了循环的一些特征量
<c:import>用于引用指定的uri数据,var可以保存引入的string格式。根目录为应用程序根目录。一般需要用<c:catch>包括在内
<c:redirect>重定向,根目录为应用程序根目录。可以使用<c:param>传入参数
0 0
原创粉丝点击