servlet学习笔记_2
一.Servlet线程安全问题
1.servlet的线程安全问题.
servlet引擎采用多线程的模式运行,它为并发的每个访问请求都预备一个线程来相应,但是由于只有一个servlet对象,因此,如果多个线程同时调用servlet的service方法,那么可能会触发线程安全问题.线程安全需要通过在service方法中建立局部变量或者使用锁来解决.线程安全问题演示:
public class ThreadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private int count=0;
public ThreadServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
count++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("这个是第"+count+"次访问,当前线程"+Thread.currentThread().getName());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
二.HttpServlet和GenericServlet
1.回调方法:专门供容器调用的方法,称为回调方法.而GenericServlet和HttpServlet中的回调方法是专门给Servlet容器调用的,不能被开发人员直接调用.
2.常用方法介绍:
1>init方法:init(ServletConfig servletConfig)方法是供Servlet引擎所调用的方法,init方法的调用位于创建HttpServlet之后.当开发人员需要复写Init方法的时候,由于是在子类复写,因此必须要调用super.init(servletConfig servletConfig)方法,完成初始化功能,而GenericServlet为子类初始化提供了更加便捷的方法.在GenericServlet中定义了一个空参的init方法,然后在init(ServletConfig servletConfig)这个方法的代码最后,加上了调用这个新创建Init方法.开发人员只需要复写init方法,由于面向对象的特性,servlet引擎在调用Init(ServletConfig servletConfig)这个方法的时候,最后的init方法将被子类复写,因此可以完成子类的初始化方法.
2>service方法:service方法由Servlet引擎去调用,这里注意Servlet引擎调用的Service方法的两个参数为ServletRequest和ServletResponse.在HttpServlet中,通常需要将这两个参数分别转化为HttpServletRequest和HttpServletResponse.为了方便复写,HttpServlet采用了service方法的重载形式,将对于HttpServletRequest和HttpServletResponse方法的处理放在了service的重载方法里,然后再service方法中进行转换,在重载方法里实现功能.由于Servlet引擎遵循Servlet规范,因此只会调用service(ServletRequest,ServletResponse)方法.

总结一下HttpServlet的调用到doGet/doPost方法的流程.

3服务器是如何实现304让浏览器读取缓存数据的.
当断定为GET请求的时候,服务器执行的代码如下:
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException { String method = req.getMethod(); if (method.equals(METHOD_GET)) {
long lastModified = getLastModified(req);
if (lastModified == -1) {
// servlet doesn't support if-modified-since, no reason
// to go through further expensive logic
doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
} catch (IllegalArgumentException iae) {
// Invalid date header - proceed as if none was set
ifModifiedSince = -1;
}
if (ifModifiedSince < (lastModified / 1000 * 1000)) {
// If the servlet mod time is later, call doGet()
// Round down to the nearest second for a proper compare
// A ifModifiedSince of -1 will always be less
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
} }
首先获取lastModified这个数值,如果这个数值小于0,那么代表这个servlet不支持让浏览器读取缓存的操作,直接执行doGet方法;
如果这个数值大于0,获取浏览器的请求头的ifModifiedSince的数值,如果这个数值小于lastModified数值,代表,需要返回的数据在浏览器缓存了之后,又进行了修改,因此需要执行doGet方法.
其他情况下,代表返回的数据未修改,那么就直接设置状态码为304.让浏览器从自己的缓存中读取数据.
三.Tomcat配置全局web.xml
1.缺省Servlet(DefaultServlet):
在Tomcat的安装目录\conf\web.xml中,有如下配置:


这样的配置被称为缺省Servlet.实际上,当访问Tomcat服务器的某个静态的页面和图片的时候,实际上就是访问这个缺省的Servlet.因为在项目的web.xml中通常找不到静态资源相对应的路径.而这个缺省的Servlet的处理方式通常就是把静态资源中的内容按照字节原封不动的读取出来,然后按字节流(response.getWriter().write()方法)返回给客户端,同时生成一些相应消息头(根据MIME类型生成content-type响应头,方便浏览器解析).
注意:如果在Tomcat的配置文件中注释了<servlet-mapping>,那么在地址栏中访问静态页面(例如a.html)等,将会出错.但是访问在项目目录下配置的动态资源(servlet),依然没问题.(jsp文件也可以访问)
2.JSPServlet(当浏览器输入*.jsp的时候会进入JSPServlet)

可以看出JSPServlet和DefaultServlet都是在服务器启动的时候创建对象,并调用init方法(load-on-startup标签的配置).
3.MIME类型:
当浏览器向服务器请求数据的时候,服务器会根据浏览器请求的资源类型,在MIME类型中查找,并将查找的数据添加到响应头(content-type).供浏览器解析.通常这种情况发生在浏览器请求静态资源的时候.(在访问Servlet直接调用PrintWriter的write方法的时候,response将不会有content-type),而对于JSP来说,由于有<page>标签,因此content-type为text/html.
四.服务器浏览器(访问静态资源)交互的过程

五.Servlet的相对路径和绝对路径
绝对路径以/开始,绝对路径代表从webcontent下面开始寻找资源文件
相对路径代表从当前文件夹下面开始寻找路径(在servlet中不加/也是从webcontent下寻找)
而在服务器端:加/代表从webapp下面开始寻找,因此想要获取资源文件,还要加上项目名.
如果在浏览器端没有加/访问,那么如果项目名为project,相当于访问项目project下的project的资源即请求的URL为/project/project.报错.
开发中建议加上/ !
servlet学习笔记_2的更多相关文章
- # jsp及servlet学习笔记
目录 jsp及servlet学习笔记 JSP(Java Server Page Java服务端网页) 指令和动作: servlet(小服务程序) jsp及servlet学习笔记 JSP(Java Se ...
- Servlet学习笔记(四)
目录 Servlet学习笔记(四) 一.会话技术Cookie.session 1. 什么是会话技术? 2. 会话技术有什么用? 3. Cookie 3.1 什么是Cookie? 3.2 使用Cooki ...
- Servlet学习笔记(三)
目录 Servlet学习笔记(三) 一.HTTP协议 1.请求:客户端发送欸服务器端的数据 2.响应:服务器端发送给客户端的数据 3.响应状态码 二.Response对象 1.Response设置响应 ...
- Servlet学习笔记(二)
目录 Servlet学习笔记(二) Request对象 1.request和response对象: 2.request对象继承体系结构: 3.什么是HttpServletRequest ? 4.Htt ...
- jsp&servlet学习笔记
1.路径引用问题 一个css.jsp.html.或者javascript文件从从一个工程复制到另一工程,如果引用的时候使用的时相对路径,看似没有错误,但是却一直引用不进来,这时候要使用绝对路径,这样才 ...
- Servlet 学习笔记
Servlet 运行在服务器上的 java 类: Servlet 容器为 javaWeb 应用提供运行时环境,负责管理 servlet 和 jsp 生命周期,以及管理他们的共享数据. 现在我们知道了 ...
- Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期
servlet的404错误困扰了两天,各种方法都试过了,翻书逛论坛终于把问题解决了,写此博客来纪念自己的第一个servlet经历. 下面我会将自己的编写第一个servlet的详细过程提供给初学者,大神 ...
- Servlet学习笔记(七)—— 自己定义过滤器的编写改进:自己定义实现FilterChain
笔记六中实现了三种过滤器:字符编码过滤.登录权限过滤.敏感词过滤,可是有个缺陷就是,限定了过滤顺序,而不能实现先进行request过滤.最后response过滤,而且中间几项过滤的顺序不能动态改变.所 ...
- Servlet学习笔记(八)—— 文件下载
一.文件下载概述 比如图片或者HTML这类静态资源,仅仅要在浏览器中打开正确的网址就行下载.仅仅要资源放在应用程序文件夹或者其下的子文件夹中,但不在WEB-INF下.Servlet/JSP容器就会将资 ...
随机推荐
- Google Code Jam Round 1A 2015 解题报告
题目链接:https://code.google.com/codejam/contest/4224486/ Problem A. Mushroom Monster 这题题意就是,有N个时间点,每个时间 ...
- NODEJS 在Centos下面的自动启动
直接上代码 #!/bin/sh ## chkconfig: 345 99 10# description: Node.js /home/cekimy/index.js# . /etc/rc.d/ini ...
- 3.MongoDB下Windows下的安装
由于博主目前使用的是Windows的系统,没有使用Linux等其它的系统,因此此安装配置和开发使用,均是在Windows下进行的,以后在使用其它的系统的时候,再将其它系统的配置的使用补充上来. 1.下 ...
- paper 116:自然图像抠图/视频抠像技术梳理(image matting, video matting)
1. Bayesian Matting, Chuang, CVPR 2001.http://grail.cs.washington.edu/projects/digital-matting/paper ...
- EntityFramework Core技术线路(EF7已经更名为EF Core,并于2016年6月底发布)
官方文档英文地址:https://github.com/aspnet/EntityFramework/wiki/Roadmap 历经延期和更名,新版本的实体框架终于要和大家见面了,虽然还有点害羞.请大 ...
- 【转载】调试利器 autoexp.dat
转载:http://www.cppblog.com/flyinghare/archive/2010/09/27/127836.html autoexp.dat入门(调试时自定义变量显示) VC在调试状 ...
- 走进spring之springmvc实战篇(二)
本篇继篇一之后加入了jdbc并使用了注解 篇一进行了对spingmvc的基础配置http://www.cnblogs.com/liuyanhao/p/4798989.html 首先让我们先了解下注解的 ...
- make命令以及makefile
make命令以及makefile使用RCS与CVS进行源代码控制编写手册页使用patch与tar发布软件开发环境 多源代码的问题 当我们编写小程序时,许多人都是简单的在编辑后通过重新编译所有的文件重新 ...
- 缓解 SQL Server has encountered 727 occurrence(s) of I/O requests taking longer than 15 seconds
sql server 会记录IO等待时间超过15 seconds的请求,这时application会有 time out 现象,dba需要判断是workload,concurrecy 所致还是sql ...
- 转 苹果企业级帐号进行ipa打包,分发,下载等流程
1,企业帐号介绍(1)使用企业开发帐号,我们可以发布一个 ipa 放到网上,所有人(包括越狱及非越狱设备)都可以直接通过链接下载安装,而不需要通过 AppStore 下载,也不需要安装任何证书.(2) ...