[文章摘要]
Struts tiles中提供了基于模版的页面组装框架,然而模版中需要包含.do文件的内容时,我们遇到了麻烦,本文中作者给出了一种简单的方式来解决这个问题。
[关键词] Struts Tiles
1 问题描述
我们在Web应用中使用Struts Tiles时,如果被组装的内容是.do的内容,比如下面的例子,将会出现错误信息。
实际例子:<insert:put attribute=" /companyView.do?action=before_new">
错误信息:ServletException in '/companyView.do?action=before_new': 应答已经提交。
2 问题原因分析
tiles 使用了 JSP 的 jsp:include 技术实现页面组装,只能适用于 jsp 页面,无法用于 .do 这样的情况。
找到出错的地方:
TilesUtilImpl.java 的 doInclude(String uri, PageContext pageContext)
2.1 doInclude 方法源代码
public void doInclude(String uri, PageContext pageContext)
throws IOException, ServletException {
pageContext.include(uri);
}
3 问题解决
3.1 修改 doInclude 方法
public void doInclude(String uri, PageContext pageContext)
throws IOException, ServletException {
if (uri.indexOf(".jsp") > 0)
pageContext.include(uri);
else if (uri.indexOf(".do") > 0)
pageContext.getOut().write(getPageContent(uri, pageContext));
}
3.2 给 TilesUtilImpl 增加一个新的方法getPageContent,获取 .do 文件的内容用于显示
private String getPageContent(String uri, PageContext pageContext) {
String result = "";
HttpServletRequest request = (HttpServletRequest) pageContext .getRequest();
String contextPath = request.getContextPath();
String serverIP = request.getServerName();
String serverPort = String.valueOf(request.getServerPort());
String uriTmp = "http://";
if (serverPort.equals("80"))
uriTmp = uriTmp + serverIP;
else
uriTmp = uriTmp + serverIP + ":" + serverPort;
uriTmp = uriTmp + contextPath;
if (uri.startsWith("/"))
uriTmp += uri;
else
uriTmp += "/" + uri;
try {
URL url = new URL(uriTmp);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
result += line;
}
conn.disconnect();
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
return result; } |