自定义标签的作用
(1)自定义JSP标签技术是在JSP 1.1版本中才出现的,它支持用户在JSP文件中自定义标签,这样可以使JSP代码更加简洁。
(2)这些可重用的标签能处理复杂的逻辑运算和事务,或者定义JSP网页的输出内容和格式。
创建自定义标签的步骤
(1)创建标签的处理类
(2)创建标签库描述文件
(3)在JSP文件中引入标签库,然后插入标签,例如:<mm:hello/>
Servlet容器编译JSP网页时,如果遇到自定义标签,就会调用这个标签的处理类。
标签处理类必须扩展以下两个类之一:
–javax.servlet.jsp. tagext .TagSupport
–javax.servlet.jsp. tagext . BodyTagSupport
TagSupport的主要方法
•doStartTag:Servlet容器遇到自定义标签的起始标志时调用该方法
•doEndTag:Servlet容器遇到自定义标签的结束标志时调用该方法
•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():返回嵌套了当前标签的上层标签的处理类
TabSupport类中的两个重要属性
•parent:代表嵌套了当前标签的上层标签的处理类
•pageContext:代表Web应用中的javax.servlet.jsp.PageContext对象
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 getAttribute(String name, int scope)
其中,scope参数用来指定属性存在的范围,它的可选值包括:
–PageContext.PAGE_SCOPE
–PageContext.REQUEST_SCOPE
–PageContext.SESSION_SCOPE
–PageContext.APPLICATION_SCOPE
例如:pageContext.setAttribute(“username”,”zhangsan”, PageContext.SESSION_SCOPE);
doStartTag()方法
当Servlet容器遇到自定义标签的起始标志,就会调用doStartTag()方法。doStartTag()方法返回一个整数值,用来决定程序的后续流程。它有两个可选值:doEndTag()方法
–Tag.SKIP_BODYTag.SKIP_BODY表示标签之间的内容被忽略。
–Tag.EVAL_BODY_INCLUDE
Tag.EVAL_BODY_INCLUDE表示标签之间的内容被正常执行。例如对于以下代码:
<prefix: Mytag> Hello …… …… </prefix:Mytag>假若<Mytag>的doStartTag()方法返回Tag.SKIP_BODY,”Hello”字符串不会显示在网页上;若返回Tag.EVAL_BODY_INCLUDE,“Hello” 字符串将显示在网页上。
当Servlet容器遇到自定义标签的结束标志,就会调用doEndTag()方法。
doEndTag()方法也返回一个整数值,用来决定程序后续流程。它有两个可选值:
–Tag.SKIP_PAGETag.SKIP_PAGE表示立刻停止执行JSP网页,网页上未处理的静态内容和JSP程序均被忽略,任何已有的输出内容立刻返回到客户的浏览器上。
–Tag.EVAL_PAGE
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; }
步骤1:创建标签处理类
public class MyTag extends TagSupport { @Override public int doStartTag() throws JspException { try { pageContext.getOut().print("startTag"); } catch (IOException e) { e.printStackTrace(); } return EVAL_BODY_INCLUDE; } @Override public int doEndTag() throws JspException { try { pageContext.getOut().print("endTag"); } catch (IOException e) { e.printStackTrace(); } return EVAL_PAGE; } }步骤2:创建标签库描述符文件,后缀名为.tld,保存在WEB-INF文件夹下。<?xml version="1.0" encoding="UTF-8" standalone="no"?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> <tlib-version>1</tlib-version> <short-name>m</short-name> <uri>/mytag</uri> <tag> <name>tag</name> <tag-class>com.kqygww.tag.MyTag</tag-class> </tag> </taglib>步骤3:在JSP页面中引入标签并插入标签
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib prefix="m" uri="/mytag"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <m:tag>tag_Test </m:tag> </body> </html>输出
startTag tag_Test endTag
示例2(稍微复杂)
步骤1:创建标签处理类
public class MyTag extends TagSupport { private String key; public String getKey() { return key; } public void setKey(String key) { this.key = key; } @Override public int doEndTag() throws JspException { Properties properties = (Properties) pageContext.getAttribute( "properties", PageContext.APPLICATION_SCOPE); String message = (String)properties.getProperty("test"); try { pageContext.getOut().println(message); } catch (IOException e) { e.printStackTrace(); } return EVAL_PAGE; } }此处要用到一个初始化时加载信息的servlet
public class LoadInfo extends HttpServlet { @Override public void init(ServletConfig config) throws ServletException { Properties properties = new Properties(); try { ServletContext context = config.getServletContext(); InputStream is = context .getResourceAsStream("/WEB-INF/message.properties"); properties.load(is); is.close(); context.setAttribute("properties", properties); } catch (IOException e) { e.printStackTrace(); } } }message.properties的内容是
test=HelloWorld步骤2:创建标签库描述符文件,后缀名为.tld,保存在WEB-INF文件夹下。
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> <tlib-version>1</tlib-version> <short-name>m</short-name> <uri>/mytag</uri> <tag> <name>tag</name> <tag-class>com.kqygww.tag.MyTag</tag-class> <attribute> <name>key</name> <required>true</required> </attribute> </tag> </taglib>步骤3:在JSP页面中引入标签并插入标签
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib prefix="m" uri="/mytag"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <m:tag key="test"></m:tag> </body> </html>输出
Hello World