servlet 与缓存(4)
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)的更多相关文章
- Servlet数据缓存
缓存是提高数据访问能力,降低服务器压力的一种必要的方式,今天我要说的数据缓存方式有两种,1-->session对单个数据访问接口页面的数据进行缓存,2-->单例模式对整个servlet页面 ...
- Servlet高级应用---Servlet与缓存
一]设置缓存文件的有效日期 重点方法: HttpServletRequest类: 1>String getRequest ...
- servlet设置缓存时间以及文件的下载
缓存时间的设置: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletE ...
- 初学Java Web(4)——Servlet学习总结
经过一段时间的学习,对于Servlet有了新的不一样的见解,在这里做一下总结,将近来学习到的知识总结一下. Servlet 的请求流程 浏览器发出请求:http://localhost:80/xxx1 ...
- 初学Java Web(3)——第一个Servlet
这学期 Java Web 课程的第一节课就简短复习了一下 Java 的一些基础知识,所以觉得 Java 的基础知识还是很重要的,但当我想要去写一篇 Java 回顾的文章的时候发现很难,因为坑实在太多了 ...
- 04_web基础(四)之servlet详解
16.17.18.servlet生命周期 javax.servlet.Servlet接口方法:public String getServletInfo():获取Servlet相关信息(作者,版权,版本 ...
- servlet单例模式以及servlet的请求流程
目录 一.servlet 单例模式: 二.servlet的请求流程: ★ 流程: ★ 详细过程如下: 一.servlet 单例模式: tomcat服务器,通过Java的反射机制来自动调用servl ...
- Java Web(五) JSP详解(四大作用域九大内置对象等)
前面讲解了Servlet,了解了Servlet的继承结构,生命周期等,并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解,但是我们会发现在Servlet中编 ...
- JavaWeb(三)JSP之3个指令、6个动作、9个内置对象和4大作用域
前言 前面大概介绍了什么是JSP,今天我给大家介绍一下JSP的三个指令.6个动作以及它的9大内置对象.接下来我们就直接进入正题 一.JSP的3个指令 JSP指令(directive)是为JSP引擎而设 ...
随机推荐
- 分蛋糕(C - 二分查找)
分蛋糕 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/C Description My birthd ...
- Non recursive Depth first search
深度优先非递归实现算法: 1 递归算法: //初始化相关数据结构 DFS(G) ------------------------------------------------------------ ...
- 迪杰斯特拉算法c语言实现
/*http://1wangxiaobo@163.com 数据结构C语言版 迪杰斯特拉算法 P189 http://1wangxiaobo@163.com 编译环境:Dev-C++ 4.9.9.2 ...
- float与position
使用float会使块级元素的宽高表现为包裹内容(在不设定宽高的情况下) 这是当然的 我们使用float就是使几个div排在一行 当然不可能在宽度上撑满父元素啦 至于高度 不论有没有float 高 ...
- IT第十八天 - 类的封装、继承、重载、上周总结★★★
IT第十八天 上午 封装 1.关键字this,是表示该类在实例化时的对象,即this.表示为该对象的属性 2.类的数据保护,set.get方法的写法规则,为了之后的反射机制的读取数据,set方法中对于 ...
- ubuntu 下关闭MySql server
转自 http://blog.csdn.net/tobacco5648/article/details/7625048 在终端输入命令 开启: sudo /etc/init.d/mysql ...
- poj 1731 Orders(暴力)
题目链接:http://poj.org/problem?id=1731 思路分析:含有重复元素的全排列问题:元素个数为200个,采用暴力枚举法. 代码如下: #include <iostream ...
- 为了肾六(dp)
为了肾六 时间限制:4000 ms | 内存限制:210535 KB 难度:2 描述 最近肾六很流行,goshawk看身边的朋友都用上了apple.自己还用着W年前的Samsung.于是决定去 ...
- [置顶] C++ Pirate: Lambda vs Bind
Lambda 与 Bind的性能比较 转载请说明出处:http://blog.csdn.net/cywosp/article/details/9379403 先让我们看看下面函数: template ...
- 关于闹钟设置AlarmManager类方法参数解释
1.AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用 ...