Java 基于URL参数的缓存JSP

Java 基于URL参数的缓存JSP,java,performance,jsp,caching,Java,Performance,Jsp,Caching,我有一个jsp文件pageshow.jsp和参数id 有没有办法根据url参数在服务器端缓存jsp文件 请求页面pageshow.jsp?id=100从缓存获取,而不是从服务器生成 请求页面pageshow.jsp?id=200从缓存获取,而不是从服务器生成 以上两个页面的缓存内容应该不同,因为它们的参数不同 这可以避免在服务器端重建jsp文件,还可以减少服务器负载您可以创建只映射到此jsp页面的cachinttpFilter,并执行以下操作: 检查缓存内容是否存在 如果存在,就返回它 如果不

我有一个jsp文件pageshow.jsp和参数id

有没有办法根据url参数在服务器端缓存jsp文件

请求页面pageshow.jsp?id=100从缓存获取,而不是从服务器生成
请求页面pageshow.jsp?id=200从缓存获取,而不是从服务器生成

以上两个页面的缓存内容应该不同,因为它们的参数不同


这可以避免在服务器端重建jsp文件,还可以减少服务器负载

您可以创建只映射到此jsp页面的
cachinttpFilter
,并执行以下操作:

  • 检查缓存内容是否存在
  • 如果存在,就返回它
  • 如果不存在,则调用chain.doFilter(请求、响应)将转到请求的JSP。但是传递特殊的响应(响应包装器),它存储JSP返回的所有字节并缓存它们

您可以创建只映射到此JSP页面的
CachingHttpFilter
,并执行以下操作:

  • 检查缓存内容是否存在
  • 如果存在,就返回它
  • 如果不存在,则调用chain.doFilter(请求、响应)将转到请求的JSP。但是传递特殊的响应(响应包装器),它存储JSP返回的所有字节并缓存它们

我会考虑使用类似于AlexR建议的
CachingHttpFilter
,但考虑使用HTTP头来控制缓存,而不是将数据存储在自己的内容缓存中

很好地解释了如何在以后请求URL时比较
(如果自
HTTP头被修改)。然后由您的过滤器返回
http304
响应

日期比较:

客户端要求服务器访问特定页面:如果客户端有 已经读取了页面,它会发送一个包含 其缓存页面的最后修改日期(例如“如果修改自: 2002年7月21日13:47:24 GMT);如果此后未修改,则也会出现标题

服务器将客户端提供的此日期与上一个日期进行比较 请求页面的修改日期:

如果服务器上的页面具有相同的日期,则服务器会通知 客户端可以在其缓存中使用该版本的页面(“HTTP/1.1”) 304未修改”)。客户端和服务器之间的交换停止 在那里

如果服务器上的页面较新,则服务器会通知客户端 更改日期(“最后修改日期:2012年6月21日08:45:37 GMT”),并发送 将此页面发送到客户端。浏览器将存储最后一次更改的日期 页面

您还需要查看


不幸的是,缓存听起来很简单,但通常很难做到正确。优化数据库查询通常是从提高应用程序性能开始的最佳途径。

我想看看如何使用类似于AlexR建议的
CachingHttpFilter
,但看看如何使用HTTP头来控制缓存,而不是将数据存储在自己的内容缓存中

很好地解释了如何在以后请求URL时比较
(如果自
HTTP头被修改)。然后由您的过滤器返回
http304
响应

日期比较:

客户端要求服务器访问特定页面:如果客户端有 已经读取了页面,它会发送一个包含 其缓存页面的最后修改日期(例如“如果修改自: 2002年7月21日13:47:24 GMT);如果此后未修改,则也会出现标题

服务器将客户端提供的此日期与上一个日期进行比较 请求页面的修改日期:

如果服务器上的页面具有相同的日期,则服务器会通知 客户端可以在其缓存中使用该版本的页面(“HTTP/1.1”) 304未修改”)。客户端和服务器之间的交换停止 在那里

如果服务器上的页面较新,则服务器会通知客户端 更改日期(“最后修改日期:2012年6月21日08:45:37 GMT”),并发送 将此页面发送到客户端。浏览器将存储最后一次更改的日期 页面

您还需要查看


不幸的是,缓存听起来很简单,但通常很难做到正确。优化数据库查询通常是提高应用程序性能的最佳起点。

JPS(在Java类中)只在第一次被访问时构建一次。您希望通过“缓存”实现什么?如果页面创建非常昂贵,您可能更愿意检查是否可以缓存所需数据库操作的结果。+1@f_puras。JSP只编译一次。您可能可以预编译JSP。@f_puras我还希望缓存JSTL/scriptlet结果。例如,在第页中,我显示产品ID:-,在这种情况下,我想缓存这部分代码生成的输出。您想在服务器上缓存请求参数值吗?请原谅,但我怀疑您是否知道是什么导致了服务器负载。为什么不与我们共享您的JSP代码,这样我们就知道我们在谈论什么了?@f_puras简单地说,我想将动态页面转换为静态页面并保存到磁盘,一旦相同的页面再次被客户端使用相同的get参数请求,而不是转到控制器或dao,只是从静态页面读取,这将减少构建页面时服务器端的负载,对吗?JPS在第一次被访问时只构建(到Java类中)一次。您希望通过“缓存”实现什么?如果页面创建非常昂贵,您可能更愿意检查是否可以缓存所需数据库操作的结果。+1@f_puras。JSP只编译一次。您可能可以预编译JSP。@f_puras我还希望缓存JSTL/scriptlet结果。在第页中,我显示了产品ID:-,在第