Java Web基础——自定义标签和JSTL

来源:互联网 发布:淘宝卖家后台功能介绍 编辑:程序博客网 时间:2024/06/14 19:54

因为在Struts2中使用到了很多该框架的自定义标签的使用,所以在此特别梳理了一下有关的知识体系


标签(动作)的一般语法为:<prefix:标签名 属性表列>,如<jsp:include page="copyright.jsp" />,该标签的作用是把copyright.jsp页面的输出包含到当前页面的输出中

我们先来看一下常用的标准JSP动作动作指令,又可以叫做标签指令:

  • jsp:include 在当前页面包含另一个页面的输出
  • jsp:forward 将请求转发到指定的页面
  • jsp:usebean 查找或者创建一个JavaBeans对象
  • jsp:setProperty 设置JavaBeans的属性值
  • jsp:getProperty 返回JavaBeans的属性值
  • jsp:plugin 在JSP页面嵌入一个插件(如Applet)

以上的这些标准标签是JSP中内置的,所以不需要特别的生命便可使用。当然我们也可以根据需要定义自定义标签以实现特定的效果,下面我将系统的介绍自定义标签的创建和使用流程:


所谓自定义标签就是用Java语言开发的程序的,以特定的格式在JSP页面中使用的标签,自定义标签又被叫做自定义动作(Custom Action)。

我们这里主要介绍如何利用JSP2.0中的扩展标签API进行开发,而不再介绍传统JSP1.x中标签的开发,JSP2.0中简单的自定义标签开发更加简洁和使用。

 



一.简单自定义标签API的层次结构

标签类层次结构
  • Jsp接口是一个接口,该接口没有定义任何方法,只起到接口表示和类型安全的作用
  • SimpleTag接口用来实现结点的自定义标签,接口中定义了5个生命周期方法,下面我们会详细介绍
  • SimpleTagSupport类实现了SimpleTag接口,并且还定义了另外三个方法

 

二.自定义标签的开发步骤

  • 创建标签处理类
  • 创建标签库描述文件TLD(Tag Library Discriptor)
  • 在JSP页面中引入标签库和使用标签

下面我们将创建使用一个实现将标签体打印五次的自定义标签,并在之后说明其相关原理。

标签处理类

  1. public class HelloTag implements SimpleTag {  
  2.   
  3.     JspContext context = null;  
  4.     JspTag parent = null;  
  5.     JspFragment jspBody = null;  
  6.       
  7.     @Override  
  8.     public void doTag() throws JspException, IOException {  
  9.         StringWriter sw = new StringWriter();  
  10.         jspBody.invoke(sw);  
  11.         String bodyContent = sw.toString();  
  12.         JspWriter out = context.getOut();  
  13.         for(int i=0;i<5;i++){  
  14.             out.println(bodyContent);  
  15.         }  
  16.     }  
  17.     @Override  
  18.     public JspTag getParent() {  
  19.         return parent;  
  20.     }  
  21.     @Override  
  22.     public void setJspBody(JspFragment jspBody) {  
  23.                 this.jspBody=jspBody;  
  24.         }  
  25.     @Override  
  26.     public void setJspContext(JspContext jspContext) {  
  27.         context = jspContext;  
  28.     }  
  29.     @Override  
  30.     public void setParent(JspTag parent) {  
  31.         this.parent = parent;  
  32.     }  
  33. }  

标签库描述文件 sampleLib.tld,放在WEB-INF或者其子文件夹中


  1. <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"  
  3.     version="2.0">  
  4.     <tlib-version>2.0</tlib-version>  
  5.       
  6.     <short-name>hello</short-name>  
  7.     <uri>/testPath</uri>  
  8.       
  9.     <tag>  
  10.         <name>hello</name>  
  11.         <tag-class>com.mytream.HelloTag</tag-class>  
  12.         <body-content>scriptless</body-content>  
  13.     </tag>  
  14. </taglib>  



 

在JSP页面中使用该标签

hello.jsp

  1. <%@ page contentType="text/html" %>  
  2. <%@ taglib prefix="test"  uri="/testPath" %>  
  3. <html>  
  4.   <head>  
  5.     <title>Test Custom Tag</title>  
  6.   </head>  
  7.   <body>  
  8.         <test:hello>good</test:hello>  
  9.   </body>  
  10. </html>  

访问hello.jsp页面,我们将会看到good被连续打印了5遍,这是我们在doTag()方法中所做的操作,当然该标签的解析过程要比这复杂的多,下面我讲一一介绍。

 

三.容器解析自定义标签的过程

解析自定义标签流程图
上图不一定符合UML规范,仅仅是为了帮助理解。从上图我们可以看到tomcat容器在对JSP页面进行转换的过程中,一旦遇到用户自定义的标签便要通过如上三步进行解析并执行该标签所代表的动作。
1.通过标签的前缀找到该标签所对应的uri,该uri并不表示资源的具体位置,而是通过它可以建立与TLD文件中所定义标签的映射。在WEB-INF/下的TLD文件中找到<tag>标签中的<name>对应的<tag-class>,
也就是需要创建的类的对象的名字。利用反射机制创建HelloTag的示例
2.调用HelloTag的setXXX()方法,根据JSP页面中属性对应的值对HelloTag对象的属性值进行设置,这样我们就可以在自己定义的这些类中使用这些属性值了
3.调用HelloTag的doTag()方法,执行用户定义的相关操作

四.使用标准标签库JSTL(JSP Standard Tag Library)

既然我们能够自定义标签,我们当然也能够使用已经定义好的其他好的标签。
JSTL为我们提供了庞大的标签库,使用JSTL可以提高开发的效率,参考之前自定义标签的操作,要使用JSTL标签要进行如下操作:
  • 从<CATALINA_HOME>\webapps\examples\WEB-INF\lib中将jstl.jar和standard.jar文件复制到自己的项目中的WEB-INF\lib目录中
  • 在使用JSTL标签前进行声明,即用taglib指令来引用标签库,如<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • 使用,如<C:out value="Welcome to using JSTL" />将会输出Welcome to using JSTL.
JSTL相当庞大,共提供了5个库,如下表所示
JSTL库及使用的URI与前缀库名称使用的URI前缀核心标签库http://java.sun.com/jsp/jstl/corecXML标签库http://java.sun.com/jsp/jstl/xmlx国际化和格式化库http://java.sun.com/jsp/jstl/fmtfmtSQL标签库http://java.sun.com/jsp/jstl/sqlsql函数库http://java.sun.com/jsp/jstl/functionsfn
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 lv迷你水桶包肩带长了怎么办 在香港买个lv包包过海关怎么办 国际快递手表被海关查应该怎么办 把档案放到人才市场后报到证怎么办 皮表带带久了有异味怎么办 英语中用词不当和拼写错误怎么办 爬楼梯的购物车车轮坏了怎么办? 帮别人买东西不给我钱怎么办 老师念错名字有同学指出来你怎么办 老公婚前买的房子婆婆想霸占怎么办 我想查我的基金收益情况怎么办 儿童票买好了但大人退票了怎么办 没有享受到国家政策的农民怎么办? 股票涨了没抛然后一直跌怎么办 苹果手机放久了开不了机怎么办 部门要辞退你你不想走该怎么办 口头说辞职现在又不想走了怎么办 网上买的理财不给退本金怎么办 买东西遇到态度不好的人你会怎么办 app在下载东西时被停用了怎么办 买东西填错地址 但已签收怎么办 网购手机受骗后电话打不通怎么办 淘宝买的东西发错了怎么办 淘宝上买的东西发错了怎么办 淘宝上买的东西发多了怎么办 淘宝上买的东西出现问题怎么办 淘宝买东西未收到货显示签收怎么办 网上一张车票两人同时付款了怎么办 微信付款时显示银行卡被锁定怎么办 微信忘记支付密码怎么办没有银行卡 支付宝赏金扫码支付不行怎么办 网购收货时发现货物已破损怎么办 货物丢失了不承认调查出来了怎么办 小米商城已签收未收到了怎么办 网购的一只荷兰猪现在怎么办 中通快递的掌中通好评怎么办 唯品会快递被签收却没收到货怎么办 拼多多快递签收了但没收到货怎么办 顺丰代收签收成功要强制退款怎么办 淘宝付了钱如果商家没货了怎么办 别人拿走我的货不给钱怎么办