Taglib学习笔记

来源:互联网 发布:内存优化 编辑:程序博客网 时间:2024/06/15 20:04

一、概要:

1、JSP标签技术始于JSP1.1

2、作用:代码复用;JSP页面简洁

3、四个步骤:
    A、创建实现标签功能的JAVA类(Bean或Servlet)
    B、创建标签库的描述文件 
    C、web.xml中添加标签库说明
    D、JSP页面中添加标签库说明,及使用标签

4、标签可以访问的数据范围类型:application;session;request;page.
------------------------[主要是为了说明什么时候用JavaBean或TagLib]
二、TagLib常用知识点

1、JSP Tag API----标签处理类必须是此API[只两种,且任一种即可]的子类
-----javax.servlet.jsp.TagSupport
-----javax.servlet.jsp.BodyTagSupport

2、TagSupport的主要方法[8种]及重要属性[2个]
    1)主要方法:
      与Servlet容器处理TAG开关相关的方法:
      A、doStartTag()---Servlet容器遇到自定义标签的起始标志时调用该方法
      B、doEndTag()----Servlet容器遇到自定义标签的结束结志时调用该方法

     与标签处理类中值相关的方法:
      C、setValue(String k,Object o)---在标签处理类中设置key/value
      D、getValue(String k)--------------在标签处理类中根据参数key返回相应的value
      E、removeValue(String k)---------删除标签处理类中的相应的key/value 

     与Servlet容器相关,设置页面上下文相关的方法:
     F、setPageContext(PageContext pc)--设置PageContext对象,该方法由Servlet容器
    在调用doStartTag或doEndTag方法前调用

    与标签嵌套相关的方法:
     G、setParent(Tag t)----------------设置嵌套了当前标签的上层标签的处理类,该方法由
    Servlet容器在调用doStartTag或doEndTag方法前调用
    H、getParent()---------------------- 返回嵌套了当前标签的上层标签的处理类

2)重要属性:
A、parent---代表了嵌套了当前标签的上层标签的处理类
B、pageContext----代表了Web应用中的javax.servlet.jsp.PageContext对象
两点说明:
C、Servlet容器在调用doStartTag()或doEndTag()方法前,会先调用
setPageContext()和setParent()方法,调置pageContext和parent.
D、在doStartTag()或doEndTag()方法中可以通过getParent()方法获取上层标签的处理类;
在TagSupport类中定义了protected类型的pageContext成员变量,因此在标签处理类
中可以直接访问pageContext变量。

3、pageContext类的几点说明:
A、pageContext类提供了保存及访问WEB应用共享数据的方法:
---public void setAttribute(String name,Object value,int scope)
---public Object getAttribute(String name,int scope)
B、scope---用来指定数据的作用范围。可选值如下:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext. SESSION_SCOPE
PageContext.APPLICATION_SCOPE
如:setAttribute("userName","dxm",PageContext.SESSION_SCOPE);
二、TagLib常用知识点

4、javax.servlet.jsp.TagSupport的两个基础方法的重申:
---public int doStartTag() throws JspException
---public int doEndTag() throws JspException
1)doStartTag()方法:
A、当servlet容器遇到自定义标签的起始标志,就会调用doStartTag()方法。
B、doStartTag()方法会返回一个整数值,用来决定程序的后续流程。它有两个可选值:
----Tag.SKIP_BODY
表示忽略掉标签之间的内容
----Tag.EVAL_BODY_INCLUDE
表示标签之间的肉容要正常执行
如:
... ...
Dxm,Hello!
... ...
     
若的doStartTag()方法返回Tag.SKIP_BODY,“Dxm,Hello!”字样即不会出现在页
面;若返回Tag.EVAL_BODY_INCLUDE,则页面上显示出"Dxm,Hello!"字样。

2)doEndTag()方法:
A、当servlet容器遇到自定义标签的结束标志,就会自动调用doEndTag()方法
B、doEndTag()方法也会返回一个整数值,用来决定程序的后续流程。它也有两个可选值:
---Tag.SKIP_PAGE
表示立刻停止执行JSP网页,网页上未处理的静态内容和JSP程序均被忽略,任何已有的输出
内容立刻返回到客户的浏览器上。
---Tag.EVAL_PAGE
表示按正常的流程继续执行JSP网页。

5、用户自定义标签属性:
A、标签中可以包含自定义的属性,如:

... ...


B、但标签处理类中应将这个属性做为成员变量来使用,并给出赋值及取值的方法。如:
private String username;
public setUsername(String value){
this.username=value;
}
public String getUsername(){
return username;
}



三、一个简单的范例
1、创建hello标签:定义一个名为mytaglib的标签库,它包含一个简单的hello标签,这个标签能够将
JSP页面中所有的解析为字符串"hello".
A、hello标签的处理类:
public int doEndTag() throws JspException{
try{
pageContext.getOut().print("hello");
}catch(Exception e){
throw new JspTagException(e.getMessage());
}
return EVAL_PAGE;
}
B、创建标签库描述文件:.tld文件存放位置;标签库名,标签名,属性,对应的处理类。

C、web.xml中引入标签库:

... ...

/mytaglib
/WEB-INF/tld/mytaglib.tld

... ...

D、JSP页面中引入标签库说明,并使用标签:

taglib指令中,prefix属性值用作指代mytaglib标签库。

四、另一个标签
1、创建一个能替换helloapp应用中JSP网页的静态文本的标签,这个标签名为message,它放在mytaglib标签库中。
2、在hellowithtag2.jsp文件中使用message标签的代码如下: