第七章_标签文件

benjaminwhx 2016-05-19

标签文件

7.2、第一个标签文件

下面是项目结构图:



下面是代码清单:

这是firstTag.tag文件

[html] view plain copy
 print?
  1. <%@ tag import="java.util.Date" import="java.text.DateFormat" %>  
  2. <%  
  3.     DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL) ;  
  4.     Date now = new Date(System.currentTimeMillis()) ;  
  5.     out.println(dateFormat.format(now)) ;  
  6. %>  


firstTagTest.jsp

[html] view plain copy
 print?
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %>  
  3. <html>  
  4.   <head>  
  5.     <title>My JSP 'firstTagTest.jsp' starting page</title>  
  6.   </head>  
  7.     
  8.   <body>  
  9.     Today is <easy:firstTag></easy:firstTag>  
  10.   </body>  
  11. </html>  


项目运行截图:


7.3、标签文件指令

jsp页面一样,标签文件可以利用指令来控制jsp容器如何编译和转换标签文件。标签文件指令的语法与jsp指令的语法一样:

<%@ directive (attribure=”value”)* %>

星号(*)表示括号中的内容可以不重复,也可以重复多次。这个语法可以用一种比较随意的方式进行改写:

<%@ directive attribute1=”value1” attribute2=”value2” ... %>

其中的属性必须用单引号或者双引号括起来,起始符号<%@后面的空格和结束符号%>前面的空格是可选的,不过使用空格可以提升可读性。

除了page之外,所有jsp指令在标签文件中都可以使用。这里不用page,而是用tag指令。而且,在标签文件中,还有另外两个指令可以使用:attributevariable。下面是可以在标签文件中使用的所有指令。

1、tag。该指令与jsp页面的page指令相似

2、include。用这个指令包含来自标签文件的其他资源

3、taglib。用这个指令从标签文件内部使用定制标签类库

4、attribute。用这个指令在标签文件中声明一个属性

5、variable用这个指令定义一个可以暴露给在调用jsp页面的变量

 

7.3.1tag指令

Tag指令的语法:

<%@ tag (attribute=”value”)* %>

以上语法用非正式的可以表示为:

<%@ tag attribute1=”value1” attribute2=”value2” ... %>

Tag指令的属性为:

display-name:通过XML工具显示的简称,默认值为标签文件名,没有tag扩展名。

body-content:关于这个标签主体内容的信息,它的值可以为emptytagdependentscriptless(默认)

dynamic-attributes:表名对动态属性的支持。它的值表示一个放置Map的有界属性,其中包含了这个调用期间传递的动态属性名和值

small-iconXML工具要用到的小图片文件相对于context的路径,或者相对于标签资源文件的路径。我们通常不使用这个属性。

large-icon:包含XML工具要用到的大图标图片文件相对于context的路径,或者相对于标签资源文件的路径。我们通常也不使用这个属性。

description:描述该标签的一个字符串。

example:该动作指令用法范例的一个非正式描述。

language:标签文件中使用的脚本语言。该属性值在当前jsp版本中必须为“Java

import:用于导入java类型,与page指令中的import属性相同。

pageEncoding:描述该标签文件的字符编码,这个值的形式为“charset”,必须是字符编码的IANA名称。该属性与page指令的pageEncoding属性相同。

isELIgnored:表名忽略还是运算EL表达式,该属性的默认值为“false”,意为运算EL表达式,该属性与page指令的isELIgnored属性相同。

除了import属性之外,所有其他属性在同一个标签文件的一个tag指令或者多个tag指令中都只能出现一次。例如,以下tag文件就是无效的,因为body-content属性不止一次地出现在多个tag指令中:

<%@ tag display-name=”first tag file” body-content=”scriptless”%>

<%@ tag body-content=”empty” %>


7.3.2、include指令

下面是项目代码片段:

includeDemoTag.tag

[html] view plain copy
 print?
  1. This tag file shows the use of whe include directive.  
  2. The first include directive demontrates how you can include  
  3. a static resource called included.html  
  4. <br />  
  5. Here is the content of included.html  
  6. <%@ include file="included.html" %>  
  7. <br />  
  8. <br />  
  9. The second include directive includes another dynamic resource:  
  10. included.tagf.  
  11. <br />  
  12. <%@ include file="included.tagf"  %>  

included.html

[html] view plain copy
 print?
  1. <table>  
  2.     <tr>  
  3.         <td><b>Menu</b></td>  
  4.     </tr>  
  5.     <tr>  
  6.         <td>CDs</td>  
  7.     </tr>  
  8.     <tr>  
  9.         <td>DVDs</td>  
  10.     </tr>  
  11.     <tr>  
  12.         <td>Others</td>  
  13.     </tr>  
  14. </table>  

included.tagf

[html] view plain copy
 print?
  1. <%  
  2.     out.print("Hello from included.tagf") ;  
  3. %>  

includeDemoTagTest.jsp

[html] view plain copy
 print?
  1. <%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %>  
  2. <easy:includeDemoTag></easy:includeDemoTag>  

打开浏览器输入地址:

http://localhost:8089/testTag/includeDemoTagTest.jsp


7.3.3taglib指令

利用taglib指令可以使用标签文件中的定制标签。taglib指令的语法如下:

<%@ taglib uri=”tagLibraryURI prefix=”tagPrefix””%>

uri属性指定一个绝对或相对的URI,用来唯一标识与这个前缀相关的标签类库描述符,prefix属性定义一个字符串,它将成为用于区分某个定制动作指令的前缀。

有了taglib指令,就可以通过以下格式使用不带内容主体的定制标签:

<prefix:tagName/>

或者通过以下格式使用带有内容主体的定制标签:

<prefix:tagName>body</prefix:tagName>

 

7.3.4attribute指令

attribute指令支持在标签文件中使用属性,它相当于标签类库描述符中的attribute元素。语法如下:

<%@ attribute (attribute=”value”) %>

上述语法也可以用一种非正式的形式进行表达,如:

<%@ attribute attribute1 = “value1” attribute2=”value2” ... %>

attribute中的name属性是必须的。属性列表如下:

name:该标签文件能够接受的属性名称,name属性值必须在整个当前标签文件中都是唯一的。

required:表明该属性是否是必须的,它的值可以是truefalse

fragment:表明该属性是一个要通过标签处理器进行运算的部分,或在传给标签处理器之前通过容器进行运算的一个普通属性。它的值为true或者false。如果该属性要通过标签处理器进行运算,则值为true

rtexprvalue:指定该属性值是否可以在运行时通过一个scriplet表达式进行动态计算。这个值为true(默认值)或者false

type:属性值的类型,默认为java.lang.String

description:这个属性的描述

下面是这个指令的测试:

encode.tag:

[html] view plain copy
 print?
  1. <%@ attribute name="input" required="true" %>  
  2. <%!   
  3.     private String encodeHtmlTag(String tag){  
  4.         if(tag == null){  
  5.             return null ;  
  6.         }  
  7.         int length = tag.length() ;  
  8.         StringBuilder encodedTag = new StringBuilder(2 * length) ;  
  9.         for(int i=0; i<length; i++){  
  10.             char c = tag.charAt(i) ;  
  11.             if(c == '<'){  
  12.                 encodedTag.append("<") ;  
  13.             }else if(c == '>'){  
  14.                 encodedTag.append(">") ;  
  15.             }else if(c == '&'){  
  16.                 encodedTag.append("&") ;  
  17.             }else if(c == '"'){  
  18.                 encodedTag.append(""") ;  
  19.             }else if(c == ' '){  
  20.                 encodedTag.append(" ") ;  
  21.             }else{  
  22.                 encodedTag.append(c) ;  
  23.             }  
  24.         }  
  25.         return encodedTag.toString() ;  
  26.     }  
  27. %>  
  28. <%=encodeHtmlTag(input)%>  

encodeTagTest.jsp

[html] view plain copy
 print?
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%@ taglib prefix="easy"  tagdir="/WEB-INF/tags" %>  
  3. <html>  
  4.   <head>  
  5.     <title>My JSP 'encodeTagTest.jsp' starting page</title>  
  6.   </head>  
  7.     
  8.   <body>  
  9.     <easy:encode input="<br />Hello CSDN" />  
  10.   </body>  
  11. </html>  



7.3.5variable指令

variable指令的语法如下:

<%@ variable (attribute=”value”)* %>

非正式形式的表达语法如下:

<%@ variable attribute1=”value” attribute2=”value2” %>

variable指令的属性如下:

name-given:将要在调用JSP页面的脚本语言或者EL表达式中使用的变量名称。如果使用name-form-attribute,就不能再用name-given属性,反之亦然。name-given的值不能与该标签文件中的任何属性值相同。

name-from-attribute:该属性与name-given类似,但是它的值应该是一个属性的名称,并且它在开始进行标签调用之时提供变量名称,如果同时指定name-givenname-form-attribute属性,或者这两者都没有指定,那么将会产生编译错误。

alias:这是一个局部范围的属性,用于存放该变量的值。

variable-class:该变量的类型,默认为java.lang.String

declare:表明是在调用页面中声明该变量,还是在调用之后在标签文件中声明。默认值为true

scope:所定义脚本变量的范围,其可能值为AT_BEGINAT_ENDNESTED(默认)

description:该变量的描述

你可能会问,如果可以将处理结果直接输出到在调用jsp页面的JspWriter,那么为什么还需要variable指令呢?这是因为,只将String发送到JspWriter,会导致在调用的Jsp页面丧失如何使用该结果的灵活性。例如将服务器的当前如期以long格式输出。如果你还想以short格式提供服务器的当前日期,那么就必须另外编写一个标签文件。有两个标签文件来完成类似功能时,会增加不必要的维护问题。替代做法是,在标签文件中暴露两个变量:longDateshortDate

 

下面是测试代码:

varDemo.tag

[html] view plain copy
 print?
  1. <%@ tag import="java.util.Date" import="java.text.DateFormat" %>  
  2. <%@ variable name-given="longDate" %>  
  3. <%@ variable name-given="shortDate" %>  
  4. <%  
  5.     Date now = new Date(System.currentTimeMillis()) ;  
  6.     DateFormat longFormat = DateFormat.getDateInstance(DateFormat.LONG) ;  
  7.     DateFormat shortFormat = DateFormat.getDateInstance(DateFormat.SHORT) ;  
  8.     jspContext.setAttribute("longDate", longFormat.format(now)) ;  
  9.     jspContext.setAttribute("shortDate", shortFormat.format(now)) ;  
  10. %>  
  11. <jsp:doBody></jsp:doBody>  

varDemoTest.jsp

[html] view plain copy
 print?
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%@ taglib tagdir="/WEB-INF/tags" prefix="easy" %>  
  3. <html>  
  4.   <head>  
  5.     <title>My JSP 'varDemoTest.jsp' starting page</title>  
  6.   </head>  
  7.     
  8.   <body>  
  9.   Today's date:  
  10.     <easy:varDemo>  
  11.         In long format: ${longDate}  
  12.         <br />  
  13.         In short format: ${shortDate}  
  14.     </easy:varDemo>  
  15.   </body>  
  16. </html>  

有时候,会需要用到变量。再举个例子。假设你需要编写一个定制动作指令,用来从数据库中获取某个指定产品标识符的产品详细信息。为此,可以用一个attribute来设置产品表示符,并用一个变量来保存每一条信息。因此,最终你会有这些变量:namepricedescriptionimageUrl等。


7.4doBody

标签动作指令doBody只能通过标签文件内部进行使用。我们可以用它调用标签的主体。

doBody动作指令可以带有属性。如果需要将标签调用的结果导入到某个变量中,就可以使用这些属性。如果使用doBody时不带属性,那么标准动作指令doBody就会将输出结果写入在所调用JSP页面的JspWriter中。

标准指令doBody的属性如下:

var:这是一个限域属性名称,用来保存标签主体调用的输出。它的值保存为java.lang.StringvarvarReader二者不能同时存在。

varReader:这是一个限域属性名称,用来保存标签主体调用的输出。它的值保存为java.io.ReadervarvarReader二者不能同时存在。

scope:结果变量的范围。


下面是对于doBody的例子:

doBodyDemo.tag

[html] view plain copy
 print?
  1. <jsp:doBody var="referer" scope="session"></jsp:doBody>  

main.jsp
[html] view plain copy
 print?
  1. <%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>  
  2. Your referer header:${header.referer}  
  3. <br/>  
  4. <tags:doBodyDemo>  
  5.     ${header.referer}  
  6. </tags:doBodyDemo>  
  7. <a href="viewReferer.jsp">View</a> the referer as a session attribute.  


viewReferer.jsp

[html] view plain copy
 print?
  1. The referer header of the previous page is ${sessionScope.referer}  

searchEnginer.html

[html] view plain copy
 print?
  1. Please click <a href="main.jsp">here</a>  




7.5invoke

invoke标准动作指令与doBody相似,可以在标签文件中用来调用一个fragment属性。前面说过,属性可以带有一个fragment属性,它的值为truefalse。如果fragment属性值为true,那么该属性就是一个fragment属性,你可以根据需要通过标签文件对它进行多次调用。invoke也可以带有属性。invoke的属性如下,注意:只有fragment属性是必须的。

fragment:在这个标签调用期间用于标识该fragment的名称。

var:这是一个限域属性名称,用来保存标签主体调用的输出。它的值保存为java.lang.StringvarvarReader属性二者不能同时存在。

scope:结果变量的范围。

下面是对于invoke的例子:

invokeDemo.tag

[html] view plain copy
 print?
  1. <%@ attribute name="productDetails" fragment="true" %>  
  2. <%@ variable name-given="productName" %>  
  3. <%@ variable name-given="description" %>  
  4. <%@ variable name-given="price" %>  
  5. <%  
  6.     jspContext.setAttribute("productName", "Pelesonic DVD Player") ;  
  7.     jspContext.setAttribute("description", "Dolby Digital output through coaxial digital-audio jack,"+  
  8.             " 500 lines horizontal resoulution-image digest viewing") ;  
  9.     jspContext.setAttribute("price", "65") ;  
  10. %>  
  11. <jsp:invoke fragment="productDetails"></jsp:invoke>  

invokeTest.jsp

[html] view plain copy
 print?
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %>  
  3. <html>  
  4.   <head>  
  5.     <title>My JSP 'invokeTest.jsp' starting page</title>  
  6.   </head>  
  7.     
  8.   <body>  
  9.     <easy:invokeDemo>  
  10.         <jsp:attribute name="productDetails">  
  11.             <table width="220" border="1">  
  12.                 <tr>  
  13.                     <td><b>ProductName</b></td>  
  14.                     <td><b>${productName}</b></td>  
  15.                 </tr>  
  16.                 <tr>  
  17.                     <td><b>Description</b></td>  
  18.                     <td><b>${description}</b></td>  
  19.                 </tr>  
  20.                 <tr>  
  21.                     <td><b>Price</b></td>  
  22.                     <td><b>${price}</b></td>  
  23.                 </tr>  
  24.             </table>  
  25.         </jsp:attribute>  
  26.     </easy:invokeDemo>  
  27.   </body>  
  28. </html>  

下面是结果截图:

登录 后评论
下一篇
corcosa
12372人浏览
2019-10-08
相关推荐
7.1.4 ScrollView结合案例详解
760人浏览
2011-07-26 17:50:00
7.5 TableLayout布局详解
790人浏览
2011-07-20 10:17:00
(第七天)DOM练习一
353人浏览
2015-08-08 18:30:00
7.1.5 选项卡结合案例详解
924人浏览
2011-07-27 08:59:00
silverlight.js详解.
443人浏览
2008-05-10 00:32:00
(第七天)DOM练习一
482人浏览
2017-11-13 14:46:00
0
0
0
993