源码如下:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; charset=gb2312"%><%!
  private int count; // 计数
  
  private final long MODIFIED_TIME = System.currentTimeMillis() / 1000 * 1000;  protected long getLastModified(HttpServletRequest request) {
  return MODIFIED_TIME;
  }
%><%
  response.setHeader("Cache-Control","public"); //这里已经给出命令要求开启缓存
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'TestCache.jsp' starting page</title>        
    <meta http-equiv="pragma" content="public"> //这里已经给出命令要求开启缓存
    <meta http-equiv="cache-control" content="public"> //这里已经给出命令要求开启缓存
  </head>
  
  <body>
    This is my JSP page. <p>
    count= <%=(++count) %> // 这个值每次都增大1,应该是说明没有缓存吧
  <br>
  </body>
</html>怎么这个JSP页面无法缓存啊,每次刷新 count的值都增大1,说明是没有被缓存吧 我觉得应该是会被缓存的啊,请问各位这到底是甚么原因啊???

解决方案 »

  1.   

    count= <%=(++count) %> // 这个值每次都增大1,应该是说明没有缓存吧
    ??????这个难道不是缓存吗?在tomcat容器中,一个JSP文件只对应一个类对象,你设置的是全局,当然是每次都加1,这个本来就是缓存,不知道你说的缓存是什么意思。
      

  2.   

    我是这个意思:1.客户端向服务器中的某个页面发出请求
    2.服务端响应客户端请求并将一个Last-Modified报头伴随正文发送给了客户端
    3.过了一段时间后,客户端又向这个页面发出了请求并伴随了一个If-Modified-Since报头
    4.服务器收到了客户端的请求,并将请求中的If-Modified-Since报头所指明时间(time1)和这个页面在服务器上被改动的时间(time2)相对比
    5.若time1在time2之后,服务器应该不会发送这个页面的正文,而是只发送一个状态码为304的报头来告诉客户端这个页面应该从客户端缓存提取出来我想证实的就是以上这个过程,但既然客户端每次请求后,count的值都增加了1,那就是说明每次服务器都是发送了正文体来响应客户端的请求的啊,如果是从客户端的Cache中提取这个页面来显示,那count的值不变才对啊,我就是这里搞不明白了......如果我有甚么地方理解或表示错了,欢迎大家指正希望大家有知道的帮帮忙,解答一下这个问题,谢了
      

  3.   

    首先你要弄明白什么是JSP缓存web服务器会把jsp编译后再对用户服务,所以jsp本身除非页面变化,否则不存在缓存问题按照你的jsp页面逻辑,就是每个客户访问一次就刷新一次,很正常如果你希望浏览器能缓存页面,比如1小时,需要计算expired date:
    response.setHeader("Cache-Control", "Private");
    response.addDateHeader("Expires", System.currentTimeMillis() + 3600000);但是这个仅仅告诉浏览器,尽量用缓存的内容,而不要每次都连接服务器。但是浏览器端是服务器无法控制的,在IE中,只要按F5刷新,IE不管有无缓存都会请求服务器如果确实需要一个用户在一段时间仅投票一次,考虑Session,或者让用户登录,可以保证每个用户仅投票一次
      

  4.   

    只要按F5刷新,IE不管有无缓存都会请求服务器  ??????那你的意思是 IE不能支持缓存啊???不会吧
      

  5.   

    楼上说的好像都有些问题
    当页面中包含有服务器端指令的时候,不管html是否打开缓存,数据都会被重新加载
    而楼主所指的缓存,实际上是浏览器对一些静态的东西的缓存
    像图片、javascript文件、css文件
    楼主的指令,意思就是告诉浏览器在指定的时间内,从高速缓存中读取图片等信息来填充当前页面、而不是从服务器重新下载
    而要缓存动态的脚本,估计实现可能性很小
    因为到目前为止,jsp还没有在api级实现缓存功能(在asp.net中已经实现,被称为页输出缓存)
      

  6.   

    绝对被缓存了
    检查的方法可以用firefox测试,在firefox的页面属性中可以看到页面文件的来源是磁盘缓存
    还有一个方法
    在本地测试,先完全载入页面,假设页面中有一个相对路径为 image/pic.gif的图片
    重命名这个图片文件,或修改这个图片
    刷新页面,发现图片还是原来的没有变化,说明图片被缓存了其实,只要你不在html页面中加入禁止缓存页面的指令,IE或其它浏览器都默认的会将一些文件缓存在本地磁盘中