标签库的作用和EL表达式的作用差不多,尽量减少jsp页面上的java代码量。
客户化JSP标签技术是在JSP1.1版本中才出现的,它支持用户在JSP文件中自定义标签,这样可以是JSP代码更加简洁。
这些可重用的标签能处理复杂的逻辑运算和事务,或者定义JSP网页的输出内容和格式。
[color=red]创建客户化(自定义)JSP标签的步骤:
1、 创建标签的处理类。
2、 创建标签库描述文件。
3、 在JSP文件中引入标签库,然后插入标签,例如:<mm:hello/>[/color]
Servlet容器编译JSP网页时,如果遇到自定义标签,就会调用这个标签的处理类。
标签处理类必须扩展以下两个类之一:
--javax.servlet.jsp.tagext.TagSupport
--javax.servlet.jsp.tagext.BodyTagSupport
标签处理类(器)都需要扩展以上两个类中的一个,然后重写里面的一些方法即可。
其中两个最重要的方法:
Pulbic int doStartTag()…..:默认的开始标签的处理,返回一个int型的SKIP_BODY。
Pulbic int doEndTag()…..:结束标签的默认处理,返回一个int型的EVAL_PAGE。
总结:
doStartTag:Servlet容器遇到自定义标签的起始标志时调用该方法。
doEndTag:Servlet容器遇到自定义标签的结束标志时调用该方法。
TagSupport类的其它的一些方法:
setValue(String k,Object o):在标签处理类中设置key/value
getValue(String k):在标签处理类中根据参数key返回匹配的value
removeValue(String k,):在标签处理类中出key/value
setPageContext(PageContext pc):设置PageContext对象,该方法由Servlet容器在调用doStartTag或doEndTag方法前调用
setParent(Tag t):设置嵌套了当前标签的上层标签的处理类,该方法由Servlet容器在调用doStartTag或doEndTag方法前调用。
getParent():返回嵌套了当前标签的上层标签的处理类。
JSP容器在调用doStartTag或doEndTag方法前,会先调用setPageContext和setParent方法,设置pageContext和parent。
在doStartTag或doEndTag方法中可以通过getParent方法获取上层标签的处理类;在TagSupport类中定义了Protected类型的pageContext成员变量,因此在标签处理类中可以直接访问pageContext变量。
PageContext类提供了保存和访问Web应用的共享数据的方法:
--public void setAttribute(String name,Object value, int scope)
--public Object geAttribute(String name, int scope)
其中,scope参数用来指定属性存在的范围,它的可选值包括:
--PageContext.PAGE_SCOPE
--PageContext.REQUEST_SCOPE
--PageContext.SESSION_SCOPE
--PageContext.APPLIACTION_SCOPE
例如:pageContext.setAttribute(“username”,”zhangsan”, PageContext.SESSION_SCOPE)
当Servlet容器遇到自定义标签的起始标志,就会调用doStartTag()方法。
doStartTag()方法返回一个整数值,用来决定程序的后续流程。它有两个可选值:
--Tag.SKIP_BODY
--Tag.EVAL_BODY_INCLUDE
当Servlet容器遇到自定义标签的结束标志,就会调用doEndTag()方法。
doEndTag()方法也返回一个整数值,用来决定程序后续流程。它有两个可选值:
-- Tag.SKIP_PAGE
--Tag.EVAL _PAGE
Tag.SKIP_PAGE表示立刻停止执行JSP网页,网页上未处理的静态内容和JSP程序均被忽略,任何已有的输出内容立刻返回到客户的浏览器上。
Tag.EVAL _PAGE表示按正常的流程继续执行JSP网页。
在标签中还能包含自定义的属性,例如:
<prefix:mytag username=”zhangsan”>
……
……
</prefix:mytag>
在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法,假定以上username为String类型,可以定义如下方法:
private String username;
public void setUsername(String value){
this.username = value;
}
public String getUsername(){
return username;
}
作用:[color=red]通过设置这些属性的值来去决定标签里面应该怎么处理怎么去执行,标签提供这些属性之后,我在标签处理类里面就能获得这些属性值,根据属性值来决定应该怎么做。 [/color]
作业:定义一个名为mytaglib的标签库,它包含一个简单的hello标签,这个标签能够将JSP页面中所有的<mm:hello/>解析为字符串”hello”。
标签库描述文件的后缀名是tld。而且必须存放在和web.xml存放在同一个目录下,必须在WEB-INF下面。
作业2:创建一个能替换test应用中JSP网页的静态文本的标签,这个标签名为message,它放在mytaglib标签库中。(开发一个项目需要被多个国家的用户同时使用的时候用到这样的情况)
上面两个作业的答案都在附件项目里面
客户化JSP标签技术是在JSP1.1版本中才出现的,它支持用户在JSP文件中自定义标签,这样可以是JSP代码更加简洁。
这些可重用的标签能处理复杂的逻辑运算和事务,或者定义JSP网页的输出内容和格式。
[color=red]创建客户化(自定义)JSP标签的步骤:
1、 创建标签的处理类。
2、 创建标签库描述文件。
3、 在JSP文件中引入标签库,然后插入标签,例如:<mm:hello/>[/color]
Servlet容器编译JSP网页时,如果遇到自定义标签,就会调用这个标签的处理类。
标签处理类必须扩展以下两个类之一:
--javax.servlet.jsp.tagext.TagSupport
--javax.servlet.jsp.tagext.BodyTagSupport
标签处理类(器)都需要扩展以上两个类中的一个,然后重写里面的一些方法即可。
其中两个最重要的方法:
Pulbic int doStartTag()…..:默认的开始标签的处理,返回一个int型的SKIP_BODY。
Pulbic int doEndTag()…..:结束标签的默认处理,返回一个int型的EVAL_PAGE。
总结:
doStartTag:Servlet容器遇到自定义标签的起始标志时调用该方法。
doEndTag:Servlet容器遇到自定义标签的结束标志时调用该方法。
TagSupport类的其它的一些方法:
setValue(String k,Object o):在标签处理类中设置key/value
getValue(String k):在标签处理类中根据参数key返回匹配的value
removeValue(String k,):在标签处理类中出key/value
setPageContext(PageContext pc):设置PageContext对象,该方法由Servlet容器在调用doStartTag或doEndTag方法前调用
setParent(Tag t):设置嵌套了当前标签的上层标签的处理类,该方法由Servlet容器在调用doStartTag或doEndTag方法前调用。
getParent():返回嵌套了当前标签的上层标签的处理类。
JSP容器在调用doStartTag或doEndTag方法前,会先调用setPageContext和setParent方法,设置pageContext和parent。
在doStartTag或doEndTag方法中可以通过getParent方法获取上层标签的处理类;在TagSupport类中定义了Protected类型的pageContext成员变量,因此在标签处理类中可以直接访问pageContext变量。
PageContext类提供了保存和访问Web应用的共享数据的方法:
--public void setAttribute(String name,Object value, int scope)
--public Object geAttribute(String name, int scope)
其中,scope参数用来指定属性存在的范围,它的可选值包括:
--PageContext.PAGE_SCOPE
--PageContext.REQUEST_SCOPE
--PageContext.SESSION_SCOPE
--PageContext.APPLIACTION_SCOPE
例如:pageContext.setAttribute(“username”,”zhangsan”, PageContext.SESSION_SCOPE)
当Servlet容器遇到自定义标签的起始标志,就会调用doStartTag()方法。
doStartTag()方法返回一个整数值,用来决定程序的后续流程。它有两个可选值:
--Tag.SKIP_BODY
--Tag.EVAL_BODY_INCLUDE
当Servlet容器遇到自定义标签的结束标志,就会调用doEndTag()方法。
doEndTag()方法也返回一个整数值,用来决定程序后续流程。它有两个可选值:
-- Tag.SKIP_PAGE
--Tag.EVAL _PAGE
Tag.SKIP_PAGE表示立刻停止执行JSP网页,网页上未处理的静态内容和JSP程序均被忽略,任何已有的输出内容立刻返回到客户的浏览器上。
Tag.EVAL _PAGE表示按正常的流程继续执行JSP网页。
在标签中还能包含自定义的属性,例如:
<prefix:mytag username=”zhangsan”>
……
……
</prefix:mytag>
在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法,假定以上username为String类型,可以定义如下方法:
private String username;
public void setUsername(String value){
this.username = value;
}
public String getUsername(){
return username;
}
作用:[color=red]通过设置这些属性的值来去决定标签里面应该怎么处理怎么去执行,标签提供这些属性之后,我在标签处理类里面就能获得这些属性值,根据属性值来决定应该怎么做。 [/color]
作业:定义一个名为mytaglib的标签库,它包含一个简单的hello标签,这个标签能够将JSP页面中所有的<mm:hello/>解析为字符串”hello”。
标签库描述文件的后缀名是tld。而且必须存放在和web.xml存放在同一个目录下,必须在WEB-INF下面。
作业2:创建一个能替换test应用中JSP网页的静态文本的标签,这个标签名为message,它放在mytaglib标签库中。(开发一个项目需要被多个国家的用户同时使用的时候用到这样的情况)
上面两个作业的答案都在附件项目里面