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引擎而设 ...
随机推荐
- linux驱动调试--段错误之oops信息分析
linux驱动调试--段错误之oops信息分析 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29401328&id= ...
- js中去除换行(\r\n)
解决方法:replace(/\r\n/g,"").replace("\n","") 测试: <script> var str = ...
- crontab中使用mysql问题
第1列分钟1-59第2列小时1-23(0表示子夜)第3列日1-31第4列月1-12第5列星期0-6(0表示星期天)第6列要运行的命令 , 并列 - 连续 crontab中不能执行mysql,百分之 ...
- YII2 实现登录时候修改最新登录时间
YII2 实现登录时候修改最新登录时间 YII2保存最新登录时间主要技巧:为 EVENT_AFTER_LOGIN 事件绑定一个方法,在方法中保存最新时间 public function login() ...
- pip install 出现报asciii码错误的解决
原因是pip安装python包会加载我的用户目录,我的用户目录恰好是中文的,ascii不能编码.解决办法是: python目录 Python27\Lib\site-packages 建一个文件site ...
- 转:FileReader详解与实例---读取并显示图像文件
~~~针对需要读取本地图像,并立即显示在浏览器的情况,由于chrome firefox出于安全限制,input file并不返回文件的真实路径,经测试IE6/7/8都会返回真实路径,所以chrome, ...
- Solr4.7从文件创建索引
索引数据源并不会一定来自于数据库.XML.JSON.CSV这类结构化数据,很多时候也来自于PDF.word.html.word.MP3等这类非结构化数据,从这类非结构化数据创建索引,solr也给我们提 ...
- zoj p3780 Paint the Grid Again
地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5267 题意:Leo 有一个N*N 的格子,他又有一把魔法刷,这个刷子能把 ...
- 质因数分解的rho以及miller-rabin
一.前言 质因数分解,是一个在算法竞赛里老生常谈的经典问题.我们在解决许多问题的时候需要用到质因数分解来辅助运算,而且质因数分解牵扯到许许多多经典高效的算法,例如miller-rabin判断素数算法, ...
- Android Testing(1) 浅尝Android测试的奥秘
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 仅供学习和交流使用,翻译不好勿喷,请只摘除不合适的地方 Testing The Android fram ...