JSP标记学习笔记 (转)[@more@]

JSP标记学习笔记XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

ginkou.fly 2002-9-18

1. 概述

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.java

import 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-->

PUBLIC “-//Sun Microsystem,Inc.//DTD JSP Tag Library 1.1//EN”

J2EE/dtds/web-jsptaglibrary_1_1.dtd">http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd>

//以上是标准的文件头

//以下是标签库描述

1.0 //Tag 库的版本

1.1 //Jsp 库的版本

csajsp//自定义标记前缀名

//标记描述符文件的uri,可以是空

My custom tag! //标记库的描述信息

//以下定义新标记

example //自定义的标记名

tags.ExampleTag//定位标签处理类文件

Simplest example//描述信息

EMPTY // 不处理Jsp文件正文内容

此文件将配置在服务器的特定位置

⑶ 使用以上自定义的标记

<!--文件名:simpleExample.jsp-->

<%@ taglib uri = “csajsp-taglib.tld” prefix = “csajsp” %> //进行标记使用声明

<csajsp:example /><TITLE></P><P><P> TYPE=”text/css”></P><P><HEAD></P><P><BODY></P><P><csajsp:example /> /使用标记</P><P><csajsp:example /></P><P></BODY></P><P></HTML></P><P>这样最终在在浏览器上输出为</P><P> Custom tag example</P><P>3. 深入的JSP标记开发</P><P>⑴ 添加标记属性</P><P>在标记处理类中可以通过函数setAttribute(String value) 为jsp标记分配属性,这样标记处理程序根据获取的属性值来实现相关功能。</P><P>比如 private String message = “Default Message”;</P><P>public void setMessage(String message) {</P><P> this.message=message;</P><P> }</P><P>注意:属性名message是小写的,设置函数中的Message是大写的。</P><P>◆与之相关的在tld文件中需要在tag元素中添加如下元素</P><P><tag></P><P></P><P><name>message</name> //属性名</P><P><required>false</requied> //属性值是否必须提供。False表示不必,存在缺省值。</P><P><rtexprvalue>true</rtexprvalue></P><P>//ture表示属性值可以使用jsp表达式,false表示禁</P><P>//止使用</P><P></attribute></P><P></tag></P><P>◆对应jsp文件中引用为:<p></P><P>⑵ 使用标记正文</P><P>即是在标记中使用一些包含jsp脚本元素、文本等的内容,这些内容由jsp引擎处理。</P><P>形式如下:</P><P><p> body(正文内容) <p></P><P>在处理jsp标记的正文前,将会调用处理程序的doStartTag()方法,此时要在此方法中返回EVAL_BODY_INCLUDE 以表明包含有标记正文;处理完后,将会调用doEndTag()方法,此后要让jsp引擎继续处理后面的页面,得返回EVAL_PAGE,否则返回SKIP_PAGE。</P><P>◆对应在tld文件中需要在tag元素中添加如下元素</P><P><tag></P><P>…</P><P><bodycontent>JSP</bodycontent> //表明包含正文</P><P>…</P><P></tag></P><P>另外:可以设置一些条件来判断是否包含正文的,如下:</P><P>public int doStartTag() {</P><P> ServletRequest request = pageContext.getRequest();</P><P> String debugFlag = request .getParameter(“debug”);</P><P> If ((debugFlag!=null) && (!debugFlag.equalsIgnoreCase(“false”))) {</P><P> Return (EVAL_BODY_INCLUDE);</P><P> }</P><P> else {</P><P> return(SKIP_BODY);</P><P> }</P><P> }</P><P>这样只有在url尾部给出请求参数值debug = true,才会显示标记正文的内容。这样可以隐藏一些调试信息。</P><P>⑶ 对标记正文进行处理</P><P> jsp的标记可以对包含的正文进行处理(修改),然后再输出。这需要标记处理类继承BodyTagSupport类(TagSupport类的继承)。这个类提供了2个重要的方法用于正文处理。</P><P> → doAfterBody:默认执行的方法,在此方法中包含正文的处理过程。</P><P>→ getBodyContent:返回BodyContent类型的的对象,此对象包含了有关标记正文的信息。</P><P>BodyContent类型包含的重要方法:</P><P>→ getEnclosingWriter:返回JspWriter方法,输出内容。</P><P>→ getString:返回包含全部jsp标记正文的字符串。</P><P>注意:这里和⑵中介绍的输出jsp标记正文的方式不一样。前者的输出是先由jsp引擎解释,这里是在jsp标记处理程序中直接输出到给浏览器。</P><P>另外,在doAferBody中返回SKIP_BODY,表示终止标记正文处理;若返回的是EVAL_BODY_TAG,将会再一次调用doAferBody方法,重新处理标记正文,直到返回SKIP_BODY为止。</P><P>示例:</P><P>→标记处理程序片:</P><P>//下面的程序片将调用一个filter方法,此方法用于把jsp正文中的字符< > “ & 分别用⁢ > &guot; &来代替。以使浏览器按字符原样输出,不进行解释。</P><P>public class FillterTag extends BodyTagSupport {</P><P> public int doAfterBody() {</P><P> BodyContent body=getBodyContent();</P><P> String filteredbody=ServletUtilities.filter(body.getString()); //将正文得到的字符串过滤</P><P> Try {</P><P> JspWriter out=body.getEnclosingWriter();</P><P>out.print(filteredBody); //输出过滤后的文本</P><P>}catch(IOException ioe) {</P><P> System.out.println(“Error in FilterTag: “ + ioe);</P><P>}</P><P>return(SKIP_BODY); //终止jsp正文处理</P><P> }</P><P>→标记符描述文件片</P><P> …</P><P> <tag></P><P> <name>filter</name></P><P> <tagclass>tags.FilterTag</tagclass></P><P> <bodycontent>JSP</bodycontent></P><P> </tag></P><P> …</P><P>→jsp文件片</P><P> <csajsp:filter></P><P> I love you!<BR></P><P> <EM>I love you!<EM></P><P> </csajsp:filter></P><P> 这样,在浏览器中输出的标记正文应当是</P><P>I love you!<BR></P><P><EM>I love you!<EM></P><P>而不是</P><P>I love you!</P><P><I>I love you!</I></P><P><I></I> ⑶使用jsp嵌套标记。</P><P> 可以对多个JSP标记进行嵌套引用,这样子标记就可以访问和存储父标记的数据和方法。</P><P> 子标记访问父标记需要使用BodyTagSupport类中的 findAccetorWithClass方法。注意它只能查找临近的父标记。</P><P> 假如在jsp文件中如下的嵌套引用:</P><P> <!- - 此嵌套标记模拟条件判断- -></P><P> <csajsp:if></P><P> <csajsp:condition>true</csajsp:condition></P><P> <csajsp:then>Condition was true</csajsp:then></P><P> <csajsp:else>Condition was false</csajsp:else></P><P> </csajsp:if></P><P> 相应的标记处理程序片:</P><P> →对于if标记,执行类如下:</P><P> public class IfTag extends TagSupport {</P><P> private boolean condition ;</P><P> private Boolean haSCOndition = flase ;</P><P> public void setCondition(Boolean condition) { //设置判断条件的真假;condition子标</P><P>//记调用</P><P> this.condition = condition ;</P><P> hasCondition = true ;</P><P> }</P><P>public Boolean getCondition() { //获取判断条件的真假then 、else子标</P><P>//记调用</P><P> return(condition) ;</P><P> }</P><P> public void setHasCondition(Boolean flag) { //判断if标记后是否存在条件,由</P><P>//condition子标记调用</P><P> this.hasCondition = flag ;</P><P> }</P><P> public Boolean getHasCondition() { //获取是否存在判断条件的信息,由</P><P>//then、else标记调用</P><P> return(hasCondition) ;</P><P> }</P><P> public int doStartTag() {</P><P> return(EVAL_BODY_INCLUDE) //包含子标记</P><P> }</P><P> }</P><P>→那么对于condition等其它子标记的处理程序,需要获取父标记处理程序对象:</P><P>IfTag parent=(IfTag) findAncestorWithClass(this,IfTag.class)</P><P>之后就可以操作父标记处理程序的相应方法。</P><P>示例:(对于condition标记)</P><P>public class IfConditionTag extends BodyTagSupport {</P><P> ifTag parent = (IfTag)findAncestorWithClass(this,IfTag.class); //获取父标记对应的对象</P><P>If (parent = = null) {</P><P> Throw new JspTagException(“condition not inside it”);</P><P>}</P><P>return(EVAL_BODY_TAG);</P><P>}</P><P>public int doAfterBody() {</P><P> ifTag parent = (IfTag) findAncestorWithClass(this , IfTag.class) ;</P><P> String bodyString = getBodyContent() . getString() ;</P><P> If (bodyString.trim().equals(“true”)) {</P><P> Parent.setCondition(true) //访问父标记处理类中的方法</P><P> }else {</P><P> parent.setCondition(false) ;</P><P> }</P><P>return(SKIP_BODY) ;</P><P>}</P><P>}</P><P>其余标记类和此相似。</P><P>4. 小结</P><P>对于一些不太复杂和功能单一的逻辑描述,需要传递的参数要求不高时,使用JSP标记,要方便的多。对于大多数的商业逻辑应用,还是使用bean要好的多,也宜于servlet控制。</P><P>这个东东是俺学习 人邮 出的Servletlet与JSP核心技术》时随手写下的。里面的程序还没具体配置过。过段时间弄了再搞篇实验体会吧。</P><P>有什么值的商讨的发eMail哦。ginkou@163.com</P><BR></div> <div class="vps-e0ab36 tip error "> <p>声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。</p> </div> <div class="vps-539788 entry-tag"></div> <div class="vps-b56d2e action"></div> </div> <div class="vps-41b901 article-nav"> <div class="vps-e912d3 article-nav-entry"> <a class="vps-6eb3df entry-page-prev" href="https://www.68vps.cn/jishu/15953.html"> <div class="vps-e3f442 entry-page-icon"><i class="vps-9720a5 iconfont icon-xzjt"></i></div> <div class="vps-25582c entry-page-info"><span class="vps-e9a053 hnav">上一篇</span><span class="vps-a538b5 title">清除python界面的方法</span></div> </a> </div> <div class="vps-e912d3 article-nav-entry"> <a class="vps-bfec01 entry-page-next" href="https://www.68vps.cn/jishu/15955.html"> <div class="vps-25582c entry-page-info"><span class="vps-e9a053 hnav">下一篇</span><span class="vps-a538b5 title">Python3爬虫利器中Scrapy-Redis的安装方法是什么</span></div> <div class="vps-e3f442 entry-page-icon"><i class="vps-a154aa iconfont icon-xyjt"></i></div> </a> </div> </div> <div class="vps-c5b0e3 entry-related-posts"> <h3 class="vps-27079d widget-title"><span>相关推荐</span></h3> <div class="vps-9a0786 article-item"> <ul> </ul> </div> </div> <div class="vps-c5b0e3 entry-related-posts"> <h3 class="vps-27079d widget-title"><span>相关推荐</span></h3> <div class="vps-73207d article-relevant"> <ul> <li><a href="https://www.68vps.cn/jishu/1193.html" target="_blank">CSS选择器与声明的示例分析</a></li> <li><a href="https://www.68vps.cn/jishu/1192.html" target="_blank">html5录音功能如何实现</a></li> <li><a href="https://www.68vps.cn/jishu/1191.html" target="_blank">CSS如何对带有指定属性的HTML元素设置样式</a></li> </ul> </div> </div> </div> <div class="vps-10221a le-sidebar aside"> <div class="vps-55eaea widget"> <h3 class="vps-27079d widget-title"><span>热门</span></h3> <ul class="vps-dfe5b6 list-grid widget_post_hot"> <li> <div class="vps-41f320 item-img"> <a href="https://www.68vps.cn/jishu/69211.html" title="使用java开发的游戏有哪些"> <img width="480" height="400" src="/upload/rand_pic/2-05.jpg" alt="使用java开发的游戏有哪些"> </a> </div> <div class="vps-bb0281 item-content"> <p class="vps-e004f5 item-title"><a href="https://www.68vps.cn/jishu/69211.html" title="使用java开发的游戏有哪些">使用java开发的游戏有哪些</a></p> <p class="vps-969001 item-date"><i class="vps-38a2da iconfont icon-yanjing"></i>1024</p> </div> </li> <li> <div class="vps-41f320 item-img"> <a href="https://www.68vps.cn/jishu/41630.html" title="angularjs-大漠穷秋"> <img width="480" height="400" src="/upload/rand_pic/2-01.jpg" alt="angularjs-大漠穷秋"> </a> </div> <div class="vps-bb0281 item-content"> <p class="vps-e004f5 item-title"><a href="https://www.68vps.cn/jishu/41630.html" title="angularjs-大漠穷秋">angularjs-大漠穷秋</a></p> <p class="vps-969001 item-date"><i class="vps-38a2da iconfont icon-yanjing"></i>1021</p> </div> </li> <li> <div class="vps-41f320 item-img"> <a href="https://www.68vps.cn/jishu/40629.html" title="java中不错的写法"> <img width="480" height="400" src="/upload/rand_pic/2-08.jpg" alt="java中不错的写法"> </a> </div> <div class="vps-bb0281 item-content"> <p class="vps-e004f5 item-title"><a href="https://www.68vps.cn/jishu/40629.html" title="java中不错的写法">java中不错的写法</a></p> <p class="vps-969001 item-date"><i class="vps-38a2da iconfont icon-yanjing"></i>1021</p> </div> </li> <li> <div class="vps-41f320 item-img"> <a href="https://www.68vps.cn/jishu/39650.html" title="iOS7章节—创建基于SpriteKit框架的游戏工程"> <img width="480" height="400" src="/upload/rand_pic/2-01.jpg" alt="iOS7章节—创建基于SpriteKit框架的游戏工程"> </a> </div> <div class="vps-bb0281 item-content"> <p class="vps-e004f5 item-title"><a href="https://www.68vps.cn/jishu/39650.html" title="iOS7章节—创建基于SpriteKit框架的游戏工程">iOS7章节—创建基于SpriteKit框架的游戏工程</a></p> <p class="vps-969001 item-date"><i class="vps-38a2da iconfont icon-yanjing"></i>1020</p> </div> </li> <li> <div class="vps-41f320 item-img"> <a href="https://www.68vps.cn/jishu/37600.html" title="Paypal 支付功能的 C# .NET / JS 如何实现"> <img width="480" height="400" src="/upload/rand_pic/2-03.jpg" alt="Paypal 支付功能的 C# .NET / JS 如何实现"> </a> </div> <div class="vps-bb0281 item-content"> <p class="vps-e004f5 item-title"><a href="https://www.68vps.cn/jishu/37600.html" title="Paypal 支付功能的 C# .NET / JS 如何实现">Paypal 支付功能的 C# .NET / JS 如何实现</a></p> <p class="vps-969001 item-date"><i class="vps-38a2da iconfont icon-yanjing"></i>1018</p> </div> </li> </ul> </div> <!--热门end--> <div class="vps-72cb7b right-list-ad"> <a href=""><img src="/view/blog_moumou/images/guanggao.jpg" alt="测试广告位"></a> </div> <div class="vps-55eaea widget"> <h3 class="vps-27079d widget-title"><span>最新文章</span></h3> <ul class="vps-ff5970 list-grid"> <li> <div class="vps-41f320 item-img"> <a href="https://www.68vps.cn/jishu/89857.html" title="Centos7.5安装mysql5.7.24二进制包方式部署"> <img width="480" height="400" src="/upload/rand_pic/2-06.jpg" alt="Centos7.5安装mysql5.7.24二进制包方式部署"> </a> </div> <div class="vps-bb0281 item-content"> <p class="vps-e004f5 item-title"><a href="https://www.68vps.cn/jishu/89857.html" title="Centos7.5安装mysql5.7.24二进制包方式部署">Centos7.5安装mysql5.7.24二进制包方式部署</a></p> <p class="vps-969001 item-date"><i class="vps-cfa8e7 iconfont icon-shijian"></i>2025-04-02</p> </div> </li> <li> <div class="vps-41f320 item-img"> <a href="https://www.68vps.cn/jishu/89856.html" title="MySQL伪事务和性能"> <img width="480" height="400" src="/upload/rand_pic/2-04.jpg" alt="MySQL伪事务和性能"> </a> </div> <div class="vps-bb0281 item-content"> <p class="vps-e004f5 item-title"><a href="https://www.68vps.cn/jishu/89856.html" title="MySQL伪事务和性能">MySQL伪事务和性能</a></p> <p class="vps-969001 item-date"><i class="vps-cfa8e7 iconfont icon-shijian"></i>2025-04-02</p> </div> </li> <li> <div class="vps-41f320 item-img"> <a href="https://www.68vps.cn/jishu/89855.html" title="mysql关联两张表时的编码问题及解决办法"> <img width="480" height="400" src="/upload/rand_pic/2-06.jpg" alt="mysql关联两张表时的编码问题及解决办法"> </a> </div> <div class="vps-bb0281 item-content"> <p class="vps-e004f5 item-title"><a href="https://www.68vps.cn/jishu/89855.html" title="mysql关联两张表时的编码问题及解决办法">mysql关联两张表时的编码问题及解决办法</a></p> <p class="vps-969001 item-date"><i class="vps-cfa8e7 iconfont icon-shijian"></i>2025-04-02</p> </div> </li> <li> <div class="vps-41f320 item-img"> <a href="https://www.68vps.cn/jishu/89854.html" title="T-SQL中常用的set语句"> <img width="480" height="400" src="/upload/rand_pic/2-03.jpg" alt="T-SQL中常用的set语句"> </a> </div> <div class="vps-bb0281 item-content"> <p class="vps-e004f5 item-title"><a href="https://www.68vps.cn/jishu/89854.html" title="T-SQL中常用的set语句">T-SQL中常用的set语句</a></p> <p class="vps-969001 item-date"><i class="vps-cfa8e7 iconfont icon-shijian"></i>2025-04-02</p> </div> </li> <li> <div class="vps-41f320 item-img"> <a href="https://www.68vps.cn/jishu/89853.html" title="Oracle 12c RMAN新特性"> <img width="480" height="400" src="/upload/rand_pic/2-04.jpg" alt="Oracle 12c RMAN新特性"> </a> </div> <div class="vps-bb0281 item-content"> <p class="vps-e004f5 item-title"><a href="https://www.68vps.cn/jishu/89853.html" title="Oracle 12c RMAN新特性">Oracle 12c RMAN新特性</a></p> <p class="vps-969001 item-date"><i class="vps-cfa8e7 iconfont icon-shijian"></i>2025-04-02</p> </div> </li> </ul> </div> <!--最新文章end--> <div class="vps-55eaea widget"> <h3 class="vps-27079d widget-title"><span>随机文章</span></h3> <ul class="vps-519ca6 hot-item"> <li><a title="sql语句中with as的用法介绍" href="https://www.68vps.cn/jishu/83888.html" target="_blank">sql语句中with as的用法介绍</a></li> <li><a title="mysql文件在哪里看" href="https://www.68vps.cn/jishu/89273.html" target="_blank">mysql文件在哪里看</a></li> <li><a title="python关键字with的使用方法" href="https://www.68vps.cn/jishu/14988.html" target="_blank">python关键字with的使用方法</a></li> <li><a title="直方图与ACS实例分析" href="https://www.68vps.cn/jishu/76690.html" target="_blank">直方图与ACS实例分析</a></li> <li><a title="关于java设计模式详解" href="https://www.68vps.cn/jishu/68914.html" target="_blank">关于java设计模式详解</a></li> </ul> </div><!--随机文章end--> <div class="vps-55eaea widget"> <h3 class="vps-27079d widget-title"><span>TAGS标签</span></h3> <div class="vps-276fcb tagcloud"> </div> </div> <!--标签end--> </div> </div> </div> <!--底部start--> <footer class="vps-b51e96 footer"> <div class="vps-10a5c7 container"> <div class="vps-76582b footer-col"> <ul class="vps-3602b2 footer-nav"><li><a href="https://www.68vps.cn/jishu/">技术教程</a></li><li><a href="https://www.68vps.cn/bkzx/">百科资讯</a></li></ul> <div class="vps-69a920 copyright"><a href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">苏ICP备2023045616号</a> <p>本站部分内容来源于网络,如果你是该内容的作者,并且不希望本站发布你的内容,请与我们联系,我们将尽快处理!</p> </div> </div> </div> </footer> <div class="vps-27ed27 rollbar"> <ul class="vps-38a26f actions"> <li class="vps-2077ff contbar wx"><a href="javascript:;" rel="nofollow"><i class="vps-934fa5 iconfont icon-wechat"></i></a> <div class="vps-aa835e rtbar_shwx" style="display: none;"> <div class="vps-1419a2 rtbar_qrimg"><img src="/view/blog_moumou/images/weixin.png" alt=""><span>微信客服</span></div> </div> </li> <li class="vps-1089e0 contbar tel"><a rel="nofollow" href="https://wpa.qq.com/msgrd?v=3&uin=&site=qq&menu=yes" target="_blank"><i class="vps-cc2a50 iconfont icon-QQ-fill"></i></a></li> </ul> <div id="go-to-top" class="vps-ad918e rollbar-item" title="返回顶部" style="display: block;"><i class="vps-620d96 iconfont icon-xiangshang"></i></div> </div> <script type='text/javascript' src='/view/blog_moumou/js/jquery-1.8.3.min.js' id='jquery-js'></script> <script type='text/javascript' src='/view/blog_moumou/js/common.js' id='jquery-js'></script> <script type='text/javascript' src='/view/blog_moumou/js/theia-sticky-sidebar.js' id='jquery-js'></script> <!-- 统计代码 --><!-- 统计代码end --> <!--搜索伪静态--> <script> (function(){ $("#search_form,#search_form2").submit(function(){ var mid = $(this).find("[name='mid']").val(); var keyword = $(this).find("[name='keyword']").val(); window.location.href = "/search/"+encodeURIComponent(keyword)+"/"; return false; }); })(); </script> <!--搜索伪静态--> </body> </html>