自定义标签
移除jsp页面中的java代码
创建步骤:
(1) 标签处理器-----java类,直接或间接的实现专门的tag接口
(2) 编写一个名字为 .tld 标签库描述符文件
(3) 在jsp页面中使用自定义标签
<dhw:viewIP>等价于<%String ip=request.getRemoteAddr out.println(ip); %>
Tag接口的执行流程
Jsp引擎将遇到自定义标签时,首先创建标签的实例对象,然后按照jsp规范定义的通信规则一次调用他的方法
1、 public void setPageContext(PageContext pc),jsp引擎实例化标签处理器后,将调用setPageContext方法将jsp页面的pageContext对象与jsp页面进行通信
2、 public void detParent(Tag t),setPageContext方法执行完后,web容器接着调用的setParent()方法将当前父标签传递给当前标签处理器,如果当前没有父标签,则传递给setParent方法的参数值为null
3、 public int doStartTag(),调用了setPageContext方法和setParent方法之后,web容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag方法
4、 pubic int doEndTag(),web容器执行玩自定义标签体后,就会接着去执行自定义
标签的结束标记,此时,web容器回去调用标签处理器的doEndTag()方法
5、public void release(),通常web容器执行完自定义标签后,标签处理器灰主流在内存中,为其他请求服务器,直至停止web应用时,web容器才会调用release方法
自定义标签功能扩展
控制jsp页面中的某一段部分是否执行
通过doStartTag()的返回值决定是否处理处理标签体的内容
控制标签后的jsp页面是否执行
通过doEndTag()的返回值决定是否继续处理jsp页面中自定义的标签
控制jsp页面中的某一部分是否重复执行
通过Interation接口中的doAfterBody()的返回值可以决定jsp页面中的某一部分是否要重复执行标签体的内容
修改jsp页面内容输出
BodyTagSupport类中的方法getContext()方法可以存储标签体内容进行修改
使用到的接口、类的层次
JspTag接口《------Tag接口《------interationTag接口《--------BodyTag接口
| |《---TagSupport类 |《----BodyTagSupport
|--------------------》|
|
|《---SimpleTag接口《-----SimpleTagSupport
SimpleTag方法
setJspContext方法:用于把jsp页面的pageContext对象传递给标签处理器对象
setParent方法:用于把父标签处理器对象传递给当前的标签处理器对象
getParent方法:用于获得当前标签的父标签处理器对象
setJspBody方法:用于把代表标签体的jspFragment对象关于传递给标签处理器对象
dotage方法:用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容等。在doTag方法中可以跑出javax.servlet.jsp.SkipPageException异常,用于通知web容器不再执行jsp页面中位于结束标记后面的内容,这等效于传统标签的doEndTag方法返回Tag.SKIP_PAGE常量的情况
SimpleTag接口方法的执行顺序
·当web容器开始执行标签时,会调用如下的方法完成标签的初始化
Web容器调用标签处理器对象的setJspContext方法,将代表jsp页面的pageContext对传递给标签处理器对象
Web容器调用标签处理器对象的setParent方法,将父标签处理器对象传递给这个标签处理器对象,注意,只有在标签存在的父标签的情况下,web容器才会调用这个方法
如果调用标签时设置了属性,容器将调用每个属性对应的setter方法把属性值传给标签处理器对象。如果标签的属性值是el表达式或者脚本表达式,则web容器首先计算表达式的值,然后把值传递给标签处理器对象
如果简单标签有标签体,容器将调用setJspBody方法把标签体的JsoFragment对象传递过来
·执行标签时:
容器调用标签处理器的doTag()方法,开发人员在方法内通过操作JspFrament对象,就可以直线是否执行、迭代、修改标签体的目的
JspFramgment类
·Javax.servlet.tagext.JspFragment类是在jsp2.0中定义的,他在实例对象代表jsp页面中的一段符合jsp语法规范的jsp片段,这段jsp片段中不能包含jsp脚本元素
·web容器在处理简单标签体时,会把表前提的内容用以JspFragment对象表示,并在调用标签处理器对象的setJspBody方法把JspFragment对象表示,并调用标签处理器对象的setJspBody方法把JspFragment对象传递给标签处理器对象。JspFragment类中只定义了两个方法,如下所示:
getJspContext方法:用于返回代表页面的JspContext对象
public abstract void invoke(java.weiter out)
用于执行JspFragment对象的执行结果写入到哪个输出流对象中,如果传递给参数out的值为null,则将执行结果写入到JspContext.getOut()方法返回的输出流对象中
Invoke方法详解
·JspFragment.invoke方法可以说是JspFragment最重要的方法,利用这个方法可以控制是否执行和输出标签体的内容、是否迭代执行标签体的内容或对标签的执行结果进行修改后再输出
·在标签体中如果没有调用JspFragment方法
·在标签处理器中如果没有重复调用JspFragment.invoke方法,则标签体内容将会被重复执行
·若想在标签处理器中修改标签内容,只需调用invoike方法是指定一个可取出结果数据的输出流对象(例如 String Writer),让标签体的执行结果输出到该输出流对象中,然后从该输出流对象中取出数据进行修改后再输出到目标设备,即可达到修改标签体的目的