您的位置:首页 > Web前端 > JavaScript

JSP标记学习笔记

2008-04-25 17:26 337 查看
JSP标记学习笔记ginkou.fly 2002-9-181. 概述1) 什么是JSP标记顾名思义,JSP标记就是在JSP文件中使用的标记。它类似于html语法中的标记,像head 、table 。通过在JSP文件中引用它(就像使用html标记那样),可以更方便的实现对Java 代码模块的重用。2) 为什么要使用JSP 标记技术(与javabean相比)好处:J JSP 标记可以处理JSP正文的内容,比如改变文本显示样式;而javabean不可以。J JSP标记接口简单,易于使用,也易于开发和维护。坏处:L JSP标记在进行设置时要比javabean复杂很多,体现在JSP标记库描述文件(*.tld)的配置上。L JSP标记实现的功能远不如javabean强大。L 当前只要JSP1.1支持JSP标记,而JSP1.0和1.1都支持对Bean的使用。2. JSP标记的开发简介。JSP标记的开发需要编写2种独立的文件。一种是定义标记功能的java类文件,一种是将xml元素名称(标记)映射到标记实现的标记库描述符文件。⑴ 编写标记处理程序类文件需要继承javax.servlet.JSP.tagext.TagSupport类;简单示例://文件名ExampleTag.javaimport javax.servlet.JSP.*;import javax.servlet.JSP.tagext.*;import java.io.*; public class ExampleTag extends TagSupport { //程序的执行起始点 public int doStartTag() { try { JSPWriter out=pageContext.getOut(); out.print(“Custom tag example”); }catch (IOException ioe) { System.out.println(“Error in ExampleTag : “ + ioe); } return(SKIP_BODY); //当标记包括的内容为空时返回SKIP_BODY,表示标记功能 //已执行完成 }} 编译好的class文件将位于服务器的的特定位置。⑵ 编写标记库描述符文件将标记名和其代表的功能实现联系在一起。 简单示例: <!--文件名:csaJSP-taglib.tld--> <? xml version=”1.0” encoding=”ISO-8859-1” ?><!DOCTYPE taglib PUBLIC “-//Sun Microsystem,Inc.//DTD JSP Tag Library 1.1//EN”JSPtaglibrary_1_1.dtd">http://java.sun.com/j2ee/dtds/web-JSPtaglibrary_1_1.dtd>//以上是标准的文件头//以下是标签库描述<tlibversion>1.0</tlibversion> //Tag 库的版本<JSPversion>1.1</JSPversion> //JSP 库的版本<shortname>csaJSP</shortname>//自定义标记前缀名<uri></uri> //标记描述符文件的uri,可以是空<info>My custom tag!</info> //标记库的描述信息//以下定义新标记<tag> <name>example</name> //自定义的标记名 <tagclass>tags.ExampleTag</tagclass>//定位标签处理类文件<info>Simplest example</info>//描述信息<bodycontent>EMPTY</bodycontent> // 不处理JSP文件正文内容</tag></taglib>此文件将配置在服务器的特定位置⑶ 使用以上自定义的标记<!--文件名:simpleExample.JSP--><!DOCTYPE HTML PUBLIC “- // W3C//DTD HTML 4.0 Transitional //EN”><HTML><HEAD><%@ taglib uri = “csaJSP-taglib.tld” prefix = “csaJSP” %> //进行标记使用声明<TITLE><csaJSP:example /><TITLE><LINK REL=STYLESHEET HREF=”JSP-styles.css” TYPE=”text/css”><HEAD><BODY><H1><csaJSP:example /><H1> /使用标记<csaJSP:example /></BODY></HTML>这样最终在在浏览器上输出为 Custom tag example3. 深入的JSP标记开发⑴ 添加标记属性在标记处理类中可以通过函数setAttribute(String value) 为JSP标记分配属性,这样标记处理程序根据获取的属性值来实现相关功能。比如 private String message = “Default Message”;public void setMessage(String message) { this.message=message; }注意:属性名message是小写的,设置函数中的Message是大写的。◆与之相关的在tld文件中需要在tag元素中添加如下元素<tag><attribute><name>message</name> //属性名<required>false</requied> //属性值是否必须提供。False表示不必,存在缺省值。<rtexprvalue>true</rtexprvalue>//ture表示属性值可以使用JSP表达式,false表示禁//止使用</attribute></tag>◆对应JSP文件中引用为:<prefix : name message = “ Hello!” />⑵ 使用标记正文 即是在标记中使用一些包含JSP脚本元素、文本等的内容,这些内容由JSP引擎处理。 形式如下: <prefix : tagname> body(正文内容) <prefix : tagname> 在处理JSP标记的正文前,将会调用处理程序的doStartTag()方法,此时要在此方法中返回EVAL_BODY_INCLUDE 以表明包含有标记正文;处理完后,将会调用doEndTag()方法,此后要让JSP引擎继续处理后面的页面,得返回EVAL_PAGE,否则返回SKIP_PAGE。 ◆对应在tld文件中需要在tag元素中添加如下元素 <tag> … <bodycontent>JSP</bodycontent> //表明包含正文 … </tag> 另外:可以设置一些条件来判断是否包含正文的,如下: public int doStartTag() { ServletRequest request = pageContext.getRequest(); String debugFlag = request .getParameter(“debug”); If ((debugFlag!=null) && (!debugFlag.equalsIgnoreCase(“false”))) { Return (EVAL_BODY_INCLUDE); } else { return(SKIP_BODY); } }这样只有在url尾部给出请求参数值debug = true,才会显示标记正文的内容。这样可以隐藏一些调试信息。⑶ 对标记正文进行处理 JSP的标记可以对包含的正文进行处理(修改),然后再输出。这需要标记处理类继承BodyTagSupport类(TagSupport类的继承)。这个类提供了2个重要的方法用于正文处理。 → doAfterBody:默认执行的方法,在此方法中包含正文的处理过程。→ getBodyContent:返回BodyContent类型的的对象,此对象包含了有关标记正文的信息。 BodyContent类型包含的重要方法:→ getEnclosingWriter:返回JSPWriter方法,输出内容。→ getString:返回包含全部JSP标记正文的字符串。注意:这里和⑵中介绍的输出JSP标记正文的方式不一样。前者的输出是先由JSP引擎解释,这里是在JSP标记处理程序中直接输出到给浏览器。另外,在doAferBody中返回SKIP_BODY,表示终止标记正文处理;若返回的是EVAL_BODY_TAG,将会再一次调用doAferBody方法,重新处理标记正文,直到返回SKIP_BODY为止。示例:→标记处理程序片://下面的程序片将调用一个filter方法,此方法用于把JSP正文中的字符< > “ & 分别用⁢ > &guot; &来代替。以使浏览器按字符原样输出,不进行解释。public class FillterTag extends BodyTagSupport { public int doAfterBody() { BodyContent body=getBodyContent(); String filteredBody=ServletUtilities.filter(body.getString()); //将正文得到的字符串过滤 Try { JSPWriter out=body.getEnclosingWriter();out.print(filteredBody); //输出过滤后的文本}catch(IOException ioe) { System.out.println(“Error in FilterTag: “ + ioe);}return(SKIP_BODY); //终止JSP正文处理 }→标记符描述文件片 … <tag> <name>filter</name> <tagclass>tags.FilterTag</tagclass> <bodycontent>JSP</bodycontent> </tag> …→JSP文件片 <csaJSP:filter> <STRONG>I love you!</STRONG><BR> <EM>I love you!<EM> </csaJSP:filter> 这样,在浏览器中输出的标记正文应当是<STRONG>I love you!</STRONG><BR><EM>I love you!<EM> 而不是 I love you! I love you!  ⑶使用JSP嵌套标记。 可以对多个JSP标记进行嵌套引用,这样子标记就可以访问和存储父标记的数据和方法。 子标记访问父标记需要使用BodyTagSupport类中的 findAccetorWithClass方法。注意它只能查找临近的父标记。 假如在JSP文件中如下的嵌套引用: <!- - 此嵌套标记模拟条件判断- -> <csaJSP:if> <csaJSP:condition>true</csaJSP:condition> <csaJSP:then>Condition was true</csaJSP:then> <csaJSP:else>Condition was false</csaJSP:else> </csaJSP:if> 相应的标记处理程序片: →对于if标记,执行类如下: public class IfTag extends TagSupport { private boolean condition ; private Boolean hasCondition = flase ; public void setCondition(Boolean condition) { //设置判断条件的真假;condition子标//记调用 this.condition = condition ; hasCondition = true ; }public Boolean getCondition() { //获取判断条件的真假then 、else子标//记调用 return(condition) ; } public void setHasCondition(Boolean flag) { //判断if标记后是否存在条件,由//condition子标记调用 this.hasCondition = flag ; } public Boolean getHasCondition() { //获取是否存在判断条件的信息,由//then
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: