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容器就会将资 ...
随机推荐
- PHP的启动与终止
1.2 PHP的启动与终止 PHP程序的启动可以看作有两个概念上的启动,终止也有两个概念上的终止. 其中一个是PHP作为Apache(拿它举例,板砖勿扔)的一个模块的启动与终止, 这次启动php会初始 ...
- hdu 1004 Let the Balloon Rise
Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- tomcat 开机后台运行
引用:http://jingyan.baidu.com/article/a65957f4b12b8724e77f9b5a.html Tomcat是Apache 软件基金会(Apache Softwar ...
- 挂FORM时找不到对应的功能(function)
表单 功能都已经定义,但是在菜单中增加时候没有这个可选的项. 解决办法:由于是功能太多,LOV显示限制为30000,因此将功能名前加CUX,提升其排序即可.也可以修改LOV显示限制数量.
- Java找不到或无法加载主类
今天用cmd运行一下java出现了找不到或无法加载主类 的问题 javac编译可以通过 java运行不了 原因: 看一下java版本 看一下javac版本: 编译和运行环境的版本不一样报错原来是用 ...
- [Vuejs] 关于vue-router里面的subRoutes
刚学习vue,可能有使用不对的地方,希望没有对大家造成困扰! 使用vue-router,为了能够更好的管理.vue文件,需要用到子路由. 先看个错误的例子 routers.js '/company': ...
- N久没写过东西了..写个最近在研究的程序
import numpy as np import matplotlib.pyplot as plt #a = np.matrix([[1,1.15],[1,1.9],[1,3.06],[1,4.66 ...
- 二十三、Java基础--------网络编程
Java中另一个重要技术就是网络编程了,为了更好的学习web方向的知识,有必要对java之网络编程好好学习,本文将围绕网络编程技术进行分析. 常见的网络协议:UDP.TCP UDP 1. 将数据源和目 ...
- 记一次 IDEA mybatis.generator 自定义扩展插件
在使用 idea mybatis.generator 生成的代码,遇到 生成的代码很多重复的地方, 虽然代码是生成的,我们也不应该允许重复的代码出现,因为这些代码后期都要来手动维护. 对于生成时间戳注 ...
- 关于sql的关联排序
个人觉得对sql的玩转其实是sql中各种函数方法的理解的透彻. 原始数据表 要求查询的结果排序 其实刚看题目可能觉得要用group by但是再网下继续思考可能就没有思路了 但是如果你接触过over的试 ...