实验16 编写JSP定制标签.docx

上传人:b****7 文档编号:10580088 上传时间:2023-02-21 格式:DOCX 页数:18 大小:153.24KB
下载 相关 举报
实验16 编写JSP定制标签.docx_第1页
第1页 / 共18页
实验16 编写JSP定制标签.docx_第2页
第2页 / 共18页
实验16 编写JSP定制标签.docx_第3页
第3页 / 共18页
实验16 编写JSP定制标签.docx_第4页
第4页 / 共18页
实验16 编写JSP定制标签.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

实验16 编写JSP定制标签.docx

《实验16 编写JSP定制标签.docx》由会员分享,可在线阅读,更多相关《实验16 编写JSP定制标签.docx(18页珍藏版)》请在冰豆网上搜索。

实验16 编写JSP定制标签.docx

实验16编写JSP定制标签

实验16编写JSP定制标签

【没有交第1到第4次纸质实验报告的同学请补交给小课老师!

16.1实验目的

1.理解自定义标签体系结构;

2.掌握创建自定义标签的基本步骤;

3.掌握给自定义标签添加属性;

4.掌握自定义标签处理标签体。

16.2实验环境

1.MyEclipse插件平台、

2.Weblogic(或者Tomcat)容器

16.3实验知识背景

16.3.1自定义标签库简介

在JSP中使用标签可以减少Java代码,便于页面的维护。

但由于JSP的标准操作、JSTL定义的标签满足不了用户的所有要求,所以在JSP2.0中允许用户可根据需要创建自己的标签库,即自定义标签库。

用户自定义标签和JSTL中的标签从技术上看没有任何区别,可以将这些标签统称为JSP标签。

JSP标签在JSP页面中通过XML语法格式被调用,当JSP引擎将JSP页面翻译成Servlet时,就将这些调用转换成相应的Java代码。

本质上,JSP标签调用了部分Java代码,只是这些Java代码在JSP页面中以另外一种形式(XML语法格式)表现出来。

16.3.2自定义标签的形式

自定义标签的形式有四种:

空标签、带有属性的空标签、带有标签体的标签、带有标签体和属性的标签。

1、空标签(不含标签体和属性)

格式:

<前缀:

标签名/>或<前缀:

标签名>

标签名>

例如:

greeting/>

2、带有属性的空标签

格式一:

<前缀:

标签名属性1=“值1”属性2=“值2”…/>

格式二:

<前缀:

标签名属性1=“值1”属性2=“值2”…>

标签名>

例如:

greetingAttname="<%=username%>“/>

3、带有标签体的标签

格式:

<前缀:

标签名>

标签体

标签名>

例如:

greetingBodyTag>

<%=hr%>:

<%=min%>:

<%=sec%>

greetingBodyTag>

4、既带有属性又有标签体的标签

格式:

<前缀:

标签名属性1=“值1”属性2=“值2”…>

标签体

标签名>

例如:

greetingAttname="<%=username%>">

现在时间是:

<%=hr%>:

<%=min%>:

<%=sec%>

greetingAtt>

要注意的是,一个自定义标签包含超始标记和结束标记;在起始标记中是可设置自定义标签属性的;在自定义标签的起始标记和结束标记之间还可以有标签体;自定义标签按照以下顺序执行:

起始标记->标签体->结束标记。

16.3.3自定义标签的工作原理及相关概念

自定义标签实际上是一个实现了特定接口的Java类,它封装了一些常用功能,在运行时被相应的代码所替换。

如图16-1所示:

图16-1自定义标签的工作原理示意图

为了方便后续的学习,给出一些概念的定义。

标签(Tag):

让JSP页面实现特定功能,通过标签可以使JSP网页变得简洁并且易于维护,是一种XML元素,它的名称和属性都对大小写敏感;

标签库(Taglibrary):

由一系列功能相似、逻辑上互相联系的标签构成的集合,同一个标签库的“前缀”相同;

标签库描述文件(TagLibraryDescriptor):

是一个XML文件,它提供了标签库中类和JSP中对标签引用的映射关系,也是一个配置文件,与web.xml类似;

标签处理类(TagHandleClass):

是一个Java类,这个类继承了TagSupport(或BodyTagSupport)类,也可能实现了Tag或其子接口,通过该类可以自已定义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(表示标签体要执行,执行结果放在当前输出流中)、SKIP_BODY(不执行标签体);

doEndTag()方法:

遇到自定义标签的结束标记时去调用标签处理类的方法,返回值:

EVAL_PAGE(Jsp页面的剩余内容将继续执行)、SKIP_PAGE(Jsp页面的剩余内容不执行)。

doAfterBody()方法:

是IterationTag接口增加的方法,在执行完标签体后调用,如果没有标签体,该方法将不会调用。

该方法的返回值是:

SKIP_BODY、EVAL_BODY_AGAIN(重复执行标签体);

setBodyContent()方法:

是BodyTag接口中设置bodyContent属性的方法,以备后面获取标签体内容;只有在doStartTag()返回EVAL_BODY_BUFFERED才执行;

doInitBody()方法:

在setBodyContent()方法之后,执行标签体之前调用,为标签体的执行做准备;只有在doStartTag()返回EVAL_BODY_BUFFERED才执行;

3、TagSupport类实现IterationTag接口,利用它可简化标签处理类的创建;

4、BodyTagSupport类实现BodyTag接口,利用它可简化有关标签体处理类的创建。

16.4实验内容及步骤

1、创建

greeting/>标签,该标签的功能是能根据系统时间,可以显示不同的问候语,如Goodmorning(afternoon、evening、night等)。

(1)新建Web项目,项目结构如图16-3所示;

图16-3项目结构图

(2)创建GreetingTagHandler类作为标签的处理类。

因为标签

greeting/>是空标签,只需要

实现doEndTag()方法即可,返回EVAL_PAGE后继续剩余页面的执行。

源代码:

//带属性的简单标签处理类

packagemyjctl;

importjavax.servlet.jsp.*;

importjavax.servlet.jsp.tagext.*;

importjava.util.*;

importjava.io.*;

publicclassGreetingAttributeTagHandlerextendsTagSupport{

//标签有一个属性:

name

privateStringname;

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

publicintdoStartTag()throwsJspTagException{

Calendarcalendar=Calendar.getInstance();

inthr=calendar.get(Calendar.HOUR_OF_DAY);

intmin=calendar.get(Calendar.MINUTE);

intsec=calendar.get(Calendar.SECOND);

Stringshowtime=",现在时间是:

"+hr+":

"+min+":

"+sec;

try{

if(hr<12){

pageContext.getOut().write("Goodmonrning,"+getName()+showtime);

}elseif(hr<16){

pageContext.getOut().write("Goodafternoon,"+getName()+showtime);

}elseif(hr<19){

pageContext.getOut().write("Goodevening,"+getName()+showtime);

}else{

pageContext.getOut().write("Goodnight,"+getName()+showtime);

}

}catch(IOExceptione){

thrownewJspTagException(

"Fatalerror:

greeetingtagcouldnotwritetotheoutputstream.");

}

returnEVAL_BODY_INCLUDE;

}

publicintdoEndTag()throwsJspTagException{

returnEVAL_PAGE;

}

}

(3)在如图16-4的目录中新建标签库描述(TLD)文件,命名为greeting.tld;

图16-4TLD文件存放路径

源代码:

xmlversion="1.0"encoding="UTF-8"?

>

1.0

simple

greetingAtt

myjctl.GreetingAttributeTagHandler

JSP

name

true

true

(4)在web.xml文件中配置标签库信息;

源代码:

xmlversion="1.0"encoding="UTF-8"?

>

xmlns="

xmlns:

xsi="http:

//www.w3.org/2001/XMLSchema-instance"

xsi:

schemaLocation="

index.jsp

/CustomTags

/WEB-INF/tlds/greeting.tld

(5)在项目中新建login.jsp。

源代码:

<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%>

登录页面

登录能获取时间、日期


请输入您的姓名:


(6)在项目中新建simple_attribute.jsp,应用上面定制的simple标签。

源代码:

<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%>

<%@pagecontentType="text/html;charset=utf-8"%>

<%@tagliburi="/CustomTags"prefix="simple"%>

简单自定义标签带属性例子

<%request.setCharacterEncoding("utf-8");

Stringusername=request.getParameter("username");%>

greetingAttname="<%=username%>"/>

项目完成后,部署到weblogic上,运行效果如图16-5和图16-6所示。

图16-5输入姓名

图16-6使用自定义的simple标签显示姓名和系统时间

 

2、创建

showMessage/>标签,该标签的功能是允许用户输入三角形的三边,如果三条边能构成三角形,则输出三角形的面积与三边的边长。

若不能构成三角形,则出现提示信息。

(1)在上题项目中创建标签处理类

//带属性的简单标签处理类

packagetriangle;

importjavax.servlet.jsp.*;

importjavax.servlet.jsp.tagext.*;

importjava.util.*;

importjava.io.*;

publicclassTriangleTagHandlerextendsTagSupport{

//标签有一个属性:

name

privateStringsides;

publicStringgetSides(){

returnsides;

}

publicvoidsetSides(Stringsides){

this.sides=sides;

}

publicintdoStartTag()throwsJspTagException{

inti=0;

Strings=null;

doubleresult=0;

doublea[]=newdouble[3];

Stringanswer=null;

s=this.getSides();

if(s!

=null)

{StringTokenizerfenxi=newStringTokenizer(s,",");

//根据","分拆字符串

while(fenxi.hasMoreTokens())

{//逐个显示分拆后的字符串

Stringtemp=fenxi.nextToken();

try{a[i]=Double.valueOf(temp).doubleValue();

i++;

}

catch(NumberFormatExceptione)

{answer="
"+"请输入数字字符";

}

}

if(a[0]+a[1]>a[2]&&a[0]+a[2]>a[1]&&a[1]+a[2]>a[0])

{doublep=(a[0]+a[1]+a[2])/2;

result=Math.sqrt(p*(p-a[0])*(p-a[1])*(p-a[2]));

answer="面积:

"+result;

}

else

{

answer="
"+"您输入的三边不能构成一个三角形";

}

}

StringshowMsg="

您输入的三边是:


"+a[0]+"
"+a[1]+"
"+a[2]+"
"+answer;

try{

pageContext.getOut().write(showMsg);

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

returnEVAL_BODY_INCLUDE;

}

publicintdoEndTag()throwsJspTagException{

returnEVAL_PAGE;

}

}

(2)在上题的greeting.tld文件中追加新标签的定义;

源代码:

xmlversion="1.0"encoding="UTF-8"?

>

1.0

simple

greetingAtt

myjctl.GreetingAttributeTagHandler

JSP

name

true

true

triangle

showMessage

triangle.TriangleTagHandler

JSP

sides

true

true

(3)在web.xml文件中配置标签库信息;

源代码:

xmlversion="1.0"encoding="UTF-8"?

>

xmlns="

xmlns:

xsi="http:

//www.w3.org/2001/XMLSchema-instance"

xsi:

schemaLocation="

index.jsp

/CustomTags

/WEB-INF/tlds/greeting.tld

/TriangleTags

/WEB-INF/tlds/greeting.tld

(4)新建页面triangleTest.jsp,使用自定义的标签triangle:

showMessage来对三角形的三边进行判断。

源代码:

<%@pagecontentType="text/html;charset=GB2312"%>

<%@taglibprefix="triangle"uri="/TriangleTags"%>

请输入三角形的三个边的长度,输入的数字用逗号分割:


showMessagesides="${param.sides}"/>

项目完成后,部署到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