经前同事介绍,前几天一直在试用siteMesh,在试用过程中发现一些不想被装饰的页面出现页面显示不全的问题。页面上出现一小段HTML标签。提示异常为java.lang.IllegalStateException 大致意思是试图写多少多少字节却只写入了多少多少字节。非常郁闷。看了源代码。发现应该是com.opensymphony.module.sitemesh.filter.PageFilter包里的
1 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
6 response.setContentLength(originalLength+bodyCNLenght+titleCNLength+javascriptCNOfhead);
这个解决方案是从网上搜索出来的,我想应该还有更好的解决方法。