Java将JSP页面保存在缓存中

时间:2018-07-02 10:59:47

标签: javascript java jsp caching java-api

我想使用缓存加载JSP页面。 我已经使用Java JSP Servlet创建了一个动态Web项目。

在这个项目中,我从Rest API调用中获取数据(以JSON格式),并将该数据动态地呈现到表内的JSP页面中。

我还在API数据中获得了带有数据时间的键名'lastUpdate'。

第一次,我必须在表中渲染数据,然后在调用Rest API之后第二次,我必须检查我的“ lastUpdate”(在缓存中可用)时间是否与“ lastUpdate”时间相同调用REST API,然后必须使用缓存显示同一页面。

我不确定是否可以,我是缓存管理的新手。

因此,请分享您的反馈意见以及一些可供我参考的示例或教程。

2 个答案:

答案 0 :(得分:3)

您可以在标题行中使用日期,例如:

'If-Modified-Since': 'Fri, 06 Jun 2018 01:16:45 GMT'

这告诉浏览器使用浏览器缓存存储数据,如果自那时以来未对其进行修改。

服务器在创建数据时使用字段进行通信:

'Last-Modified': 'Fri, 06 Jun 2018 10:15:25 GMT'

当您询问If-Modified-Since时,您将获得304(未修改)或200 OK(具有新的Last-Modified值)。

答案 1 :(得分:0)

这是我从您的问题中了解的信息:

  1. 您将HttpRequest发送到服务器
  2. 您从REST API中获取数据
  3. 数据响应包含lastUpdated时间
  4. 您要呈现页面并记下数据时间戳记
  5. 下次如果收到相同的请求,请检查REST API,并且updatedTime保持不变,您想返回相同的旧渲染字符串/字节[]

假设: 该页面对所有客户都是通用的,并且没有搜索查询等。因此,唯一的问题是是否再次呈现该页面。也就是说,我们不会在缓存中保留多个JSP。只能“返回相同的jsp”或“重新发送它”

这是我的想法:

  1. 确定要缓存JSP吗?考虑一下请求处理时间... 90%的时间将用于进行REST Api调用,而仅10%(或更少)的时间将用于呈现JSP。因此,从缓存中获取的收益很少。
  2. 呈现的JSP页面的大小可能很大(可能是5kb到50kb?)。因此,将其保留在缓存中可能是一个更大的问题。再生更好。 (CPU很便宜,短期内存很便宜,长期内存很昂贵,因为它可能导致GC暂停)
  3. 必须是JSP吗?有一些选项,例如Thymeleaf和其他模板引擎。他们可以帮助呈现html字符串。 (因为JSP与ServletOutputStream更加紧密地联系在一起,并且可能对缓存提出了一些挑战。模板化引擎可能会简化缓存过程,因为它们的联系不紧密)

如果您仍然想缓存JSP,这可能会起作用:

  1. 如果数据已更改/第一次:创建HttpServletResponse的包装,该包装将提供替换流,而不是真实的servlet输出流。 (它应该保留一个副本并转发到真实的servlet输出流。使用响应包装器来调用转发:

    request.getRequestDispatcher(xyz.jsp“)。forward(req,resWrapper);

  2. 如果数据未更改,请从步骤1中备份并写入输出:

    PrintWriter out = response.getWriter(); out.write(backupStr);