一.介紹
使用JSP的都知道jsp:include指令,可以使用如下功能,動態的加載其它請求。
- <jsp:include page="/header.jsp" />
- <jsp:include page="/servlet/header" />
- <jsp:include page="/header.do" />
而如果你不是使用JSP,而是使用模板引擎如Freemarker,Velocity。有該功能也將十分方便。
Freemarker提供了<@include_page path="/servlet/header"/>指令,使freemarker可以完成jsp:include功能,但velocity則沒有提供該功能。
二.擴展
現擴展實現一個比Freemarker更加通用的HttpInclude對象,可以適用于Freemarker及Velocity。
Freemarker及Velocity示例使用:
- ${httpInclude.include("/servlet/head?p1=v1&p2=v2")};
- ${httpInclude.include("/head.jsp")};
- ${httpInclude.include("http://www.google.com")};
與jsp:include相比:
- 與jsp:include完成相同的功能
- 可以include遠程的http內容.并且會將session_id等cookie傳遞至該請求,如: http://www.google.com
三.使用
以springmvc為例,筆者編寫了一個攔截器.用于攔截所有的controller方法.( struts2可以編寫類似攔截器)
import freemarker.ext.servlet.IncludePage;
import cn.org.rapid_framework.web.httpinclude.HttpInclude;
public class ShareRenderArgsVariableInterceptor extends HandlerInterceptorAdapter {
static Log log = LogFactory.getLog(ShareRenderArgsVariableInterceptor.class);
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
String viewName = modelAndView.getViewName();
if(viewName != null && !viewName.startsWith("redirect:")) {
//筆者擴展的httpInclude
modelAndView.addObject("httpInclude", new HttpInclude(request, response));
//freemarker 原生的IncludePage指令
modelAndView.addObject("include_page", new IncludePage(request, response));
}
}
}
然后在freemarker或者是velocity中,就可使用: ${httpInclude.include("/head.jsp")};
點擊此處,查看HttpInclude源碼