1.设置缓存的两种情况:

第一种:对于不常常变化的数据,在servlet中能够为其设置合理的缓存时间值,以避免浏览器频繁向server发送请求,提升server的性能。

另外一种:假设要实现一种高级功能,即client请求动态web资源时,动态web资源发现发给client的数据更新了,就给client发送最新的数据,假设发现数据没有更新,则动态web资源就要client就去訪问它自己缓存的数据。此种情况能够通过覆写动态web资源(即servlet)的getLastModify方法予以实现。

getLastModified方法由service方法调用,默认情况下,getLastModified方法返回一个负数,开发者在编写servlet时,假设不覆盖getLastModified方法,则每次訪问servlet时,service方法发现getLastModified方法返回负数,它就会调用doXXX方法向client返回最新的数据。此种情况下,server在向client返回doXXX方法返回的数据时,不会在数据上加Last-Modified头字段。

2.思路和方法:

    假设编写servlet时,覆盖了getLastModified方法,并返回某一个时间值,则client訪问Servlet时,service方法首先会检查client是否通过If-Modified-Since头字段带一个时间值过来。假设没有的话,则service方法会调用doXXX方法向client返回最新的数据。在返回数据时,service方法还会调用getLastModified方法得到一个时间值,并以这个时间值在数据上加上一个Last-Modified头字段。(即通知client缓存数据)

    client在訪问servlet时,假设通过If-Modified-Since头字段带了一个时间值过来,则service方法在调用doXXX方法之前,它会先调用getLastModified方法,得到一个时间值,并与client带过来的时间值进行比較,假设比client的时间值要新,则service方法调用doXXX方法向client返回最新的数据。假设要旧,则service方法而不会调用doXXX方法向client返回数据,而是返回一个304的状态码给client,通知client在拿它缓存中的数据。

3.缓存的应用

    一个站点有非常多静态资源,比如css文件、html页面、gif图片等等,这些文件一旦创建,有可能永远不会更新。当client第一次訪问这些文件时,server在把文件数据交给client的同一时候,就应该通知client缓存这些文件,以后client每次訪问,server假设发现文件没更新,则应要client去拿它缓存中的文件,以减轻server的压力。

Tomcatserver中的全部静态web资源,都是由一个缺省servlet负责读取回送给client的,它就是以上方式来提升server的性能。

4.缓存的小小代码练习

package cn.wwh.www.web.servlet;



import java.io.File;

import java.io.IOException;

import java.io.InputStream;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;





/**

 *类的作用:简单的练习了缓存的应用,主要是覆写了

 * 

 *@author 一叶扁舟

 *@version 1.0

 *@创建时间: 2014-7-28 下午02:28:50

 */

public class CacheDate extends HttpServlet {

// 覆写getLastModified方法

@Override

protected long getLastModified(HttpServletRequest req) {

// 返回包括给定的虚拟路径的真实路径的字符串。

String filePath = this.getServletContext().getRealPath("/login.html");

System.out.println("文件的真实路径:" + filePath);

File file = new File(filePath);

// 返回此抽象路径名表示的文件最后一次被改动的时间。

return file.lastModified();

}



public void doGet(HttpServletRequest request, 

HttpServletResponse response)

throws ServletException, IOException {

ServletContext context = this.getServletContext();

InputStream is = context.getResourceAsStream("/login.html");

ServletOutputStream sos = response.getOutputStream();

int len = 0;

byte[] buf = new byte[1024];

while((len = is.read(buf))>0){

sos.write(buf,0,len);

}

sos.flush();

sos.close();

}

}

5.总结:

  (1)对于浏览器的刷新而言,当浏览器缓存中有资源,也会找服务端要资源,仅仅有在回车訪问情况下,才找缓存,这个能够通过httpwatch观察。

  (2)能够通过重写getLastModified()方法来阻止每次刷新都訪问服务端,以减轻服务端的压力

  (3)设置缓存的时间,用发送报文头的方式

  long end = Long.parseLong(date)*1000 + System.currentTimeMillis();

  response.setDateHeader("expires",end);//发送给client浏览器缓存存留的时间

  



servlet 与缓存(4)的更多相关文章

  1. Servlet数据缓存

    缓存是提高数据访问能力,降低服务器压力的一种必要的方式,今天我要说的数据缓存方式有两种,1-->session对单个数据访问接口页面的数据进行缓存,2-->单例模式对整个servlet页面 ...

  2. Servlet高级应用---Servlet与缓存

    一]设置缓存文件的有效日期        重点方法:            HttpServletRequest类:                    1>String getRequest ...

  3. servlet设置缓存时间以及文件的下载

    缓存时间的设置: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletE ...

  4. 初学Java Web(4)——Servlet学习总结

    经过一段时间的学习,对于Servlet有了新的不一样的见解,在这里做一下总结,将近来学习到的知识总结一下. Servlet 的请求流程 浏览器发出请求:http://localhost:80/xxx1 ...

  5. 初学Java Web(3)——第一个Servlet

    这学期 Java Web 课程的第一节课就简短复习了一下 Java 的一些基础知识,所以觉得 Java 的基础知识还是很重要的,但当我想要去写一篇 Java 回顾的文章的时候发现很难,因为坑实在太多了 ...

  6. 04_web基础(四)之servlet详解

    16.17.18.servlet生命周期 javax.servlet.Servlet接口方法:public String getServletInfo():获取Servlet相关信息(作者,版权,版本 ...

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

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

  8. Java Web(五) JSP详解(四大作用域九大内置对象等)

    前面讲解了Servlet,了解了Servlet的继承结构,生命周期等,并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解,但是我们会发现在Servlet中编 ...

  9. JavaWeb(三)JSP之3个指令、6个动作、9个内置对象和4大作用域

    前言 前面大概介绍了什么是JSP,今天我给大家介绍一下JSP的三个指令.6个动作以及它的9大内置对象.接下来我们就直接进入正题 一.JSP的3个指令 JSP指令(directive)是为JSP引擎而设 ...

随机推荐

  1. jquery自定义分页插件

    //每次只显示5个页码(function ($) { //设定页码方法,初始化 $.fn.setPager = function (options) { var opts = $.extend({}, ...

  2. matlab实现协同过滤之pdist、squareform

    实现协同过滤算法的第一步是:计算用户或项目之间的相似度.接下来介绍pdist和squareform 用法: D = pdist(X) D = pdist(X,distance)   D = pdist ...

  3. 我的Python成长之路---第六天---Python基础(20)---2016年2月20日(晴)

    一.面向对象基础 面向对象名词解释: 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公 ...

  4. java 语法 java没学好,休想学好安卓!

    int...a 里面的...表示可变参数,也就是说这是一个长度不定的数组 instanceof : instanceof关键字用于判断一个引用类型变量所指向的对象是否是一个类(或接口.抽象类.父类)的 ...

  5. C# 计算器 如果设置键盘输入的监听事件

    这个事情困扰了我好久,之前java写的计算器程序可以正常运行了,但是因为打包问题(尝试过多次,感觉好麻烦,个人比较崇尚“点子”,注重创新,思来想去之后,决定试试C#模仿java再写一遍),想要用C#模 ...

  6. BZOJ 1632: [Usaco2007 Feb]Lilypad Pond

    题目 1632: [Usaco2007 Feb]Lilypad Pond Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 390  Solved: 109[ ...

  7. BZOJ 1607: [Usaco2008 Dec]Patting Heads 轻拍牛头

    1607: [Usaco2008 Dec]Patting Heads 轻拍牛头 Description   今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏.     贝茜让N(1≤N≤10 ...

  8. android -- 蓝牙 bluetooth (三)搜索蓝牙

    接上篇打开蓝牙继续,来一起看下蓝牙搜索的流程,触发蓝牙搜索的条件形式上有两种,一是在蓝牙设置界面开启蓝牙会直接开始搜索,另一个是先打开蓝牙开关在进入蓝牙设置界面也会触发搜索,也可能还有其它触发方式,但 ...

  9. 【Web】java date 到 Oracle date 精确到时分秒

    有两种方法: java.util.Date startTime=new Date("2014/01/01 23:00:00"); 1.new Timestamp(startTime ...

  10. Javascript 运动基础 01

    JS运动基础  运动基础   让Div运动起来 速度——物体运动的快慢 运动中的Bug 不会停止 速度取某些值会无法停止 到达位置后再点击还会运动 重复点击速度加快   匀速运动 速度不变 <s ...