jsp模板继承

jsp通过自定义标签实现类似模板继承的效果

  1. 关于标签的定义、注册、使用在上面文章均以一个自定义时间的标签体现,如有不清楚自定义标签流程的话请参考这篇文章 http://www.cnblogs.com/zhuchenglin/p/8109787.html
  2. 关于jsp 的模板继承 请参考 这篇文章,上面的使用方法非常清楚,这里就不再说明
  3. 自定义标签实现类似模板继承的效果 参考

下面来看一下我的代码:

1. 在新建包 com.xiangmu.tags 中新建两个类,一个是 BlockTag.java,另一个是OverwriteTag.java,内容如下:

BlockTag.java 占位标签

public class BlockTag extends BodyTagSupport {
     /**
     * 占位模块名称
     */
    private String name;

    private static final long serialVersionUID = 1425068108614007667L;
    
    public int doStartTag() throws JspException{
        return super.doStartTag();                
    }
    
    public int doEndTag() throws JspException {
        ServletRequest request = pageContext.getRequest();
        //block标签中的默认值
        String defaultContent = (getBodyContent() == null)?"":getBodyContent().getString();        
        String bodyContent = (String) request.getAttribute(OverwriteTag.PREFIX+ name);
        //如果页面没有重写该模块则显示默认内容
        bodyContent = StringUtils.isEmpty(bodyContent)?defaultContent:bodyContent;
        try {
            pageContext.getOut().write(bodyContent);
        } catch (IOException e) {
            e.printStackTrace();
        }        
        return super.doEndTag();
    } 
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

OverwriteTag.java 重写标签

public class OverwriteTag extends BodyTagSupport {
 private static final long serialVersionUID = 5901780136314677968L;
    //模块名的前缀
    public static final String PREFIX = "JspTemplateBlockName_";
    //模块名
    private String name;
    
    public int doStartTag() throws JspException {
        return super.doStartTag();
    }
    
    public int doEndTag() throws JspException {
        ServletRequest request = pageContext.getRequest();
        //标签内容
        BodyContent bodyContent = getBodyContent();
        request.setAttribute(PREFIX+name,  StringUtils.trim(bodyContent.getString()));        
        return super.doEndTag();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }    
}
 
2. 注册标签
    在WEB-INF文件夹下写一个自定义标签的配置文件我的以mytags.tld为例:
    <?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
  "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
  <tlib-version>1.0</tlib-version><!-- 代表标签库的版本号 -->
  <jsp-version>1.2</jsp-version><!-- 代表jsp的版本 -->
  <short-name>mt</short-name><!-- 你的标签库的简称(我这里取mytag的首字母mt) -->
  <uri>http://xiangmu.com/mytags</uri><!-- 你标签库的引用uri -->
  
  <tag>
      <name>block</name><!-- 你定义的标签的名称 -->
       <tag-class>com.xingmu.tags.BlockTag</tag-class><!-- 对应的标签处理程序:包名+类名 -->
        <attribute>
            <name>name</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
      <!--  <body-content>JSP</body-content> --><!-- 标签体内容的格式 -->
  </tag>
   <tag>
      <name>overwrite</name><!-- 你定义的标签的名称 -->
       <tag-class>com.xingmu.tags.OverwriteTag</tag-class><!-- 对应的标签处理程序:包名+类名 -->
      <attribute>
            <name>name</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
      <!--<body-content>JSP</body-content> --><!-- 标签体内容的格式 -->
  </tag>
</taglib>

3. 使用示例

基础页面 menu.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="tmpl" uri="http://xingmu.com/mytags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<!--[if IE 9]>         <html class="no-js lt-ie10" lang="en"> <![endif]-->
<!--[if gt IE 9]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
    <head>
        <meta charset="utf-8">

        <title>title</title>

        <meta name="description" content="AppUI is a Web App Bootstrap Admin Template created by pixelcave and published on Themeforest">
        <meta name="author" content="pixelcave">
        <meta name="robots" content="noindex, nofollow">

        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

   </head>
    <body>
        <div>
            <tmpl:block name="page-content"></tmpl:block>
        </div>
    </body>
</html>

子页面 继承上面的基础页面 index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="tmpl" uri="http://xiangmu.com/mytags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<tmpl:overwrite name="page-content">
        //写入要重写的内容
</tmpl:overwrite>
 <%@include file="menu.jsp"%>       

这样最终访问index.jsp时所显示的页面就是这两个页面的组合。

注:本文是经过自己在网上搜的资料结合自己的想法所得,如需转载请注明出处:http://www.cnblogs.com/zhuchenglin/p/8110199.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

Javascript版的Repeater控件实现

其实有点标题党了,呵呵,主要是项目的特殊性,出于性能考虑项目经理规定不能用任何服务端控件(包括Repeater控件),同时尽量减少服务端处理,并尽可能压缩最终生...

24450
来自专栏佳爷的后花媛

前端面试题整理

两栏布局是主内容区为主,左(右)侧有一栏,(将侧边区块<aside>域浮动,<aside>浮动后覆盖绿色<main>, 再将<main> overflow:au...

53220
来自专栏小灰灰

Java 实现 markdown转Image

markdown 转 image 前段时间实现了长图文生成的基本功能,然后想了下能否有个进阶版,直接将markdown生成渲染后的图片呢? 思路 有不少的库...

38750
来自专栏移动开发之家

Flutter完整开发实战详解(一、Dart语言和Flutter基础)

 在如今的 Fultter 大潮下,本系列是让你看完会安心的文章。本系列将完整讲述:如何快速从0开发一个完整的 Flutter APP,配套高完成度 Flut...

26920
来自专栏玄魂工作室

如何将HTML字符转换为DOM节点并动态添加到文档中

将字符串动态转换为DOM节点,在开发中经常遇到,尤其在模板引擎中更是不可或缺的技术。 字符串转换为DOM节点本身并不难,本篇文章主要涉及两个主题:<br />

21320
来自专栏糊一笑

几个会被面试问到的JS基础实现代码

记录工作和学习中的一些可能会被面试问到的JS内部实现基础,由于笔者水平有限,提供出的答案不一定准确,但是原理尽可能会讲清楚,以后会进行逐步添加。 bind实现 ...

39580
来自专栏思考的代码世界

Python网络数据采集之HTML解析|第01天

假如我们确定一个我们需要采集的目标信息,可能是一组统计数据、或者一个 title等,但是此时这个目标可能藏的比较深,可能在第20层的标签里面,你可能会用下面的方...

21440
来自专栏Java后端生活

JavaWeb(十三)简单标签

用户定义的一种自定义的jsp标记 。当一个含有自定义标签的jsp页面被jsp引擎编译成servlet时,tag标签被转化成了对一个称为 标签处理类 的对象的操作...

11940
来自专栏Flutter入门

Flutter入门三部曲(2) - 界面开发基础

上一节我们熟悉了初始化后的flutter的界面。这一节,我们就来重点了解一下这部分的内容。

55820
来自专栏冷冷

SpringMVC 实现多文件上传的两种方式及其效率比较

springMVC实现 多文件上传的方式有两种,一种是我们经常使用的以字节流的方式进行文件上传,另外一种是使用springMVC包装好的解析器进行上传。这两种方...

1.8K80

扫码关注云+社区

领取腾讯云代金券