• 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();

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

  • 相关阅读:
    python报错:【 AttributeError module 'time' has no attribute 'clock'】
    Python批量重命名脚本
    【Java】复制文件打印流改进版
    【Java】复制多级文件夹
    【CSS】仿京东锚点侧边栏效果
    【Java】复制单级文件夹
    【Java】序列化&反序列化
    冒泡排序与优化 如何实现最优时间复杂度为O(n)的冒泡排序
    NodeRED中连接Mysql数据库并实现增删改查的操作
    NodeRED中使用exec节点实现调用外部exe程序
  • 原文地址:https://www.cnblogs.com/daishuguang/p/3991592.html
Copyright © 2020-2023  润新知