学习过.net MVC 的同学,都知道其中用一个文件share /_Layout.cshtml,它主要实现的是一个类似母版页(可以参照word的母版)的功能,那么在javaee中是否有类似的功能呢?其实javaee 提供了一个包含页面的动作:

它能引入一些公共的部分,但是如果公共的地方不止一处,则需要写很多的类似语句。有没有一个类似.net中母版页的功能呢?据我现在所知,javaee中是没有的,当初我遇到高重复的页面时,百度了很久,终于在一个技术blog中找到实现该功能的demo,由于时间太久已经忘记在哪找到,如果我接下来写的侵犯了原作者权益,看见立删。

想实现这个功能要有以下文件:

1:BlockTag.java:

2: OverwriteTag.java

3:MyTag.tld

4:web.xml

5:_Layout.jsp

1,2两个文件放在src下的一个包中如:com.**.util

3放在web-inf 下

1:BlockTag.javaimport java.io.IOException;

import javax.servlet.ServletRequest;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.BodyTagSupport;

import org.apache.commons.lang.StringUtils;

public class BlockTag extends BodyTagSupport {

/**

* 占位模块名称

*/

private String name;

private static final long serialVersionUID = 1425068108614007667L;

@Override

public int doStartTag() throws JspException{

return super.doStartTag();

}

@Override

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) {

// TODO Auto-generated catch block

e.printStackTrace();

}

// TODO Auto-generated method stub

return super.doEndTag();

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

2:OverwriteTag.java

import javax.servlet.ServletRequest;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.BodyContent;

import javax.servlet.jsp.tagext.BodyTagSupport;

import org.apache.commons.lang.StringUtils;

/**

* 自定义标签,用于在jsp模板中重写指定的占位内容

*

* 基本原理:

* 将overwrite标签内容部分添加到ServletRequest的attribute属性中

* 在后续block标签中再通过属性名读取出来,将其渲染到最终的页面上即可

*

*

*/

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 {

// TODO Auto-generated method stub

return super.doStartTag();

}

@Override

public int doEndTag() throws JspException {

ServletRequest request = pageContext.getRequest();

//标签内容

BodyContent bodyContent = getBodyContent();

request.setAttribute(PREFIX+name,  StringUtils.trim(bodyContent.getString()));

// TODO Auto-generated method stub

return super.doEndTag();

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

3:mytab<?xml version="1.0" encoding="utf-8"?>

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">

1.0

2.0

Mytag

mytag

block

com.wsbalance.util.BlockTag

jsp

name

true

true

java.lang.String

ouerwrite

com.**.util.OverwriteTag

jsp

name

true

true

java.lang.String

4:web.xml

web.xml中配置自定义标签

5:在share/_layout.jsp中写母版

母版页中(注意Layout:block>)

6:子页面中:

好了结束了,如果有不太懂的请留言哦,第一次写如有不足请多多关照!!

java占位符填充_实现java中的占位符相关推荐

  1. java word模版填充_[转载]java向word模板中填充数据(总结)

    使用过PageOffice动态生成word文档的人都知道,PageOffice可以给word文档的指定位置进行填充,这里我们所说的指定位置在PageOffice的专业术语里面有两个概念,一个叫做数据区 ...

  2. java.lang.IllegalArgumentException: 字符[_]在域名中永远无效。 at

    [http-nio-8080-exec-1] org.apache.coyote.AbstractProcessor.parseHost [xxx_tomcat] 是无效主机注意:更多的请求解析错误将 ...

  3. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  4. java xml dom4j 解析_在JAVA中怎么用DOM和DOM4j解析XML啊?

    二.XML文件 三.开始解析 public class JDOMTest { public static void main(String[] args) { // 进行对books.xml文件的JD ...

  5. java怎么缓存行填充_为什么java的Exchanger.Slot缓存行填充像这样?

    当我在 java中阅读'虚假共享'机制时,我在java.util.concurrent.Exchanger.Slot中找到以下代码 /** * A Slot is an AtomicReference ...

  6. java 内嵌机制_[转] Java中public,private,final,static等概念的解读

    作为刚入门Java的小白,对于public,private,final,static等概念总是搞不清楚,到底都代表着什么,这里做一个简单的梳理,和大家分享,若有错误请指正,谢谢~ 访问权限修饰符 pu ...

  7. java 线程组作用_浅析Java中线程组(ThreadGroup类)

    一.概念 Java中使用ThreadGroup类来代表线程组,表示一组线程的集合,可以对一批线程和线程组进行管理.可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线 ...

  8. java try catch嵌套_解析Java中未被捕获的异常以及try语句的嵌套使用

    Java未被捕获的异常 在你学习在程序中处理异常之前,看一看如果你不处理它们会有什么情况发生是很有好处的.下面的小程序包括一个故意导致被零除错误的表达式. class Exc0 { public st ...

  9. java 文件内容排序_在Java中对2个大型文本文件进行排序的最佳方法是什么?

    我正在构建一个简单的 Java应用程序,涉及从csv文件中读取信息. csv文件中的信息以这种形式出现: "ID","Description" "AB ...

最新文章

  1. ROS nodelet的使用
  2. 深入浅出 MyBatis 的一级、二级缓存机制
  3. Zend Framework数据库操作
  4. [精华] 数据库的查询优化技术
  5. IOS高级开发 runtime(一)
  6. 等值线在Google Map上的叠加Extent
  7. android studio串号,AndroidStudio使用常见问题集锦
  8. java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题
  9. 磁盘分区格式FAT32与NTFS
  10. Hacking techniques automation
  11. Dapr微服务应用开发系列0:概述
  12. aspen plus大小_[软件]Aspen Plus 这些常识,你都懂了吗?
  13. Opencv打开相机,并在上面用鼠标画框
  14. 5G学习笔记之RRC_IDLE/RRC_INACTIVE态UE功能概述
  15. 数据安全对物联网越来越重要
  16. 从一杯果汁浅谈点点医生充值提现模块设计
  17. android系统蓝牙音箱功能吗,Android蓝牙开发系列文章-其实你的手机可以变成一个蓝牙音箱...
  18. Javascript捕捉(capturing)与冒泡(bubbling)的区别
  19. 【逻辑思维训练 二】系统思维训练
  20. Failed to obtain JDBC Connection; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsEx

热门文章

  1. Eclipse开发环境设置
  2. from __future__ import print_function 介绍
  3. selenium教程
  4. 一组图诠释CNN及RNN的区别
  5. 日常python常见问题
  6. 统计学习及监督学习概论
  7. 谈服务发现的背景、架构以及落地方案
  8. 微服务实践分享(1) 概况
  9. 美团配送资金安全治理之对账体系建设
  10. spring security源码分析心得