客户化JSP标签n教学目标n理解客户化JSP标签的作用n了解JSPTagAPIn掌握创建并运用客户化JSP标签的步骤n掌握在客户化JSP标签中访问application、session、request和page范围内的共享数据的方法。PDF文件使用pdfFactory试用版本创建版本中才出现的,它支持用户在JSP文件中自定义标签,这样可以使JSP代码更加简洁。n这些可重用的标签能处理复杂的逻辑运算和事务,或者定义JSP网页的输出内容和格式。n参考itemdetail.jspPDF文件使用pdfFactory试用版本创建(1)创建标签的处理类n(2)创建标签库描述文件n(3)在web.xml文件中声明引用的标签n(4)在JSP文件中引入标签库,然后插入标签,例如:mm:hello/PDF文件使用pdfFactory试用版本创建网页时,如果遇到自定义标签,就会调用这个标签的处理类。n标签处理类必须扩展以下两个类之一:njavax.servlet.jsp.TagSupportnjavax.servlet.jsp.BodyTagSupportPDF文件使用pdfFactory试用版本创建(Stringk,Objecto)在标签处理类中设置key/valuengetValue(Stringk)在标签处理类中根据参数key返回匹配的valuenremoveValue(Stringk)在标签处理类中删除key/valuePDF文件使用pdfFactory试用版本创建(PageContextpc)设置PageContext对象,该方法由Servlet容器在调用doStartTag或doEndTag方法前调用nsetParent(Tagt)设置嵌套了当前标签的上层标签的处理类,该方法由Servlet容器在调用doStartTag或doEndTag方法前调用ngetParent()返回嵌套了当前标签的上层标签的处理类PDF文件使用pdfFactory试用版本创建:代表嵌套了当前标签的上层标签的处理类npageContext:代表Web应用中的javax.servlet.jsp.PageContext对象PDF文件使用pdfFactory试用版本创建方法前,会先调用setPageContext和setParent方法,设置pageContext和parent。n在doStartTag或doEndTag方法中可以通过getParent方法获取上层标签的处理类;在TagSupport类中定义了protected类型的pageContext成员变量,因此在标签处理类中可以直接访问pageContext变量。PDF文件使用pdfFactory试用版本创建应用的共享数据的方法:npublicvoidsetAttribute(Stringname,Objectvalue,intscope)npublicObjectgetAttribute(Stringname,intscope)PDF文件使用pdfFactory试用版本创建类(续)n其中,scope参数用来指定属性存在的范围,它的可选值包括:nPageContext.PAGE_SCOPEnPageContext.REQUEST_SCOPEnPageContext.SESSION_SCOPEnPageContext.APPLICATION_SCOPEn例如:pageContext.setAttribute(“username”,”weiqin”,PageContext.SESSION_SCOPE);PDF文件使用pdfFactory试用版本创建()throwsJspExceptionnpublicintdoEndTag()throwsJspExceptionPDF文件使用pdfFactory试用版本创建()方法n当Servlet容器遇到自定义标签的起始标志,就会调用doStartTag()方法。ndoStartTag()方法返回一个整数值,用来决定程序的后续流程。它有两个可选值:nTag.SKIP_BODYnTag.EVAL_BODY_INCLUDEPDF文件使用pdfFactory试用版本创建()方法nTag.SKIP_BODY表示标签之间的内容被忽略。nTag.EVAL_BODY_INCLUDE表示标签之间的内容被正常执行。例如对于以下代码:prefix:MytagHello…………/prefix:Mytag假若Mytag的doStartTag()方法返回Tag.SKIP_BODY,”Hello”字符串不会显示在网页上;若返回Tag.EVAL_BODY_INCLUDE,“Hello”字符串将显示在网页上。PDF文件使用pdfFactory试用版本创建()方法n当Servlet容器遇到自定义标签的结束标志,就会调用doEndTag()方法。ndoEndTag()方法也返回一个整数值,用来决定程序后续流程。它有两个可选值:nTag.SKIP_PAGEnTag.EVAL_PAGEPDF文件使用pdfFactory试用版本创建()方法nTag.SKIP_PAGE表示立刻停止执行JSP网页,网页上未处理的静态内容和JSP程序均被忽略,任何已有的输出内容立刻返回到客户的浏览器上。nTag.EVAL_PAGE表示按正常的流程继续执行JSP网页。PDF文件使用pdfFactory试用版本创建在标签中还能包含自定义的属性,例如:prefix:mytagusername=“weiqin…………/prefix:mytagPDF文件使用pdfFactory试用版本创建在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法,假定以上username为String类型,可以定义如下方法:privateStringusername;publicvoidsetUsername(Stringvalue){this.username=value;}publicStringgetUsername(){returnusername;}PDF文件使用pdfFactory试用版本创建:创建hello标签n定义一个名为mytaglib的标签库,它包含一个简单的hello标签,这个标签能够将JSP页面中所有的mm:hello/解析为字符串“hello”。PDF文件使用pdfFactory试用版本创建()throwsJspException{try{//WeusethepageContexttogetaWriter//WethenprintthetextstringHellopageContext.getOut().print(Hello);}catch(Exceptione){thrownewJspTagException(e.getMessage());}returnEVAL_PAGE;}PDF文件使用pdfFactory试用版本创建文件,在这个文件中定义mytaglib标签库和hello标签。这个文件存放位置为/WEB-INF/mytaglib.tld。PDF文件使用pdfFactory试用版本创建……taglibtaglib-uri/mytaglib/taglib-uritaglib-location/WEB-INF/mytaglib.tld/taglib-location/taglibwebPDF文件使用pdfFactory试用版本创建(1)在hellowithtag1.jsp中加入引用mytaglib的taglib指令:%@tagliburi=/mytaglibprefix=mm%以上taglib指令中,prefix属性用来指定引用mytaglib标签库时的前缀。PDF文件使用pdfFactory试用版本创建(2)在hellowithtag1.jsp文件中插入hello标签:bmm:hello/:%=request.getParameter(USER)%/bn访问hellowithtag1.jsp:==weiqinweiqinPDF文件使用pdfFactory试用版本创建:创建message标签n创建一个能替换helloapp应用中JSP网页的静态文本的标签,这个标签名为message,它放在mytaglib标签库中。PDF文件使用pdfFactory试用版本创建:创建message标签n在hellowithtag2.jsp文件中使用message标签的代码如下:bmm:messagekey=hello.hello/:%=request.getAttribute(USER)%/bn当客户访问hello.jsp网页时,message标签的处理类会根据属性key的值从一个文本文件中找到与key匹配的字符串。假定这个字符串为“Hello”,然后将这个字符串输出到网页上。PDF文件使用pdfFactory试用版本创建网页静态文本的文件,这些文本以key/v