zoukankan      html  css  js  c++  java
  • Servlet高级应用---Servlet与缓存

        一】设置缓存文件的有效日期
            重点方法:
                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();
           

  • 相关阅读:
    LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
    洛谷 P1969 积木大赛 —— 水题
    洛谷 P1965 转圈游戏 —— 快速幂
    洛谷 P1970 花匠 —— DP
    洛谷 P1966 火柴排队 —— 思路
    51Nod 1450 闯关游戏 —— 期望DP
    洛谷 P2312 & bzoj 3751 解方程 —— 取模
    洛谷 P1351 联合权值 —— 树形DP
    NOIP2007 树网的核
    平面最近点对(加强版)
  • 原文地址:https://www.cnblogs.com/SkyGood/p/3970507.html
Copyright © 2011-2022 走看看