struts2+sitemesh页面上有中文显示不完整的解决方案

最近用strtus2开发一个小项目,发现如果一个页面上有中文的话,会使页面上的内容显示不完整。在网上找了些资料,终于找到解决方案。
原文:http://www.blogjava.net/JavaVM/archive/2006/07/06/57053.html

因为使用了sitemesh,所以在文件com.opensymphony.module.sitemesh.filter.PageFilter 中的 response.setContentLength(page.getContentLength());
出现问题。这样写法是没有考虑到中文问题。
做如下修改:
1、 int originalLength = page.getContentLength();//原来的长度
2、 int bodyCNLenght = page.getBody().getBytes().length-page.getBody().length();//内容处理中文长度
3、 int titleCNLength = page.getTitle().getBytes().length-page.getTitle().length();//title处理中文长度
4、 int javascriptCNOfhead = page instanceof FastPage?  ((FastPage)page).getHead().getBytes().length-((FastPage)page).getHead().length()):0 ;//head的长度,因为javascript中可能包括中文

5、 response.setContentLength(originalLength+bodyCNLenght+titleCNLength+javascriptCNOfhead);


另: firmgoal老兄的文章中也提到过此问题,他的文章:wicket+struts2+sitemesh+freemarker页面显示不全的解决方案

显示不全的原因为wicket有时候会设置Response的ContentLength,struts2的sitemesh插件在处理freemarker修饰页时会错误地使用该ContentLength,导致最终页面的大小变成被修饰页面的大小,因此页面显示不全。

解决方案,修改FreeMarkerPageFilter

FreeMarkerPageFilter的源文件在此:
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/FreeMarkerPageFilter.java?view=markup&pathrev=475013

157行:
template.process(model, res.getWriter());

改为:
res.setContentLength(-1);
template.process(model, res.getWriter());

你可能感兴趣的:(apache,freemarker,struts,SVN,wicket)