1. 简单说明:
在JSP 2.0后, 你不再需要大刀阔斧地定义一堆TagSupport或BodyTagSupport, 使用JSP Tag Files技术可以实现功能强大的页面模板技术. 在这里抛砖引玉, 结合项目开发, 简单介绍Tag Files技术的应用. 至于详细教程与资料, 请大家参考Java EE Tutorial, 上面有详细的E文资料.
http://docs.oracle.com/javaee/5/tutorial/doc/bnama.html
2. 定义模板:/WEB-INF/tags/subView.tag

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <!--
  4. <%@ tag language="java" pageEncoding="UTF-8" isELIgnored="false"%>
  5. <%@ taglib prefix="tags" tagdir="/WEB-INF/tags/"%>
  6. <%@ attribute name="id" required="true"%>
  7. <%@ attribute name="title" required="false"%>
  8. <%@ attribute name="headStyle" required="false" fragment="true"%>
  9. <%@ attribute name="headScript" required="false" fragment="true"%>
  10. <%@ attribute name="body" required="false" fragment="true"%>
  11. <%@ attribute name="footScript" required="false" fragment="true"%>
  12. -->
  13. <html xmlns="http://www.w3.org/1999/xhtml">
  14. <head>
  15. <tags:header />
  16. <!-- 自定义css部分 -->
  17. <jsp:invoke fragment="headStyle" />
  18. <!-- 自定义js部分 -->
  19. <jsp:invoke fragment="headScript" />
  20. </head>
  21. <body class="pbody" id="approveApply">
  22. <div class="mainhd">
  23. <p class="maintit">${title}</p>
  24. </div>
  25. <div id="__body__">
  26. <!-- 自定义body -->
  27. <jsp:invoke fragment="body" />
  28. </div>
  29. <jsp:invoke fragment="footScript" />
  30. <div id="__footer__">
  31. <tags:footer version="${version}" />
  32. </div>
  33. </body>
  34. </html>

复制代码

其中, <tags:header>是头部模板, <tags:footer>是底部模板, 小模板再整合到大的<tags:subView>模板
2. 继承模板, 实现具体页面: /view/deploy/approveApply.jsp

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  3. <%@ taglib prefix="tags" tagdir="/WEB-INF/tags/"%>
  4. <%@ taglib prefix="app" uri="http://risecloud.com/app"%>
  5. <tags:subView id="approveApply" title="审核请求">
  6. <jsp:attribute name="body">
  7. <div id="mainGrid"></div>
  8. </jsp:attribute>
  9. <jsp:attribute name="footScript">
  10. <!-- 覆盖页面样式类 -->
  11. <script type="text/javascript" src="${pageContext.request.contextPath}/js/deploy/ApproveApplyGrid.js?${app:pageVersion()}"></script>
  12. <script type="text/javascript" src="${pageContext.request.contextPath}/js/deploy/ApproveApplyDialog.js?${app:pageVersion()}"></script>
  13. <script type="text/javascript">
  14. //<![CDATA[
  15. $(function() {
  16. var grid = ApproveApplyGrid.create({
  17. selector : '#mainGrid',
  18. url : window.getCctxUrl('/deploy/approveApply!listGameApply'),
  19. agree : function(ret) {
  20. alert('agree')
  21. },
  22. deny : function(ret, rec) {
  23. alert('agree')
  24. }
  25. });
  26. });
  27. //]]>
  28. </script>
  29. </jsp:attribute>
  30. </tags:subView>

复制代码

其中:
1. id, title, body, footScript等分别是在<tabs:subView>中的模板区域, 这里逐一替换.
2. ${app:pageVersion()}是自定义的JSP EL Function, 在新版本发布时, 可以迫使用户浏览器更新缓存. 具体定义为/WEB-INF/app.tld,

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <taglib xsi:schemaLocation="http://java.sun.com/xml/ns/javaee web-jsptaglibrary_2_1.xsd" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1">
  3. <tlib-version>1.0</tlib-version>
  4. <jsp-version>2.1</jsp-version>
  5. <short-name>app</short-name>
  6. <uri>http://risecloud.com/app</uri>;
  7. <display-name>app</display-name>
  8. <function>
  9. <name>pageVersion</name>
  10. <function-class>com.yy.game.risecloud.taglib.RiseCloundFunctionLib</function-class>
  11. <function-signature>java.lang.String pageVersion()</function-signature>
  12. </function>
  13. </taglib>

复制代码

注意EL Function都必须static
3. 具体效果: 图中红线框外的是模板, 红线框内是继承模板的页面实现, 既统一, 又省事. 这不是你梦寐以求的么?

注意:
1. JSP Tag Files默认放在/WEB-INF/tags/目录, 使用文件名直接引用. 如果其他地方, 必须在web.xml中使用<jsp-config>声明!
2. JSP EL Functions的tld默认放在/WEB-INF/下面, 如果其他地方, 必须在web.xml中使用<jsp-config>声明!
这二者如果放在默认位置, 在Servlet容器启动时会自动加载. 无需再配置什么! 具体使用, 大家可以参考Java EE Tutorial

Java使用JSP Tag Files & JSP EL Functions打造你自己的页面模板的更多相关文章

  1. Java第三阶段学习(十四、JSP动态页面、EL表达式、JSTL标签库)

    一.JSP技术 1.jsp脚本和注释 jap脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部,比如写在doget.dopost 内的代码 2) ...

  2. JSTL的全称:JSP Standard Tag Library, jsp 标准标签库

    JSTL的全称:JSP Standard Tag Library, jsp 标准标签库 JSTL的作用     提供给Java web开发人员一个标准通过的标签函数库和EL来取代传统直接在页面上嵌入j ...

  3. JSP运行过程 JSP脚本 静态动态包含 jsp指令 jsp内置对象jsp四大作用域 jsp动作元素 EL表达式 JSTL 设计模式 JSP开发模式 EL内置对象

    Day38 JSP JSP的运行过程具体如下: (1)客户端发出请求,请求访问JSP文件. (2)JSP容器先将JSP文件转换成一个Java源文件(Java Servlet源程序),在转换过程中,如果 ...

  4. Java基础83 JSP标签及jsp自定义标签(网页知识)

    1.JSP标签 替代jsp脚本,用于jsp中执行java代码1.1.内置标签:  <jsp:forward></jsp:forward>  相当于:request.getReu ...

  5. jsp tag 直接文件实现

    引入 <%@ taglib prefix="sys" tagdir="/WEB-INF/tags/sys" %> 这里注意/WEB-INF/tags ...

  6. JavaWeb——JSP表达式语言(EL)

    1.JSP表达式语言(EL)用于在jsp从访问存储在JavaBean中的数据,例如 User ID: ${user.userId}<br /> 这里的${user.userId}就是JSP ...

  7. Liferay JSP Tag Libraries介绍

    Liferay自带了很多标签库,这极大地提高了开发Liferay项目的效率. 下面让我们一起来探索吧. 什么是标签库? 什么是JSP标签? 什么是JSTL? 标签库由下面这几部分组成: Tag Lib ...

  8. JavaWeb学习之JSP常用标签、EL表达式的运算符、JSTL标签库(6)

    1.JSP常用标签 * 只要支持JSP文件,常用标签有可以直接使用 * 格式: jsp:xxxx * jsp:forward ,完成jsp页面的转发 * page属性:转发的地址 <% requ ...

  9. JSP、JSTL、EL

    Jsp Jsp内置对象: Response.Request.Page.pageContext.session.out.application.exception.config Out->jspW ...

随机推荐

  1. 6 个优秀的开源 OCR 光学字符识别工具

    转自:http://sigvc.org/bbs/thread-870-1-1.html 纸张在许多地方已日益失宠,无纸化办公谈论40多年,办公环境正限制纸山的生成.而过去几年,无纸化办公的概念发生了显 ...

  2. Oracle:安装中的注意事项

    导读:Oracle数据库的安装,姑娘我也是醉了.从开发今日开讲后台系统前,我就一直在装,第一版都开发完了,我昨天静下心来,才终于装上.在这个过程中,出现了好些个问题,说起来都是泪呀.现在就总结总结这个 ...

  3. 全选Form > Grid 的所有行

    在AX的Grid 按Ctrl+A,并不一定能选择到grid 的所有行,比如你要将当前grid的数据复制到Excel,你需要全部选择所有行. 但AX自身的数据缓存机制,数据量非常大的时候当前grid只装 ...

  4. Linux下的”锁“事儿

    原由 之所以写这篇文章当然还是在面试中涉及了对本文标题的相关问题-互斥锁和自旋锁的区别.听到这个问题的时候,我是比较忐忑的.互斥锁我还能简单说一些,但是对于自旋锁的了解几乎为零.为此,将总结Linux ...

  5. Loadrunner:安装LR11时提示缺少vc2005_sp1_with_atl_fix_redist

    [问题现象] 安装LR11时提示缺少vc2005_sp1_with_atl_fix_redist: [解决办法] 手动安装缺少的组件,LR安装包中已自带该组件,为何不自动捕捉异常去获取该自带的组件去安 ...

  6. (笔记)angular 路由

  7. 合并多个List<T>类型并通过LINQ按指定属性排序

    后台CS代码: namespace WebFormTest.TestCollect { public partial class ListTest : System.Web.UI.Page { pro ...

  8. 在VS中快速查看文件被谁签出

    步骤如下: 1 在VS中的菜单上单击鼠标右键,然后选择显示“源代码管理” 2 选中要查看的文件后,在源代码管理中单击“属性” 3 打开第2个标签页“Check Out Status”,可以看到签出人等 ...

  9. c#学习之Socket网络编程

    我是新手以前没写过博客 希望大家勿喷, 在编写Socket的时候需要导入System.Net.Socket 命名空间.利用该类我们可以直接编写Socket的客户端和服务的的程序了, 这里我们只讲tpc ...

  10. ansible的playbook组件

    playbook的核心元素: tasks: 任务 variables: 变量 templates: 模板 handlers: 处理器 roles: 角色 组织格式:YAML(被称为另外一种标记语言) ...