[文章摘要]
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; } |