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
Servlet高级应用---Servlet与缓存的更多相关文章
- servlet 高级知识之Filter
Filter叫做拦截器, 对目标资源拦截,拦截HTTP请求和HTTP响应,本质是对url进行拦截. 与serlvet不同的是, Filter的初始化是随着服务器启动而启动. 在Filter接口中定义了 ...
- Servlet高级部分Listener
监听器的使用场景: ①:统计在线人数 ②:实现单一登录[一个账号只能在一台机器上登录] Servlet中的8大监听器: 1. ServletContextListener [接口方 ...
- Servlet高级部分Filter(过滤器)
一:Filter称之为"过滤器",用在Servlet外,对request和response进行修改.它是AOP(面向切面编程思想的一种体现),Filter中有一个FilterCha ...
- 严重: Servlet.service() for servlet jsp threw exception java.lang.IllegalStateException: getOutputStream() has already been called
错误: 严重: Servlet.service() for servlet jsp threw exception java.lang.IllegalStateException: getOutput ...
- Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】
什么是Serlvet? Servlet其实就是一个遵循Servlet开发的java类.Serlvet是由服务器调用的,运行在服务器端. 为什么要用到Serlvet? 我们编写java程序想要在网上实现 ...
- 【Servlet】(1)Servlet简介、Servlet底层原理、Servlet实现方式、Servlet生命周期
一.Servlet简介 1.Servlet定义: Servlet(Server Applet)是Java Servlet的简称,是为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交 ...
- servlet单例模式以及servlet的请求流程
目录 一.servlet 单例模式: 二.servlet的请求流程: ★ 流程: ★ 详细过程如下: 一.servlet 单例模式: tomcat服务器,通过Java的反射机制来自动调用servl ...
- javaweb项目jsp跳转servlet Error instantiating servlet class 问题
问题: HTTP Status 500 - Error instantiating servlet class RecommenderServlet type Exception report mes ...
- Servlet过滤器,Servlet过滤器创建和配置
第一:Servlet的过滤器的创建和配置,创建一个过滤器对象需要实现javax.servlet.Filter接口,同时实现Filter的3个方法. 第一方法是过滤器中的init()方法用 ...
随机推荐
- 一句话、一张图记住Activity和Fragment之间错综复杂的生命周期关系
如果我们在Fragment和它的宿主Activity的生命周期中都加上Log日志,你能顺利写出他们的执行顺序吗?我们先来看一张Google官方的图片: 咋一听,Activity生命周期有七个方法,Fr ...
- Android(java)学习笔记166:Java中输入和输出流概念
程序在内存中运行,文件在磁盘上,把文件从磁盘上读入内存中来,当然是输入流了, 反之,把内存中的数据写到磁盘上的文件里面去就是输出.通常都是这样的,用了过滤流的情况复杂一些,则另当别论.
- Struts,Spring,Hibernate的作用
Spring的作用: 在SSH框假中spring充当了管理容器的角色.我们都知道Hibernate用来做持久层,因 为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL ...
- AndroidManifest.xml中的android:name是否带.的区别
如果android:name所指示的类在定义的package="org.crazyit.ui"下,加不加点无所谓:但如果android:name指示的类在在package下的子包中 ...
- Ext.Net学习笔记10:Ext.Net ComboBox用法
ComboBox是最常用的控件之一,它与HTML中的Select控件很像,但可以进行多选.自定义显示格式.分页等. ComboBox用法 <ext:ComboBox runat="se ...
- iOS开发——视频播放 待更新……
本文主要实现调用系统自带的播放器,自带的播放器已经做好了屏幕的适配,集成播放,暂停,快进等功能.能够满足基本的视频播放功能及iOS的视频播放的开发. 最后将其简单的封装成一个iOS视频播放工具类. 一 ...
- Implicit conversion from enumeration type 'enum CGImageAlphaInfo' to different enumeration type 'CGB
Implicit conversion from enumeration type 'enum CGImageAlphaInfo' to different enumeration type 'CGB ...
- javascript——四种函数调用形式
此文的目的是分析函数的四种调用形式,弄清楚函数中this的意义,明确构造函对象的过程,学会使用上下文调用函数. 在JavaScript中,函数是一等公民,函数在JavaScript中是一个数据类型,而 ...
- BCEC手动验证业务方法
在每次割接或业务调整后手动执行并做好业务验证工作 一.研发区利用ansible手动执行巡检程序: 步骤1:登陆 10.254.3.4/opt/ansible 步骤2:手动执行 sh compute_c ...
- (转)UIButton用法详解一
(注明 来源网址 http://blog.csdn.net/cheneystudy/article/details/8115092)这段代码动态的创建了一个UIButton,并且把相关常用的属性都列举 ...