http://outofmemory.cn/code-snippet/964/Java-jsp-MasterPages-achieve-muban-page-achieve-tongyi-fengge-page-layout
Java jsp MasterPages实现母版页,实现统一风格的页面布局
java利用Tag实现类似.Net的母版页功能。
MasterPageTag.java
/**
*
*/
package org.lhp.core.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* TODO
*
* @Title : MasterPageTag.java
* @author liheping 2012-5-14 下午03:59:03
* @version : V1.0 2012-5-14
* @Copyright : Copyright ( c ) dev.liheping.org ,2012
*/
public class MasterPageTag extends BodyTagSupport {
private static final long serialVersionUID = 1L;
@Override
public int doAfterBody() throws JspException {
return SKIP_BODY;
}
@Override
public int doStartTag() throws JspException {
// 执行子标签
return EVAL_BODY_BUFFERED;
}
@Override
public int doEndTag() throws JspException {
JspWriter out = pageContext.getOut();
if (bodyContent != null) {
if (out instanceof BodyContent) {
out = ((BodyContent) out).getEnclosingWriter();
}
}
String content = this.bodyContent.getString();
try {
this.bodyContent.clear();
out.write(content);
} catch (IOException e) {
e.printStackTrace();
}
return SKIP_PAGE; // 不执行标签之后的内容
}
}
ContentPlaceHolderTag.java
/**
*
*/
package org.lhp.core.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
/**
* TODO
* @Title : ContentPlaceHolderTag.java
* @author liheping 2012-5-14 下午03:33:01
* @version : V1.0 2012-5-14
* @Copyright : Copyright ( c ) dev.liheping.org ,2012
*/
public class ContentPlaceHolderTag extends TagSupport {
private static final long serialVersionUID = 1L;
@Override
public int doEndTag() throws JspException {
JspWriter out = pageContext.getOut();
Object obj = this.pageContext.getRequest().getAttribute(this.getId());
try {
if(obj!=null)
out.write(obj.toString());
} catch (IOException e) {
e.printStackTrace();
}
return EVAL_PAGE;
}
}
ContentPageTag.java
/**
*
*/
package org.lhp.core.tag;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
import org.lhp.core.response.CustomResponse;
/**
* TODO
*
* @Title : ContentPageTag.java
* @author liheping 2012-5-14 下午04:00:47
* @version : V1.0 2012-5-14
* @Copyright : Copyright ( c ) dev.liheping.org ,2012
*/
public class ContentPageTag extends BodyTagSupport {
private final String masterFolderPath = "/WEB-INF/master/";
private final String masterPageSuffix = ".jsp";
private static final long serialVersionUID = 1L;
@Override
public void doInitBody() throws JspException {
try {
this.pageContext.getRequest().setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
super.doInitBody();
}
@Override
public int doAfterBody() throws JspException {
return SKIP_BODY;
}
@Override
public int doStartTag() throws JspException {
//执行子标签
return EVAL_BODY_BUFFERED;
}
@Override
public int doEndTag() throws JspException {
JspWriter out = pageContext.getOut();
CustomResponse bufferedResponse = new CustomResponse((HttpServletResponse) this.pageContext.getResponse());
try {
System.out.println("master url :"+this.getMasterPageUrl());
//渲染页面
this.pageContext.getServletContext().getRequestDispatcher(this.getMasterPageUrl()).include(this.pageContext.getRequest(), bufferedResponse);
System.out.println("master page content : " + bufferedResponse.getContent());
//out.clearBuffer();
out.write(bufferedResponse.getContent());
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return SKIP_PAGE;
}
/**
* TODO 获取母版
* @Title: getMasterPageUrl
* @return
* @return String
* @author liheping 2012-5-15 下午02:16:13
*/
private String getMasterPageUrl(){
return this.masterFolderPath+this.materPageId+this.masterPageSuffix;
}
private String materPageId;
public String getMaterPageId() {
return materPageId;
}
public void setMaterPageId(String materPageId) {
this.materPageId = materPageId;
}
}
ContentTag.java
/**
*
*/
package org.lhp.core.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* TODO
* @Title : ContentTag.java
* @author liheping 2012-5-14 下午04:01:16
* @version : V1.0 2012-5-14
* @Copyright : Copyright ( c ) dev.liheping.org ,2012
*/
public class ContentTag extends BodyTagSupport {
private static final long serialVersionUID = 1L;
@Override
public int doAfterBody() throws JspException {
return SKIP_BODY;
}
@Override
public int doStartTag() throws JspException {
return EVAL_BODY_BUFFERED;
}
@Override
public int doEndTag() throws JspException {
String content = this.bodyContent.getString();
try {
this.pageContext.getRequest().setAttribute(this.getContentPlaceHolderId(), content);
this.bodyContent.clear();
} catch (IOException e) {
e.printStackTrace();
}
return EVAL_PAGE;//default
}
private String contentPlaceHolderId;
public String getContentPlaceHolderId() {
return contentPlaceHolderId;
}
public void setContentPlaceHolderId(String contentPlaceHolderId) {
this.contentPlaceHolderId = contentPlaceHolderId;
}
}
CustomResponse.java
package org.lhp.core.response;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public final class CustomResponse extends HttpServletResponseWrapper {
private StringWriter strWriter = new StringWriter();
private PrintWriter out = new PrintWriter(strWriter) ;
public CustomResponse(HttpServletResponse response) {
super(response);
}
@Override
public PrintWriter getWriter() throws IOException {
return out;
}
public String getContent() {
return strWriter.toString();
}
}
master.jsp
<%@ taglib uri="org.lhp.masterpage" prefix="fms" %>
<fms:MasterPage id="master">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title><fms:ContentPlaceHolder id="title"/></title>
</head>
<body>
<hr/>
<h1>母版页内容.............</h1>
<fms:ContentPlaceHolder id="nav"/>
<hr/>
<fms:ContentPlaceHolder id="main"/>
<h2>母版页文字</h2>
<br/>
<br/>
<br/>
...........................
</body>
</html>
</fms:MasterPage>
index.jsp
<%@ taglib uri="org.lhp.masterpage" prefix="fms" %>
<fms:ContentPage materPageId="master">
<fms:Content contentPlaceHolderId="title">
子页,标题
</fms:Content>
<fms:Content contentPlaceHolderId="nav">
<h5>子页导航</h5>
</fms:Content>
<fms:Content contentPlaceHolderId="main">
<h3>子页主内容</h3>
</fms:Content>
</fms:ContentPage>
[Java]代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>bean</shortname>
<uri>org.lhp.masterpage</uri>
<tag>
<name>Content</name>
<tagclass>org.lhp.core.tag.ContentTag</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>contentPlaceHolderId</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>ContentPlaceHolder</name>
<tagclass>org.lhp.core.tag.ContentPlaceHolderTag</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>id</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>MasterPage</name>
<tagclass>org.lhp.core.tag.MasterPageTag</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>id</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>ContentPage</name>
<tagclass>org.lhp.core.tag.ContentPageTag</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>materPageId</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>