JSP标记学习笔记(转)

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><LINK REL=STYLESHEET HREF=”JSP-styles.css”</P><p>   TYPE=”text/css”></P><p><HEAD></P><p><BODY></P><p><H1><B><csajsp:example /></B><H1> /使用标记</P><p><B><csajsp:example /></B></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><B>注意</B>:属性名message是小写的,设置函数中的Message是大写的。</P><p>◆与之相关的在tld文件中需要在tag元素中添加如下元素</P><p><tag></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文件中引用为:<prefix : name message = “ Hello!” /></P><p>⑵ 使用标记正文</P><p> 即是在标记中使用一些包含jsp脚本元素、文本等的内容,这些内容由jsp引擎处理。</P><p> 形式如下:</P><p> <prefix : tagname> body(正文内容) <prefix : tagname></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><B>注意</B>:这里和⑵中介绍的输出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>  <STRONG>I love you!</STRONG><BR></P><p>  <EM>I love you!<EM></P><p>  </csajsp:filter></P><p>  这样,在浏览器中输出的标记正文应当是</P><p><STRONG>I love you!</STRONG><BR></P><p><EM>I love you!<EM></P><p> 而不是</P><p><B> I love you!</B></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>  <B>ifTag parent = (IfTag)findAncestorWithClass(this,IfTag.class); /</B>/获取父标记对应的对象</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>  <B>ifTag parent = (IfTag) findAncestorWithClass(this , IfTag.class) ;</B></P><p>  String bodyString = getBodyContent() . getString() ;</P><p>  If (bodyString.trim().equals(“true”)) {</P><p>    <B>Parent.setCondition(true)  /</B>/访问父标记处理类中的方法</P><p>  }else {</P><p>    <B>parent.setCondition(false)</B> ;</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> <p> 网页题目:<a href="https://www.cdcxhl.com/article18/pocegp.html">JSP标记学习笔记(转)</a> <br> 标题URL:<a href="https://www.cdcxhl.com/article18/pocegp.html">https://www.cdcxhl.com/article18/pocegp.html</a> </p> <p> <a href="https://www.cdcxhl.com/" target="_blank">成都网站建设公司</a>_<a href="https://www.cdcxhl.cn/" target="_blank">创新互联</a>,为您提供<a href="https://www.cdcxhl.com/news/ymzc/">域名注册</a>、<a href="https://www.cdcxhl.com/news/daohang/">网站导航</a>、<a href="https://www.cdcxhl.com/news/paiming/">网站排名</a>、<a href="https://www.cdcxhl.com/news/appsheji/">App设计</a>、<a href="https://www.cdcxhl.com/news/cehua/">网站策划</a>、<a href="https://www.cdcxhl.com/news/host/">虚拟主机</a> </p> <p class="adpic"> <a href="https://www.cdcxhl.com/service/ad.html" target="_blank" class="ad">广告</a> <a href="" target="_blank" class="adimg"><img src=""></a> </p> <p class="copy"> 声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: <a href="https://www.cdcxhl.com/" target="_blank">创新互联</a> </p> </div> <div class="newsmorelb"> <p>猜你还喜欢下面的内容</p> <ul> <li> <a href="/article16/pocegg.html">传输文件</a> </li><li> <a href="/article14/pocege.html">怎样实现小程序的举报功能?</a> </li><li> <a href="/article12/pocegc.html">云存储多少钱一个月</a> </li><li> <a href="/article10/pocego.html">如何实现网页在各种分辨率和浏览器中均可正常显示</a> </li><li> <a href="/article8/poceip.html">SpringBoot如何集成Druid监控</a> </li><li> <a href="/article6/poceig.html">决定数组所占内存单元的因素是什么</a> </li><li> <a href="/article4/poceie.html">如何使用Android实现3秒钟自动关闭界面</a> </li> </ul> </div> </div> <div class="col-lg-3 noneb"> <a href="https://www.cdcxhl.com/" title="成都定制网站建设" target="_blank"><img src="/upload/news/dingzhikaifa.png" alt="成都定制网站建设" class="img-responsive"></a> <div class="bkright"> <p><a href="https://www.cdcxhl.com/news/qiyewangzhan/">企业网站制作知识</a></p> <ul> <li> <a class="text_overflow" href="/news7/256207.html">企业网站制作好后维护管理的重要性</a> <span>2023-04-22</span> </li><li> <a class="text_overflow" href="/news13/258063.html">影响企业网站制作时间的一些因素</a> <span>2023-05-05</span> </li><li> <a class="text_overflow" href="/news44/135494.html">唯有了解企业网站制作的原则,才能让自己的网站走的更正、更远</a> <span>2021-11-12</span> </li><li> <a class="text_overflow" href="/news10/47760.html">成都网站建设谈企业网站制作都有哪些收费项目?</a> <span>2016-10-14</span> </li><li> <a class="text_overflow" href="/news12/7612.html">企业网站制作按照这些步骤更具营销价值!</a> <span>2013-05-03</span> </li><li> <a class="text_overflow" href="/news24/226224.html">企业网站制作必须要做备案吗?</a> <span>2022-12-29</span> </li><li> <a class="text_overflow" href="/news14/139314.html">企业网站制作应注意的几点您知道吗</a> <span>2021-12-07</span> </li><li> <a class="text_overflow" href="/news27/130077.html">企业网站制作交换友情链接时要注意哪些问题</a> <span>2021-10-07</span> </li><li> <a class="text_overflow" href="/news2/245152.html">公司企业网站制作选择设计团队非常关键</a> <span>2023-03-17</span> </li><li> <a class="text_overflow" href="/news3/47853.html">成都网站建设之企业网站制作如何避免几个弊端</a> <span>2016-10-23</span> </li><li> <a class="text_overflow" href="/news41/257141.html">企业网站制作好后可以通过哪些渠道获取客户</a> <span>2023-04-28</span> </li><li> <a class="text_overflow" href="/news46/150046.html">广州企业网站制作的步骤</a> <span>2022-05-04</span> </li> </ul> </div> <div class="bkright tag"> <p><a href="https://www.cdcxhl.com/hangye/link.html" target="_blank">各行业网站</a></p> <ul> <li class="col-lg-6 col-md-6 col-sm-6 col-xs-6"> <a href="https://www.cdcxhl.com/hangye/zsljbc/" target="_blank">自上料搅拌车</a> </li><li class="col-lg-6 col-md-6 col-sm-6 col-xs-6"> <a href="https://www.cdcxhl.com/hangye/bgcl/" target="_blank">办公窗帘</a> </li><li class="col-lg-6 col-md-6 col-sm-6 col-xs-6"> <a href="https://www.cdcxhl.com/hangye/sqwhq/" target="_blank">社区文化墙</a> </li><li class="col-lg-6 col-md-6 col-sm-6 col-xs-6"> <a href="https://www.cdcxhl.com/hangye/mutuopan/" target="_blank">木托盘</a> </li><li class="col-lg-6 col-md-6 col-sm-6 col-xs-6"> <a href="https://www.cdcxhl.com/hangye/opp/" target="_blank">OPP胶袋</a> </li><li class="col-lg-6 col-md-6 col-sm-6 col-xs-6"> <a href="https://www.cdcxhl.com/hangye/hntjbj/" target="_blank">混凝土搅拌机</a> </li><li class="col-lg-6 col-md-6 col-sm-6 col-xs-6"> <a href="https://www.cdcxhl.com/hangye/huisuosj/" target="_blank">会所设计</a> </li><li class="col-lg-6 col-md-6 col-sm-6 col-xs-6"> <a href="https://www.cdcxhl.com/hangye/fadianji/" target="_blank">柴油发电机</a> </li> </ul> </div> </div> </div> <footer> <div class="carousel-inner footjz"> <div class="container"> <i class="icon iconfont zbw"></i> 高品质定制 <i class="icon iconfont"></i> 跨终端自动兼容 <i class="icon iconfont"></i> 节约开发成本 <i class="icon iconfont"></i> 开发周期短 <i class="icon iconfont"></i> 一体化服务 <button type="button" class="btn btn-default btn-lg" onClick="window.location.href='tencent://message/?uin=631063699&Site=&Menu=yes'"> 立即开始2800定制网站建设</button> <button type="button" class="btn btn-default btn-xs" onClick="window.location.href='tencent://message/?uin=631063699&Site=&Menu=yes'"> 2800定制网站建设</button> </div> </div> <div class="carousel-inner bqsy"> <div class="container"> <div class="lxfs"> <h4 class="yutelnone">028-86922220 13518219792</h4> <h4 class="yutelblock"><a href="tel:02886922220">028-86922220</a> <a href="tel:13518219792">13518219792</a></h4> <a class="btn btn-default" href="tencent://message/?uin=532337155&Site=&Menu=yes" role="button">网站建设<span>QQ</span>:532337155</a> <a class="btn btn-default" href="tencent://message/?uin=631063699&Site=&Menu=yes" role="button">营销推广<span>QQ</span>:631063699</a> <a class="btn btn1 btn-default" href="mqqwpa://im/chat?chat_type=wpa&uin=532337155&version=1&src_type=web&web_src=oicqzone.com" role="button">网站制作<span>QQ</span>:532337155</a> <a class="btn btn1 btn-default" href="mqqwpa://im/chat?chat_type=wpa&uin=631063699&version=1&src_type=web&web_src=oicqzone.com" role="button">营销推广<span>QQ</span>:631063699</a> <a class="btn btn-default nonea" href="tencent://message/?uin=1683211881&Site=&Menu=yes" role="button">售后QQ:1683211881</a> <div class="dz">专注: <a href="http://www.cqcxhl.com/" target="_blank">重庆网站制作</a><a href="http://www.36103.cn/" target="_blank">成都网站制作</a><a href="https://www.cdcxhl.com/wangzhandingzhi.html" target="_blank">企业网站定制</a><a href="http://www.cdkjz.cn/wangzhan/qiye/" target="_blank">企业网站设计</a><a href="http://www.cxhlcq.com/zhizuo/" target="_blank">企业网站制作</a> <address>地址:成都太升南路288号锦天国际A幢10楼</address> </div> </div> <div class="bzdh dz"><img src="../imges/bottom_logo.png" alt="创新互联"> <p><a href="https://www.cdcxhl.com/menu.html" target="_blank">成都创新互联科技有限公司</a><br> Tel:400-028-6601(7x24h)</p></div> </div> </div> </footer> </body> </html>