缓冲是Web应用中必须考虑的一个提高性能的重要手段。对于基于JSP/Servlet技术的站点,常用的缓冲有持久层的数据库连接池缓冲,内存中的值对象缓冲,JSP页面缓冲,以及各种各样的缓冲框架等等,无不是为了提高系统的吞吐量。
然而对于大型站点来说,将JSP页面转换为静态Html也许是最高效的方法,特别适合于数据不经常变化但是页面访问量特别大的站点,如新闻等,通过把JSP动态页面预先转换为静态Html页面,当用户请求此页面时,系统自动导向到对应的Html页面,从而避免解析JSP请求,调用后台逻辑以及访问数据库等操作所带来的巨大开销。
如何将一个已有的JSP站点的动态JSP页面转化为静态Html呢?我们希望在不用更改现有Servlet,JSP的前提下让系统自动将这些JSP转换为Html页。幸运的是,Filter为我们提供了一种实现方案。
Filter是Servlet 2.2规范中最激动人心的特性。Filter能过滤特定URL如/admin/*并进行必要的预处理,如修改Request和Response,从而实现定制的输入输出。更强大的是,Filter本身是一个责任链模式,它能一个接一个地传递下去,从而将实现不同功能的Filter串起来,并且可以动态组合。
要自动生成静态页面,用Filter截获jsp请求并先进行预处理,自动生成Html,是个不错的主意。一个很容易想到的方法是在Filter截获Request后,导向一个Servlet,在这个Servlet中向本机发送一个http请求,然后将响应写入一个文件:
URLConnection urlConn = URLConnection.open(http://localhost/req);
注意要避免递归。
另一个方法是不模拟http,而是定制Response,把服务器返回的JSP响应输出到我们自己的Response中,就可以将响应快速写入Html文件,然后再发送给客户。而且,由于没有http模拟请求,直接读取服务器响应速度非常快。
截获Response的关键便是实现一个WrappedResponse,让服务器将响应写入我们的WrappedResponse中。这类似于一个代理模式,Servlet 2.x已经提供了一个WrappedResponse类,我们只需要复写其中的一些关键方法即可。
WrappedResponse实现了Response接口,它需要一个Response作为构造函数的参数,事实上这正是代理模式的应用:WrappedResponse充当了代理角色,它会将JSP/Servlet容器的某些方法调用进行预处理,我们需要实现自己的方法。
综上:用Filter实现HTML缓冲的步骤是:
1. 用Filter截获请求,如/a.jsp?id=123,映射到对应的html文件名为/html/a.jsp$id=123.htm。
2. 查找是否有/html/a.jsp$id=123.htm,如果有,直接forward到此html,结束。
3. 如果没有,实现一个WrappedResponse,然后调用filterChain(request, wrappedResponse)。
4. 将返回的WrappedResponse写入文件/html/a.jsp$id=123.htm,然后返回响应给用户。
5. 下一次用户发送相同的请求时,到第2步就结束了。
使用这个方法的好处是不用更改现有的Servlet,JSP页,限制是,JSP页面结果不能与Session相关,需要登陆或用户定制的页面不能用这种方法缓冲。
代码实现中......
分享到:
相关推荐
`http_image_filter_module`为Nginx带来了强大的图像处理能力,使得Web服务器不仅可以提供静态内容,还可以在服务器端对图像进行实时处理。通过合理配置和优化,可以显著提升用户体验,同时降低服务器负担。在...
在本文中,我们将深入探讨如何使用DirectShow在Visual Studio 2013环境下实现视频的实时显示,并进行抓图功能,同时允许用户自定义图像参数和视频格式。 首先,要进行DirectShow编程,你需要在你的开发环境中安装...
在这个案例中,CSS3可能被用来添加背景的阴雨效果,通过`filter`属性模拟雨滴的模糊感,或者使用`transform`属性实现白云的飘动。CSS3的`@keyframes`规则可用于定义动画的关键帧,让白云在一定时间内改变位置或大小...
在FFmpeg这个强大的多媒体处理工具中,添加水印通常是通过使用滤镜(filter)来实现的。然而,有一种特殊的方法可以不使用滤镜而在视频中添加水印,即直接操作`AVFrame`内存数据。这种方法适合对底层操作有深入理解...
- `image_filter_buffer`: 设置单个图片过滤时的缓冲区大小,以防止因图片过大导致的错误。默认值为1M,可根据实际需求调整。 - `test`: 检查请求的资源是否为JPEG、GIF或PNG格式的图片,如果不是,则返回415错误...
本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发...
本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发...
本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发...
本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发...
本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发...
本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发...
本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发...
本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发...
替代方案**: 对于“静态且状态相关”的数据,考虑使用其他方式实现,比如使用Session参数或直接在Expression变换中处理。 #### 四、在Expression变换中进行数据类型转换 **1. 数据类型转换**: 直接将字符串映射为...
【寒武纪CNCodeC开发】的第三次学习总结聚焦于多线程编程、环形缓冲模块、Makefile的使用、socket协议族的修改、动态库与静态库的应用、编译警告的解决,以及寒武纪硬件编解码SDK——CNCodec的详细分析。 一、升级...
2. **页面整体缓存**:对于一些静态或变化不频繁的页面,可以直接将整个页面作为缓存对象存储起来,以减少服务器处理请求的时间。 3. **页面片段缓存**:对于包含动态元素的页面,可以仅缓存页面中的某些部分(如...
1. 缓存技术:通过ob_start()开启缓冲,filemtime()检查文件修改时间,实现静态缓存,过期则重建。 2. SQL事务处理:利用SELECT ... FOR UPDATE语句实现行级锁,保证并发访问时库存数据的正确性。 3. 跨站数据获取...
通过一个URLConnection或者一个保存有网页内容的字符串来初始化Parser,或者使用静态函数来生成一个Parser对象。 ParserFeedback的代码很简单,是针对调试和跟踪分析过程的,一般不需要改变。而使用Lexer???? ...
它的主要特点是将HTML、CSS、JavaScript等静态内容与Java代码结合,实现动态网页的生成。在Java Web开发中,JSP通常作为MVC(Model-View-Controller)模式中的View部分,负责展示数据。 ### Tomcat配置 在学习JSP...
5. **Stream API**:如何使用Stream进行数据处理,了解并使用filter(),map(),reduce()等方法。 6. **并发编程**:线程池的创建和管理,Future和Callable接口,以及并发工具类如Semaphore,CountDownLatch等。 7....