缺省Servlet的缓存问题

 

缺省Servlet的缓存问题

l     场景:

      在实际项目中,有些HTML文件是在程序运行时调用一个模版文档来动态生成的,例如,一些站点的统计报表就是在用户访问某个Servlet时,由这个Servlet临时调用报表生成模块(例如,ireport)生成一个HTML文件,然后再将请求转发这个HTML文件。

l     问题:

      如果A部门的一个员工查看了A部门的统计信息后的一个较短时间范围内,B部门的员工来查看B部门的统计信息,结果后者看到的是A部门的统计信息。

l     缺省Servlet缓存问题的模拟程序(1)

 

public class ReportServlet extends HttpServlet

{

      private int count = 0;

      public void service(HttpServletRequest request,

           HttpServletResponse response) throws ServletException, IOException

      {

           response.setContentType("text/html;charset=UTF-8");

          

           //禁止浏览器缓存

           response.setDateHeader("Expires",0);

           response.setHeader("Cache-Control","no-cache");

           response.setHeader("Pragma","no-cache");         

          

           String department = request.getParameter("dept");

           synchronized(this)

           {

                 System.out.println(++count + ":" + department);

                 String path = getServletContext().getRealPath("/WEB-INF/report.html");

                 ReportTool rt = new ReportTool();

                 rt.setCount(count);

                 rt.setDepartment(department);

                 rt.createReportHTML(path);

                 RequestDispatcher rd = getServletContext().getRequestDispatcher(

                                  "/WEB-INF/report.html");

                 rd.forward(request,response);

           }

      }

}

l     缺省Servlet缓存问题的模拟程序(2)

public class ReportTool

{

      private int count = 0;

      private String department = "";

      public void setCount(int count)

      {

           this.count = count;

      }

      public void setDepartment(String department)

      {

           this.department = department;

      }

      public void createReportHTML(String path) throws IOException

      {

           FileOutputStream fos = new FileOutputStream(path);

           OutputStreamWriter ops = new OutputStreamWriter(fos,"UTF-8");

           ops.write(String.valueOf(count) + ":" + department + "的统计信息");

           ops.close();

      }

}

l     缺省Servlet缓存问题à实践

l     文件清单:ReportTest.html

      <a href="servlet/ReportServlet?dept=DEPT_A">查看部门A的统计信息</a>

      <a href="servlet/ReportServlet?dept=DEPT_B">查看部门B的统计信息</a>

l     缺省Servlet缓存问题à解决方案

, 1,为每一种统计方案都生成一个名称不同的HTML报表文件,例如,不同部门使用不同名称的报表文件。如果统计方案比较多,生成的HTML报表文件的个数也就会很多,所以,这个方案比较适合只有少数几种固定的统计方案的情况,特别不适合要根据各种组合条件来生成报表的情况。

,2,修改Tomcat的缺省Servlet程序,让它不要进行缓存,这种方案可能会严重影响系统的性能,一般不要采用。

,3,在ReportServlet程序中生成HTML报表文件后,按字节流的形式读取该文件中的内容,然后以字节流的形式直接输出到客户端。这种方案可以生成实时的统计报表,也适合根据各种组合条件来生成报表的情况,所以,推荐采用这种方案。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值