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引擎而设 ...
随机推荐
- Lowest Common Multiple Plus
Lowest Common Multiple Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- 分布式session
前端用户请求经过随机分发之后,可能会命中后端任意的Web Server,并且 Web Server 也可能会因为各种不确定的原因宕机.在这种情况下,session 是很难在集群间同步的,而通过将ses ...
- C#后台跳转
后台跳转的方法: 1.js脚本 [不推荐使用] Context.Response.Write("<script language=javascript>window.locati ...
- 一維條碼編碼規則(1D Barcode)
1.Code 39 條碼:又分 標準型Code 39 條碼(Standard Code 39):資料內容包含有0~9數字,A~Z英文字母,”+”,”-“,”*”,”/”,”%”,”$”,”.”以及sp ...
- Tilemill + tilestream + mapbox.js 自制地图
感谢Mapbox,带来了一整套完整的地图方案. 你可以把你的地图放在Mapbox的网站上.也可以使用他们提供的开源软件自己架设地图服务. Mapbox的地图方案包括web,ios和android. 不 ...
- ThinkPHP - 自定义标签库 - 标签驱动
ThinkPHP 官方文档:http://document.thinkphp.cn/manual_3_2/taglib_driver.html 创建一个类,继承自TagLib类: <?php / ...
- 友盟iOS微信登陆没有回调的原因
1.在友盟文档中这样说: 链接 7.4 微信登录 添加配置文件参考文档:添加微信及朋友圈,添加相关库文件,配置URL schemes及添加系统回调 注意微信登录必须先在微信开放平台申请微信登录权限 在 ...
- [Swust OJ 1026]--Egg pain's hzf
题目链接:http://acm.swust.edu.cn/problem/1026/ Time limit(ms): 3000 Memory limit(kb): 65535 hzf ...
- 【转】CentOS 6.5 生产环境优化指南
原文链接:https://www.deepwebcn.com/82.html centos6.5 CentOS 6.5 系统安装之后并不能立即投入生产环境使用,常常需要先经过我们运维人员的优化才行.优 ...
- HDU 5119 Happy Matt Friends(2014北京区域赛现场赛H题 裸背包DP)
虽然是一道还是算简单的DP,甚至不用滚动数组也能AC,数据量不算很大. 对于N个数,每个数只存在两个状态,取 和 不取. 容易得出状态转移方程: dp[i][j] = dp[i - 1][j ^ a[ ...