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容器就会将资 ...
随机推荐
- 清除SQL2008R2日志文件
最近公司的SQL数据库全转移为阿里云数据库,由于自己转移的时候是执行的脚本,所以产生了很多的日志文件,都是没用的日志文件,所以自己想清除日志,自己电脑没有安装SQL2008,所以远程公司其他安装SQL ...
- <table>标签隐藏内边框与外边框
属性名称 属性值 说明 frame void 不显示表格的 ...
- 浅谈大型web系统架构
动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应用系统通常与数据库系统. ...
- swift基础:第二部分:函数和闭包
今天本来想利用上午的时间本来打算将swift基础部分学习完的,不巧的是,后台来和我讨论用户评价的接口,讨论过后,商讨出一种可行的方案,十几分钟时间过去了,我拿到将接口介入到已经完成的页面中,完美,终于 ...
- Java Web开发中MVC设计模式简介
一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条 ...
- 在Ubuntu14.04_ROS_indigo上安装Kinect2驱动和bridge
小乌龟:大乌龟,你这两周干么呢? 大乌龟:在Ubuntu14.04 ROS_indigo上装Kinect2的驱动和bridge 小乌龟:就装个驱动有什么难的 大乌龟:你说的对小乌龟,这确实不是问题,但 ...
- java第二次作业
这次通过学习,我掌握了下拉菜单和单选按钮的使用下拉菜单构造方法:JComboBox() 创建具有默认数据模型的 JComboBox.JComboBox(ComboBoxModel aModel) 创建 ...
- 下拉菜单demo---参考阿里云首页顶部下拉菜单
前言: 最近开始学习html+css,准备仿照各大网站写一些demo. 正文: 分析阶段: 如下图: 链接来自于: 阿里云:https://www.aliyun.com/ 实现过程: (一)用css3 ...
- webpack配置技巧--路径
resolve: { extensions: ['', '.js', '.vue'], fallback: [path.join(__dirname, '../node_modules')], ali ...
- python-进程,线程,协程
1.进程和线程 进程定义:进程是正在运行的程序的实例,进程是内核分配资源的最基本的单元,而线程是内核执行的最基本单元,进程内可以包含多个线程,只要记住这三个要点,就可以很清楚的理清进程和线程的行为模 ...