刚进新公司不久,今天在看到项目中用到了.tag文件。刚开始我还以为这个是第三方类似freemarker的模板技术。问了下项目组的其他人员,原来这是jsp2.0以来就有的JSP Fragment技术。以前做项目的时候从来没有用这样的方式,要公用就用用jsp中的include和jsp:include的方式。其实JSP Fragment也有include的作用,但是它更像第三方sitemesh技术,用于网页布局和修饰,可以将网页的内容和页面的结构分离,从而达到页面结构共享的目的。下面的例子来说明怎么使用jsp fragment。

官方E文参考文档http://docs.oracle.com/javaee/5/tutorial/doc/bnama.html

DEMO

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  创建index.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>

3 访问index.jsp页面,效果如下

具体说明

标签文件说明

标签文件必须存放在WEB-INF目录下,最好是在WEB-INF目录下再新建一个tags目录,然后将所有的标签文件都存放在这里。标签文件可以使用所有的JSP元素,但是不能使用page指令,标签文件多个一个tag指令

标签文件中隐藏对象

标签文件可以使用隐藏对象:request、response、jspContext、session、application、out、config,其中jspContext隐含对象的类型为javax.servlet.jsp.JspContext,就相当于JSP页面的pageContext隐藏对象一样

标签文件中指令

标签文件中可以使用的主要指令:tag、include、attribute、variable。

tag指令

Tag文件中的tag指令类似于JSP文件中的page指令。Tag文件通过使用tag指令可以指定某些属性的值,以便从总体上影响Tag文件的处理和表示。tag指令的语法如下:
<%@ tag 属性1="属性值" 属性2="属性值" …属性n="属性值"%>
在一个Tag文件中可以使用多个tag指令,因此我们经常使用多个tag指令为属性指定需要的值:
 <%@ tag 属性1="属性值"%>
 <%@ tag 属性2="属性
 值"%>
 ……
 <%@ tag 属性n="属性值"%>
 <%@ tag language="java"
         pageEncoding=""
         body-content="scriptless|empty|tagdependent"
         deferredSyntaxAllowedAsLiteral="false"
         description=""
         display-name=""
         dynamic-attributes=""
         example=""
         import=""
         isELIgnored="false"
         large-icon=""
         small-icon=""
         trimDirectiveWhitespaces="false"
 %>

include 指令

和jsp中的include指定一样,引入外部文件
<%@include file="" %>

attribute指令

在Tag文件中通过使用attribute指令,可以动态地向该Tag文件传递需要的字符串数据
 <%@ attribute name=""
               description=""
               fragment="false"
               required="false"
               rtexprvalue="true"
               type=""
 %>
name表示属性的名字;
required表示是否为必要,默认为false;
rtexprvalue表示属性值是否可以为run-time表达式。如为true,表示属性可用动态的方式来指定,如为false,则一定要用静态的方式来指定属性值;
type表示这个属性的类型,默认值为java.lang.String;
description用来说明此属性的相关信息
fragment  表示是否为片段 默认false

variable指令

Tag文件通过使用variable指令可以将Tag文件中的对象返回给调用该Tag文件的JSP页面
<%@ variable alias=""
             declare="true"
             description=""
             name-from-attribute=""
             name-given=""
             scope="NESTED|AT_BEGIN|AT_END"%>
name-given表示直接指定变量的名称;
name-from-attribute表示以自定义标签的某个属性值为变量名称;
alias表示声明一个局部范围属性,用来接收变量的值;
variable-class表示变量的类名称,默认值为java.lang.String;
declare表示此变量是否声明默认值为true;
scope表示此变量的范围,范围是:AT_BEGIN、AT_END和NESTED,默认值为NESTED;
description用来说明此变量的相关信息

标签文件中的jsp:invoke

 <jsp:invoke fragment=""
         var=""
         scope="page|request|session|application"
         varReader=""/>
    fragment  -  要片段名.
   var  -  给出变量名,  把片段经过 jsp 容器计算过之后的结果作为字符串保存. 
   varReader  -  同上,  不过将结果作为一个 java.io.Reader 保存. 
   scope  -  作用域 
未完待续.......................

jsp2.0+中的标签文件,JSP Fragment技术的更多相关文章

  1. VC++ 6.0中添加库文件和头文件

    附加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools>Options>Directories>Include files. 对于特定项目的头文件包含,在& ...

  2. VC6.0中添加库文件和头文件

    附加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools>Options>Directories>Include files. 对于特定项目的头文件包含,在“ ...

  3. VC 6.0中添加库文件和头文件 【转】

    本文转载自:http://blog.sina.com.cn/s/blog_9d3971af0102wxjq.html 加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools&g ...

  4. 在MS CRM 4.0中引用JS文件

    引用: http://blog.csdn.net/qzw4549689/article/details/6027987 1.编写好JS代码,在ISV目录下新建一个目录javascripts,将JS文件 ...

  5. 在.net core 2.0中生成exe文件

    .net core 2.0程序默认生成的是一个dll,需要通过dotnet命令来执行他. dotnet ConsoleApp1.dll 这种方式有点类似于java程序.本身这种方式没有什么问题,但在调 ...

  6. Json-server在Vue 2.0中使用--build文件中没有dev-server文件

    跟大佬的视频使用json-server模拟后台数据调用,发现build文件中并没有dev-server.js. 新版的vue-cli取消了dev-server.js和dev-client.js   改 ...

  7. 在VC6.0中编译头文件时产生moc文件

    1.在FileView视图中 右键点击需要产生moc文件的头文件(就是类中包含Q_OBJECT宏,如果没有这个宏就不需要产生moc文件) 2.在右键菜单中选择Setting... 3.选择Custom ...

  8. Activity中通过标签获取当前Fragment

    初始化完成之后才有数据,否则获取不到 String tag = "android:switcher:"+viewPager.getId()+":"+viewPa ...

  9. JSP2.0自定义标签

    JSP1.0中可以通过继承TagSupport或者BodyTagSupport来实现自定义的tag处理方法. JSP2.0中也支持另外一种更为简单的自定tag的方法,那就是直接讲JSP代码保存成*.t ...

随机推荐

  1. mysql数据库去重复

    参考:http://www.cnblogs.com/duanjie/archive/2011/08/13/2136862.html 说到去重复,感觉逻辑很简单.但动手写起来却并不是那么容易.面试的时候 ...

  2. mybatis入门基础(五)----动态SQL

    一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态s ...

  3. jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——总结与性能分析

    Sizzle引擎的主体部分已经分析完毕了,今天为这部分划一个句号. a. Sizzle解析流程总结 是时候该做一个总结了.Sizzle解析的流程已经一目了然了. 1.选择器进入Sizzle( sele ...

  4. 用API网关把API管起来

    最开始只是想找个API网关防止API被恶意请求,找了一圈发现基于Nginx的OpenResty(Lua语言)扩展模块Orange挺好(也找了Kong,但是感觉复杂了点没用),还偷懒用Vagrant结合 ...

  5. JsTree实现简单的CRUD

    现在需要将省市县区域这块搞成树状图的形状,由于项目使用的AngularJS+ABP+WebAPI各个模块之间数据传输形式是json格式,那么对于JsTree来说就方便很多了,只需要将json数据搞成我 ...

  6. 悟透JavaScript

    要理解JavaScript,你得首先放下对象和类的概念,回到数据和代码的本原.前面说过,编程世界只有数据和代码两种基本元素,而这两种元素又有着纠缠不清的关系.JavaScript就是把数据和代码都简化 ...

  7. .Net(c#)模拟Http请求之HttpWebRequest封装

    一.需求: 向某个服务发起请求获取数据,如:爬虫,采集. 二.步骤(HttpWebRequest): 无非在客户端Client(即程序)设置请求报文(如:Method,Content-Type,Age ...

  8. [WCF编程]2.SOA概述

    一.SOA简介 1. SOA(面向服务架构)既是一种编程方式,也是软件开发的一种架构方法.根据这种架构方法,应用程序是由具有一定行为(称为服务)的功能单元组成的. 2. SOA的基本思想是构建一个粗粒 ...

  9. struts2的action是多例,servlet是单例

    struts2中action是多例的,即一个session产生一个action如果是单例的话,若出现两个用户都修改一个对象的属性值,则会因为用户修改时间不同,两个用户访问得到的 属性不一样,操作得出的 ...

  10. FacadePattern(门面模式)

    /** * 外观模式(门面模式) * @author TMAC-J * 外观模式是通过访问一个前台来实现对子系统的访问,其和代理模式的区别是 * 代理模式是通过代理一个类的形式,也就是说一对一的关系 ...