1、实验16 编写JSP定制标签实验16 编写JSP定制标签【没有交第1到第4次纸质实验报告的同学请补交给小课老师!】16.1实验目的 1理解自定义标签体系结构; 2掌握创建自定义标签的基本步骤; 3掌握给自定义标签添加属性; 4掌握自定义标签处理标签体。16.2 实验环境1MyEclipse插件平台、2Weblogic(或者Tomcat)容器16.3实验知识背景16.3.1 自定义标签库简介在JSP中使用标签可以减少Java代码,便于页面的维护。但由于JSP的标准操作、JSTL定义的标签满足不了用户的所有要求,所以在JSP2.0中允许用户可根据需要创建自己的标签库,即自定义标签库。用户自定义标签
2、和JSTL中的标签从技术上看没有任何区别,可以将这些标签统称为JSP标签。JSP标签在JSP页面中通过XML语法格式被调用,当JSP引擎将JSP页面翻译成Servlet时,就将这些调用转换成相应的Java代码。本质上,JSP标签调用了部分Java代码,只是这些Java代码在JSP页面中以另外一种形式(XML语法格式)表现出来。16.3.2 自定义标签的形式自定义标签的形式有四种:空标签、带有属性的空标签、带有标签体的标签、带有标签体和属性的标签。1、空标签(不含标签体和属性)格式: 或 例如:2、带有属性的空标签格式一: 格式二: 例如:simple:greetingAtt name=“/ 3
3、、带有标签体的标签格式: 标签体 例如: : 4、既带有属性又有标签体的标签格式: 标签体 例如:simple:greetingAtt name= 现在时间是:: 要注意的是,一个自定义标签包含超始标记和结束标记;在起始标记中是可设置自定义标签属性的;在自定义标签的起始标记和结束标记之间还可以有标签体;自定义标签按照以下顺序执行:起始标记-标签体-结束标记。16.3.3 自定义标签的工作原理及相关概念自定义标签实际上是一个实现了特定接口的Java类,它封装了一些常用功能,在运行时被相应的代码所替换。如图16-1所示:图16-1自定义标签的工作原理示意图为了方便后续的学习,给出一些概念的定义。标
4、签(Tag):让JSP页面实现特定功能,通过标签可以使JSP网页变得简洁并且易于维护 ,是一种XML元素,它的名称和属性都对大小写敏感;标签库(Tag library):由一系列功能相似、逻辑上互相联系的标签构成的集合,同一个标签库的“前缀”相同;标签库描述文件(Tag Library Descriptor):是一个XML文件,它提供了标签库中类和JSP中对标签引用的映射关系,也是一个配置文件,与web.xml类似;标签处理类(Tag Handle Class):是一个Java类,这个类继承了TagSupport(或BodyTagSupport)类,也可能实现了Tag或其子接口,通过该类可以自
5、已定义JSP标签的具体功能。16.3.4自定义标签相关API自定义标签相关的类与接口位于javax.servlet.jsp.tagext包中,具体结构如图16-2所示。图16-2自定义标签相关的类与接口说明:1、JsPTag是Tag和SimpleTag接口的父接口,是一个标记接口,不包含任何属性和方法;2、Tag接口中的方法和常量:setPageContext()方法:负责设置页面的pageContext;setParent()方法:负责设置父标签;doStartTag()方法:遇到自定义标签的开始标记时去调用标签处理类的方法,返回值为EVAL_BODY_INCLUDE(表示标签体要执行,执行
6、结果放在当前输出流中)、SKIP_BODY( 不执行标签体);doEndTag()方法:遇到自定义标签的结束标记时去调用标签处理类的方法,返回值:EVAL_PAGE(Jsp页面的剩余内容将继续执行)、SKIP_PAGE(Jsp页面的剩余内容不执行)。doAfterBody()方法:是IterationTag接口增加的方法,在执行完标签体后调用,如果没有标签体,该方法将不会调用。该方法的返回值是:SKIP_BODY、EVAL_BODY_AGAIN(重复执行标签体);setBodyContent()方法:是BodyTag接口中设置bodyContent属性的方法,以备后面获取标签体内容;只有在do
7、StartTag()返回EVAL_BODY_BUFFERED才执行;doInitBody()方法:在setBodyContent()方法之后,执行标签体之前调用,为标签体的执行做准备;只有在doStartTag()返回EVAL_BODY_BUFFERED才执行;3、TagSupport类实现IterationTag接口,利用它可简化标签处理类的创建;4、BodyTagSupport类实现BodyTag接口,利用它可简化有关标签体处理类的创建。16.4 实验内容及步骤1、创建标签,该标签的功能是能根据系统时间,可以显示不同的问候语,如Good morning(afternoon、evening、
8、night等)。 (1)新建Web项目,项目结构如图16-3所示;图16-3 项目结构图(2)创建GreetingTagHandler类作为标签的处理类。因为标签是空标签,只需要实现doEndTag()方法即可,返回EVAL_PAGE后继续剩余页面的执行。源代码:/带属性的简单标签处理类package myjctl;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;import java.util.*;import java.io.*;public class GreetingAttributeTagHandler ext
9、ends TagSupport / 标签有一个属性:name private String name; public String getName() return name; public void setName(String name) this.name = name; public int doStartTag() throws JspTagException Calendar calendar = Calendar.getInstance(); int hr = calendar.get(Calendar.HOUR_OF_DAY); int min = calendar.get(C
10、alendar.MINUTE); int sec = calendar.get(Calendar.SECOND); String showtime = ,现在时间是 :+hr+:+min+:+sec; try if (hr 12) pageContext.getOut().write(Good monrning, + getName()+showtime); else if (hr 16) pageContext.getOut().write(Good afternoon, + getName()+showtime); else if (hr 19) pageContext.getOut().
11、write(Good evening, + getName()+showtime); else pageContext.getOut().write(Good night, + getName()+showtime); catch (IOException e) throw new JspTagException( Fatal error:greeeting tag could not write to the output stream.); return EVAL_BODY_INCLUDE; public int doEndTag() throws JspTagException retu
12、rn EVAL_PAGE; (3)在如图16-4的目录中新建标签库描述(TLD)文件,命名为greeting.tld ;图16-4 TLD文件存放路径源代码: 1.0 simple greetingAtt myjctl.GreetingAttributeTagHandler JSP name true true (4)在web.xml文件中配置标签库信息;源代码:web-app version=2.4 xmlns= xmlns:xsi=http:/www.w3.org/2001/XMLSchema-instance xsi:schemaLocation= index.jsp /CustomTa
13、gs /WEB-INF/tlds/greeting.tld (5)在项目中新建login.jsp。源代码: 登录页面 登录能获取时间、日期 请输入您的姓名: (6)在项目中新建simple_attribute.jsp,应用上面定制的simple标签。源代码: 简单自定义标签带属性例子 simple:greetingAtt name= / 项目完成后,部署到weblogic上,运行效果如图16-5和图16-6所示。图16-5 输入姓名图16-6 使用自定义的simple标签显示姓名和系统时间2、创建标签,该标签的功能是允许用户输入三角形的三边,如果三条边能构成三角形,则输出三角形的面积与三边的边
14、长。若不能构成三角形,则出现提示信息。(1)在上题项目中创建标签处理类/带属性的简单标签处理类package triangle;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;import java.util.*;import java.io.*;public class TriangleTagHandler extends TagSupport / 标签有一个属性:name private String sides; public String getSides() return sides; public void
15、setSides(String sides) this.sides = sides; public int doStartTag() throws JspTagException int i=0; String s=null; double result=0; double a=new double3; String answer=null; s=this.getSides(); if(s!=null) StringTokenizer fenxi=new StringTokenizer(s,);/根据,分拆字符串 while(fenxi.hasMoreTokens() /逐个显示分拆后的字符串
16、 String temp=fenxi.nextToken(); try ai=Double.valueOf(temp).doubleValue(); i+; catch(NumberFormatException e) answer = +请输入数字字符; if(a0+a1a2&a0+a2a1&a1+a2a0) double p=(a0+a1+a2)/2; result=Math.sqrt(p*(p-a0)*(p-a1)*(p-a2); answer = 面积:+result; else answer = +您输入的三边不能构成一个三角形; String showMsg = 您输入的三边是:
17、+a0+ +a1+ +a2+ +answer; try pageContext.getOut().write(showMsg); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace(); return EVAL_BODY_INCLUDE; public int doEndTag() throws JspTagException return EVAL_PAGE; (2)在上题的greeting.tld文件中追加新标签的定义;源代码: 1.0 simple greetingAtt myjctl.Gre
18、etingAttributeTagHandler JSP name true true triangle showMessage triangle.TriangleTagHandler JSP sides true true (3)在web.xml文件中配置标签库信息;源代码:web-app version=2.4 xmlns= xmlns:xsi=http:/www.w3.org/2001/XMLSchema-instance xsi:schemaLocation= index.jsp /CustomTags /WEB-INF/tlds/greeting.tld /TriangleTags
19、/WEB-INF/tlds/greeting.tld (4)新建页面triangleTest.jsp,使用自定义的标签triangle:showMessage来对三角形的三边进行判断。源代码: 请输入三角形的三个边的长度,输入的数字用逗号分割: 项目完成后,部署到weblogic上,运行效果如图16-7和图16-8所示。图16-7 输入的三条边不能构成三角形图16-8 输入的三条边能构成三角形则计算面积16.5实验总结本次实验主要练习了如何使用标签文件来定制用户标签,让读者熟悉了创建自定义标签的基本步骤,接着体验了自定义标签的使用过程。利用JSP自定义标签,软件开发人员和页面设计人员可以独立地自由工作.页面设计人员可以把精力集中在使用标签(HTML,XML或者JSP)创建网站上,而软件开发人员则可以将精力集中在实现底层功能上面。16.6课后思考题1、若要使用自定义标签,需要调用什么指令?调用标签的格式如何书写?遇到标签的起始标记、结束标记时,分别调用什么方法。2、解释概念:标签库、标签库描述文件、标签处理类。3、要自定义空标签,需要继承什么类或实现哪些接口?
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1