jsp通过自定义标签实现类似模板继承的效果
关于标签的定义、注册、使用在上面文章均以一个自定义时间的标签体现,如有不清楚自定义标签流程的话请参考这篇文章 http://www.cnblogs.com/zhuchenglin/p/8109787.html
关于jsp 的模板继承 请参考 这篇文章,上面的使用方法非常清楚,这里就不再说明
自定义标签实现类似模板继承的效果 参考
下面来看一下我的代码:
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为例:
/p>
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
1.0
1.2
mt
http://xiangmu.com/mytags
block
com.xingmu.tags.BlockTag
name
true
true
overwrite
com.xingmu.tags.OverwriteTag
name
true
true
3. 使用示例
基础页面 menu.jsp
pageEncoding="UTF-8"%>
title子页面 继承上面的基础页面 index.jsp
pageEncoding="UTF-8"%>
//写入要重写的内容
这样最终访问index.jsp时所显示的页面就是这两个页面的组合。