`
atianchen
  • 浏览: 25312 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
文章分类
社区版块
存档分类
最新评论

sitemesh2.3处理gbk格式页面导致浏览器加载时间过长问题的解决

阅读更多
政府项目,BT要求必须用GBK编码,于是 全部JS CSS FTL改成GBK编码格式,问题出现了
改以后的页面,浏览器加载时间特别长,不管是IE还是火狐,明明内容都出来完老,但是浏览器迟迟还是显示加载中,倒是页面的document onload事件需要10秒甚至15秒左右时间才能触发
项目采用了sitemesh,主要用的是meta.decorator,并没有定义excludes的页面,再仔细分析问题,发现声明了meta decorator的页面加载是正常的,恰恰是没有声明meta deracotor的页面加载很慢
分析代码,从struts2的FreemarkerPageFilter一直跟踪到sitemesh的PageFilter,发现sitemesh对于没有装饰器声明的页面是调用的
   writeOriginal(request, response, page);
方法来输出原始页面内容,再看    writeOriginal(request, response, page);方法本身
    
private void writeOriginal(HttpServletRequest request, HttpServletResponse response, Page page) throws IOException {
        response.setContentLength(page.getContentLength());
        if (request.getAttribute(USING_STREAM).equals(Boolean.TRUE))
        {
            PrintWriter writer = new PrintWriter(response.getOutputStream());
            page.writePage(writer);
            //flush writer to underlying outputStream
            writer.flush();
            response.getOutputStream().flush();
        }
        else
        {
            page.writePage(response.getWriter());
            response.getWriter().flush();
        }
    }

很正常的代码,一点问题也没,怎么会出现浏览器加载时间超长的,其实,问题恰恰是第一句话
response.setContentLength(page.getContentLength());

在看sitemesh2.3是如何生成这个conentLength的吧,
   public int getContentLength() {
        try
        {
            //todo - this needs to be fixed properly (SIM-196)
            return new String(pageData).getBytes("UTF-8").length; // we cannot just measure pageData.length, due to i18n issues (SIM-157)
        }
        catch (UnsupportedEncodingException e)
        {
            return new String(pageData).getBytes().length;
        }
    }

问题的原因已经很明白了,sitemesh是UTF-8编码格式计算响应内容长度,如果页面编码格式非utf-8,就会出现实际输出内容与contentLength不一样的情况,导致浏览器一直处于加载状态。
修改 sitemesh代码,重新打包,问题果然解决
分享到:
评论

相关推荐

    SiteMesh2.3很全的一个资料

    这个框架的主要目的是解决在大型网站中保持页面样式一致性的问题。SiteMesh 2.3 版本是其系列中的一个重要版本,包含了丰富的功能和改进。 在SiteMesh 2.3中,你可以找到以下关键知识点: 1. **页面装饰...

    sitemesh-2.3.jar

    sitemesh-2.3.jar

    sitemesh-2.3.zip

    总结,`sitemesh-2.3.zip` 文件提供了完整的 Sitemesh 2.3 版本,包含源码、文档和构建工具,是学习和使用 Sitemesh 的宝贵资源。通过这个压缩包,我们可以深入了解 Sitemesh 的工作原理,以及如何在实际项目中利用...

    sitemesh3包

    它将请求传递给页面处理器,然后应用预先定义好的装饰模板,最后将处理结果返回给浏览器。装饰模板可以是 HTML 或其他模板语言,允许开发者创建统一的页面头部、尾部和侧边栏等元素。 在配置 Sitemesh3 时,开发者...

    sitemesh简单教程页面装配器

    ### Sitemesh简单教程页面装配器 #### 一、Sitemesh概述 Sitemesh是一款用于Web应用中的页面布局管理工具,它通过采用装饰器(Decorator)设计模式,实现了对Web页面布局的灵活管理和重用。传统的Web开发中,...

    MiddleGen+Sitemesh.zip

    MiddleGen-Hibernate: 本书使用版本:2.1 ...下载页面:http://sourceforge.net/project/showfiles.php?group_id=36044 ... modtime=1096973436&big_mirror=0 下载文件:middlegen-2.1.zip ...下载文件:sitemesh-2.3.zip

    java sitemesh 页面框架

    Java Sitemesh是一个开源的页面布局和装饰框架,它的主要目标是帮助开发者统一网站的外观和感觉,提高代码复用性,并简化页面的复杂性。Sitemesh通过将页面分为内容区域和装饰模板来实现这一目标,使得开发者可以...

    sitemesh2 集成velocity 装饰页面乱码

    解决页面乱码问题的关键在于确保整个应用链路中的字符编码一致。通过正确配置项目、服务器、模板、sitemesh和HTTP响应头,我们可以有效地避免乱码问题,实现流畅的页面装饰效果。对于`VelocityView.java`的具体功能...

    jsp 页面框架sitemesh 全面帮助文档及示例

    当用户请求一个页面时,Sitemesh会捕获这个请求,然后应用装饰器模板,最后返回装饰后的页面给浏览器。 - **配置与集成**:Sitemesh通常通过web.xml文件配置,可以指定哪些页面需要被装饰,以及使用哪个装饰器。 3...

    SiteMesh教程及SiteMesh官方文档翻译

    - 在高并发场景下,由于SiteMesh的额外处理开销,响应时间相比未使用SiteMesh的情况稍有增加。 **结论** 虽然SiteMesh在高并发场景下可能会带来轻微的性能损失,但由于其提供的强大的布局管理和代码复用功能,这种...

    SiteMesh教程.pdf

    SiteMesh是一种用于Java Web应用的装饰器设计模式框架,主要通过拦截Web页面请求,动态地将装饰页面如头部(header)、底部(footer)、样式表(stylesheet)和脚本文件(scripts)等页面元素与实际页面组合在一起,...

    sitemesh框架简单例子

    当你访问一个页面时,Sitemesh会捕获响应,应用装饰器模板,并将结果返回给浏览器。这样,即使你的每个页面代码独立编写,也可以实现全局一致的布局。 为了进一步控制装饰过程,Sitemesh提供了多种特性。例如,你...

    页面装饰器(sitemesh)实例源代码

    页面装饰器(Sitemesh)是一种广泛用于Web应用的开源框架,它的主要功能是提供页面布局和装饰功能,使得开发者可以方便地实现统一的页面头部、尾部、侧边栏等元素,从而提高网站的整体风格一致性。在本实例中,我们...

    siteMesh demo+文档

    SiteMesh 是一个开源的Web应用程序布局和装饰框架,主要用于解决Web应用中的页面布局问题。它通过拦截HTTP请求,将页面内容与预定义的布局模板相结合,实现统一的页面头部、底部和侧边栏等元素,从而提高网站的整体...

    sitemesh教程

    接下来,需要将`sitemesh-2.3.jar`库文件放入`WEB-INF/lib`目录,确保应用能够正确加载Sitemesh的类。 然后,创建`WEB-INF/decorators.xml`文件,用来描述装饰器页面。在这个文件中,你可以定义装饰器的名字和它们...

    sitemesh

    9. **缓存优化**:sitemesh可以缓存装饰后的页面,提高页面的加载速度。 10. **错误处理**:sitemesh能够优雅地处理装饰过程中可能出现的错误,如未找到装饰模板等,避免破坏正常的页面显示。 通过深入学习...

    SiteMesh

    SiteMesh的工作原理是基于过滤器(Filter)机制,当用户请求一个页面时,SiteMesh过滤器会捕获这个请求,然后将请求的页面内容与预先定义好的装饰模板进行合并,最终返回给浏览器展示。这样,开发者可以专注于编写...

    sitemesh网页组合框架 demo

    Sitemesh的出现解决了这个问题,它允许开发者定义一个或多个装饰模板,然后自动将这些模板应用到所有的Web页面上。 **工作原理**: Sitemesh的工作原理主要是通过拦截HTTP请求,对响应内容进行处理。当用户请求一个...

    sitemesh和freemarker结合自我总结

    - **性能考虑**:虽然Sitemesh简化了页面布局的处理,但在大型项目中仍需关注性能问题,特别是在部署到生产环境时,需确保资源的高效加载和缓存策略的有效实施。 通过上述步骤,可以有效地将Freemarker和Sitemesh...

Global site tag (gtag.js) - Google Analytics