一】设置缓存文件的有效日期
        重点方法:
            HttpServletRequest类:
                    1》String getRequestURI();//获取客户端地址栏的路径值
            HttpServletResponse类:
                    2》void SetDateHeader(String name, long endTime);
                            name:对应的浏览器类型。  IE浏览器为:expires
                            endTime:缓存文件失效的时间,单位为毫秒
                            
                            
        code:
            String uri = request.getRequestURI();
            //如果是一个html静态资源
            if(uri!=null && uri.endsWith("html")){
                String html = this.getServletConfig().getInitParameter("html");
                if(html!=null){
                    long end = Long.parseLong(html)*1000 + System.currentTimeMillis();
                    response.setDateHeader("expires",end);
                }
            }
    二】可以通过复写getLastModified方法来阻止每次刷新都访问服务端,来减轻服务端的压力
    
    原理:
        1》Servlet对象来应答客户端的请求的时候,首先会调用service()方法
        2》查看service()方法的源码,可以知道:
                    service()方法会调用getLastModified()方法,
                        如果此方法的返回值 > 客户端的时间:  调用doGet()或doPost()方法,并发送状态码200给客户端
                        如果此方法的返回值 == 客户端的时间:  发送状态码304给服务端
                        如果此方法的返回值 为-1:    调用doGet()或doPost()方法,并发送状态码200给客户端。

方法原型:
            protected long getLastModified(HttpServletRequest req);
            返回值:
                返回时间HttpServletRequest对象的最后修订时间,
                如果时间是未知的,则此方法返回一个负数(默认值)

1》返回值为 -1:代表文件最后一次修改的时间不确定
                处理方式:由于不知道最后一次修改时间,所以一定会调用doGet()或doPost()方法    ,来重新获取资源
        2》返回值 不等于 -1:代表文件最后一次修改的时间
                处理方式:拿文件最后一次修改的时间和缓存中的时间来进行对比,(此过程通过tomcat服务器来实现)
                                    如果文件已经更新,需要调用doGet()或doPost()方法,重新获取资源(并发送:202)
                                    如果文件版本一样,会发送304状态码,让客户端自己在缓存文件中找。
                                    
 思路:
             所以我们可以通过资源对象的lastModified()方法,获取服务器最后一次修改资源的时间。    
                
    补充:
    
                
                servlet源码:
                Servlet{SUN源码
                
                        service()
                        {
                           if(req.getHead(“if-lastxxx”)==null)
                           {
                             res.setHead(“lastxx”,”时间值”);
                             doXXX();
                           }
                           if(getLastModified()>IE时间值)
                           {
                              res.setHead(“lastxx”,”时间值”);
                              doXXX();
                           }else{
                                  res.setStatus(304); 
                              }
                        }
                        getLastModified(){
                            return 时间值
                        }
                    }
    code:
    /*设置为*/

/*此代码有问题*/
            
            public class Demo7 extends HttpServlet {
            
                @Override
                protected long getLastModified(HttpServletRequest req) {
                    System.out.println("modifi");
                    /*将资源的路径从工程的路径转换到真实的路径*/
                    String path = this.getServletContext().getRealPath("/doc/resource.txt");
                    File file = new File(path);
                    return file.lastModified(); 
                }
            
                public void doGet(HttpServletRequest request, HttpServletResponse response)
                        throws ServletException, IOException {
                    ServletContext context = this.getServletContext();
                    InputStream is = context.getResourceAsStream("/doc/resource.txt");
                    
                    ServletOutputStream sos = response.getOutputStream();
                    byte[] buf = new byte[1024];
                    int len = -1;
                    while((len=is.read(buf)) > 0){
                        sos.write(buf, 0, len);
                    }
                    
                    System.out.println("serv");
                    is.close();
                    sos.close();
                }
            
            }

注意:
            1》关于缓存的刷新
                对于浏览器的刷新而言,当浏览器缓存中有此资源,也会找服务端重新要资源;
                而在回车访问的情况下,才直接找缓存,不会找服务端要。            
            2》
                其实浏览器访问的html静态资源本质上是由一个缺省的Servlet来帮你处理,转发给客户端的。
                    
补充:servlet对象常见方法
    1》获得一个ServletConfig对象
        ServletConfig getServletConfig();
    2》获取一个ServletContext对象
        ServletContext getServletContext();

http://www.cnblogs.com/SkyGood/p/3970507.html

Servlet高级应用---Servlet与缓存的更多相关文章

  1. servlet 高级知识之Filter

    Filter叫做拦截器, 对目标资源拦截,拦截HTTP请求和HTTP响应,本质是对url进行拦截. 与serlvet不同的是, Filter的初始化是随着服务器启动而启动. 在Filter接口中定义了 ...

  2. Servlet高级部分Listener

    监听器的使用场景: ①:统计在线人数   ②:实现单一登录[一个账号只能在一台机器上登录] Servlet中的8大监听器: 1.         ServletContextListener [接口方 ...

  3. Servlet高级部分Filter(过滤器)

    一:Filter称之为"过滤器",用在Servlet外,对request和response进行修改.它是AOP(面向切面编程思想的一种体现),Filter中有一个FilterCha ...

  4. 严重: Servlet.service() for servlet jsp threw exception java.lang.IllegalStateException: getOutputStream() has already been called

    错误: 严重: Servlet.service() for servlet jsp threw exception java.lang.IllegalStateException: getOutput ...

  5. Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】

    什么是Serlvet? Servlet其实就是一个遵循Servlet开发的java类.Serlvet是由服务器调用的,运行在服务器端. 为什么要用到Serlvet? 我们编写java程序想要在网上实现 ...

  6. 【Servlet】(1)Servlet简介、Servlet底层原理、Servlet实现方式、Servlet生命周期

    一.Servlet简介 1.Servlet定义: Servlet(Server Applet)是Java Servlet的简称,是为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交 ...

  7. servlet单例模式以及servlet的请求流程

    ​ 目录 一.servlet 单例模式: 二.servlet的请求流程: ★ 流程: ★ 详细过程如下: 一.servlet 单例模式: tomcat服务器,通过Java的反射机制来自动调用servl ...

  8. javaweb项目jsp跳转servlet Error instantiating servlet class 问题

    问题: HTTP Status 500 - Error instantiating servlet class RecommenderServlet type Exception report mes ...

  9. Servlet过滤器,Servlet过滤器创建和配置

    第一:Servlet的过滤器的创建和配置,创建一个过滤器对象需要实现javax.servlet.Filter接口,同时实现Filter的3个方法.        第一方法是过滤器中的init()方法用 ...

随机推荐

  1. 获取本地IP和端口号的指令

    ipconfig就可以获取ip 获取端口号的指令: 开始--运行--cmd--输入netstat an(中间有一空格)

  2. PAT L1-009. N个数求和

    本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数“分子/分母”的形式给出的,你输出的和也必须是有理数的形式. 输入格式: 输入第一行给出一个正整数N(<=100).随后一行按格 ...

  3. 如何创建windows xp 虚拟机

         如何创建windows xp 虚拟机 一.所需软件 1. VMware-workstation-full-12.0.0-2985596 赠送vm12 激活key一枚: 5A02H-AU243 ...

  4. 学习笔记_Filter小结(过滤器JavaWeb三大组件之一)

    Filter小结 Filter的三个方法: l  void init(FilterConfig):在Tomcat启动时被调用: l  void destroy():在Tomcat关闭时被调用: l  ...

  5. Visual C++ 打印编程技术-内存设备环境

    1.内存设备环境 内存设备环境是一个没有设备与它联系的环境.一般利用与某个标准设备环境兼容的内存设备环境把一个位图复制到屏幕上去.为此可以先创建一个与某个标准设备环境兼容的内存设备环境,然后把所要显示 ...

  6. Oracle 11g gateways(透明网关)配置

    配置要点主要有三点: 1.%GATEWAYS_HOME%(透明网关安装目录)\dg4msql\admin\initdg4msql.ora 内容: HS_FDS_CONNECT_INFO=localho ...

  7. 数据操作So easy-LINQ解析

    1.LINQ是什么? LINQ是Language Integrated Query的缩写,即“语言集成查询”的意思.LINQ的提出就是为了提供一种跨越各种数据源的统一的查询方式,它主要包含4个组件-- ...

  8. 动态加载js、css 代码

    一.原生js: /** * 加载js和css文件 * @param jsonData.path 前缀路径 * @param jsonData.url 需要加载的js路径或css路径 * @param ...

  9. 【制作镜像】virsh

    首先进入到图形界面 常用virsh指令: 1)virsh list 列出当前虚拟机列表,不包括未启动的 2)virsh list --all 列出所有虚拟机,包括所有已经定义的虚拟机 3)virsh ...

  10. 在HTML中插入回车换行

    在制作EPUB的时候,发现原来收集的html文本根本就没有换行,这个在代码里面是无法忍受的,因为看着比较混乱,全部都是在一行里面,这个就像写作文的时候,你看到的文字全部都是在一行里面显示出来的,根本就 ...