Tag File文件的理解

从Jsp 2.0开始,通过tag file的方式,无需编写标签处理类和标签描述文件(tld),也能够自定义标签。一个tag file和jsp页面一样,他拥有指令、脚本、EL表达式、动作元素、以及自定义标签。一个tag file文件以tag or tagx 为后缀,一个被其他文件包含的tag file 应该以tagf为后缀。

Tag File基础知识:

当使用tag file时需要注意以下两点:
(1)tag文件必须放在应用路径/WEB-INF/tags目录下才能生效;
(2)在页面引用的时候,Tag名和Tag file文件的名字是默认一样的(例如firstTag.tag在页面中的对应的标签名为firstTag)
Tag file中也有内置隐藏对象,类似jsp一样

对象 类型
request javax.servlet.http.HttpServletRequest
response javax.servlet.http.HttpServletResponse
out javax.servlet.jsp.JspWriter
session javax.servlet.http.HttpSession
application javax.servlet.ServletContext
config javax.servlet.ServletConfig
jspContext javax.servlet.jsp.JspContext

先举一个简单的例子:显示当前时间的tag file

//首先是firstTag.tag文件

<%@ tag import="java.util.Date" import="java.text.DateFormat" pageEncoding="utf-8"%>

<%
    DateFormat dateFormat = 
            DateFormat.getDateInstance(DateFormat.LONG);
    Date now = new Date(System.currentTimeMillis());
    out.println(dateFormat.format(now));
%>

//测试页面代码

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="easy"  tagdir="/WEB-INF/tags" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
    <easy:firstTag/>
</body>
</html>

但是在理解dobody指令和invoke指令的时候看书时没看明白两者区别:
(1)doBody动作元素用来调用标签的本体内容,该标签也可以有属性,你可以通过这些属性来指定某个变量来接收主题内容,如果不使用这些指令,那么doBody动作元素会把主体内容写到Jsp页面的JspWriter上,该标签有如下非必须属性:

var - 给出变量名, 把片段经过 jsp 容器计算过之后的结果作为字符串保存.
varReader - 同上, 不过将结果作为一个 java.io.Reader 保存. 和var不能共存
scope - 作用域

doBodyDemo.tag 将便签主题存到session范围内的referer变量内
<jsp:doBody var="referer" scope="session"/>

main.jsp使用了doBodyDemo标签,将${header.referer}存到session范围内的referer变量中

%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
    your referer header:${header.referer}
    <br/>
    <easy:doBodyDemo>
        ${header.referer}
    </easy:doBodyDemo>
    <a href="viewReferer.jsp">view</a>
</body>
</html>

(2)invoke动作元素和doBody类似,invoke标签比dobody标签多一个fragment属性。在tag file中可以使用它调用一个fragment(关于fragment的定义网上百度如下:javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段,这段JSP片段中不能包含JSP脚本元素。)在定义属性attribute指令中有一个fragment属性,如果属性为true就意味着这个属性就是一个fragment。

参照这篇博客jsp2.0+中的标签文件,JSP Fragment技术我才明白fragment主要适用于用于网页布局和修饰,可以将网页的内容和页面的结构分离,从而达到页面结构共享的目的。


这里把引用博文例子再写一遍:
1 首先在项目的WEB-INF/tags文件中,新建如下内容的tpl.tag文件

<%@ tag language="java" pageEncoding="UTF-8"%>
 <%@ attribute name="title"%>
 <%@ attribute name="tpl1" fragment="true" required="true"%>
 <%@ attribute name="tpl2" fragment="true" required="true"%>
 <%@ attribute name="tpl3" fragment="true" required="true"%>
 <!DOCTYPE html>
      <html>
          <head>
             <meta charset="utf-8">
             <title>${title}</title>
             <style type="text/css">
                #div1,#div2,#div3{
                   width:90%;
                  margin:10px auto;
                  border:10px solid red;
                }
             </style>
         </head>
        <body>
            <h1>jsp2.0标签文件</h1>
             <div id="div1">
                 <jsp:invoke fragment="tpl1"/>
             </div>
            <div id="div2">
                 <jsp:invoke fragment="tpl2"/>
             </div>
            <div id="div3">
                 <jsp:invoke fragment="tpl3"/>
             </div>
             <h2>jsp2.0 fragment技术</h2>
         </body>
    </html>

2.创建test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="xjo" tagdir="/WEB-INF/tags"%>
<xjo:tpl title="jsp标签文件的使用">
    <jsp:attribute name="tpl1">
        <h1>tpl1中的内容</h1>
    </jsp:attribute>
    <jsp:attribute name="tpl2">
        <h1>tpl2中的内容</h1>
    </jsp:attribute>
    <jsp:attribute name="tpl3">
        <h1>tpl3中的内容</h1>
    </jsp:attribute>
</xjo:tpl>

运行结果如下
这里写图片描述

猜你喜欢

转载自blog.csdn.net/whp404/article/details/76439017
tag