分享

JSP中Tag文件与Tag标记

 zjwei1121 2016-07-07

引入原因

多个JSP页面的共用信息可以放在一个单独JSP文件中,然后用Include指令或动作载入,实现代码复用。缺点是用户可以直接访问这些JSP文件(我们可能不希望用户访问),且include载入的文件可以放在任意目录中,目录显得杂乱不利维护。
解决方法:引入Tag文件。它是一种特殊的文本文件,扩展名为.tag,和JSP文件很类似,可以被JSP页面动态加载调用,但是用户不能通过该Tag文件所在Web服务目录直接访问这个Tag文件。
优点:将数据处理的代码放在Tag文件中,JSP页面只负责显示,实现数据处理和显示分离。

Tag文件使用

首先在project的web-inf目录下创建tags子目录,所有tag文件必须保存在该目录下。然后右键tags文件夹—-new—-other—-web—-JSP tag创建tag文件。

tag文件使用示例:

Show.tag

body>P><% int size=1; for(int i=1;i<=3;i++){ size=size+1;%> jsp:doBody /><%}%>P>body>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

examlpe3-2.jsp

<%@page contentType='text/html; charset=gb2312' %><%-- 先使用taglib指令引入标记库 --%><%@taglib prefix='look' tagdir='/WEB-INF/tags' %>HTML><%-- 使用<标记前缀:定义好的标记名>调用标记 --%> look:Show> 我是一只小鸭子 <%-- 标记体 --%> look:Show> look:Show> 咿呀咿呀哟 look:Show> HTML>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

说明:Tag文件名Show对应着一个标记;Tags目录下所有文件集合称自定义标记库或标记库。
工作原理:JSP 引擎把Tag文件转换成Java文件,并编译成class文件供JSP程序动态调用。标记体传给Tag文件, Tag文件使用接受标记体信息。

Tag文件中的常用指令

Tag指令

Tag文件中的tag指令类似于JSP文件中的page指令。Tag文件通过使用tag指令可以指定某些属性的值,以便从总体上影响Tag文件的处理和表示。tag指令的语法如下:

<%@ tag 属性1='属性值' 属性2='属性值' …属性n='属性值'%>

在一个Tag文件中可以使用多个tag指令:

<%@ tag 属性1='属性值'%><%@ tag 属性2='属性值'%>……<%@ tag 属性n='属性值'%>

tag指令可以操作的属性有:body-content、language、import、pageEncoding。

Tag指令:body-content属性

属性值有:empty、tagdependent、scriptless,默认值是scriptless。
Empty:JSP页面必须使用没有标记体的Tag标记

Tag指令:language属性

指定Tag文件使用的脚本语言,目前只能取值java,其默认值就是java。

Tag指令:import属性

为Tag文件引入Java核心包中的类。import属性可以取多个值。
import属性已经有如下值:
“java.lang.*”
“javax.servlet.*”
“javax.servlet.jsp.*”
“javax.servlet.http.*”

Tag指令:pageEncoding属性

指定Tag文件的字符编码,其默认值是ISO-8859-1。

include指令

使用方法和作用与JSP文件中的include指令标记类似。
include指令标记的作用是在Tag文件中出现该指令的位置处,静态插入一个文件。其语法格式如下:

<%@ include file= '文件的URL' %>

attribute指令

在Tag文件中通过使用attribute指令,可以让使用它的JSP页面向该Tag文件传递需要的数据,增强Tag文件功能。指令的格式如下:

<%@ attribute name='对象名字' required='true'|'false' type='对象的类型'%>

name属性是必需的,JSP页面向它传递一个引用。比如,一个Tag文件MyTag.tag中有如下attribute指令:

<%@ attribute name='length' required='true' %>

那么JSP页面就可以如下使用Tag标记(假设标记的前缀为computer)调用MyTag.tag:

我向Tag文件中传递的值是1000

required属性可选。缺省值是false。若设为true,则JSP页面必须向Tag文件的attribute属性传递一个引用,否则出错。
type属性指定对象的类型。如type=“Java.util.Date”,如果缺省,则类型是java.lang.String。

variable指令

Tag文件通过使用variable指令可以将Tag文件中的对象返回给调用该Tag文件的JSP页面。

variable指令的格式:

<%@ variable name-given=“对象名字” variable-class=“对象的类型” scope=“有效范围”%>

例:

<%@ variable name-given='time' variable-class='java.util.Date' scope='AT_END' %>
  1. name-given属性是必需的。
  2. variable-class可以是java.lang.String(缺省值)等类型。
  3. scope属性表示在JSP页面中何时何地可以使用返回的对象。各属性值如下:
    AT_BEGIN: 一旦开始使用Tag标记,就可以在任何地方用对象;
    NESTED:只可以在标记体中使用对象;
    AT_END:只可以在标记结束后才可以使用对象;

对象的返回

以下的variable指令:

<%@ variable name-given='time' variable-class='java.util.Date' scope='AT_END' %>

为JSP页面返回名字是time的Date对象

Tag文件只有将对象信息存储到jspContext中,JSP页面才可以使用该对象。jspContext调用setAttribute(“对象的名字”,对象的引用)方法存储对象的名字以及该对象的引用。比如:jspContext.setAttribute(“time”,new Date());将名字是time的Date对象存储到jspContext中。
代码示例:

GiveDate.tag

<%@ tag import='java.util.*' %><%@ variable name-given='time' variable-class='java.util.Date' scope='AT_END' %> <% jspContext.setAttribute('time',new Date()); %><%@ tag language='java' pageEncoding='US-ASCII'%>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

lookTime.jsp

<%@ page contentType='text/html;charset=gb2312' %><%@ page import ='java.text.*' %><%@ taglib tagdir='/WEB-INF/tags' prefix='showTime'%>HTML>BODY> showTime:GiveDate />

当前时间:

<%= time %> %--使用返回的time对象 --%>/BODY>HTML>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

taglib指令

一个Tag文件可以使用Tag标记来调用其它的Tag文件。Tag文件也必须使用指令引入该Web服务目录下的标记库,才可以使用Tag标记来调用相应的Tag文件。指令的格式如下:

<%@ taglib tagdir='自定义标记库的位置' prefix='前缀'>

一个Tag文件也可以使用几个指令标记引入若干个标记库,例如:

<%@ taglib tagdir='/WEB-INF/tags' prefix='beijing'%><%@ taglib tagdir='/WEB-INF/tags/tagsTwo' prefix='dalian'%> 。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多