一.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的更多相关文章

  1. # jsp及servlet学习笔记

    目录 jsp及servlet学习笔记 JSP(Java Server Page Java服务端网页) 指令和动作: servlet(小服务程序) jsp及servlet学习笔记 JSP(Java Se ...

  2. Servlet学习笔记(四)

    目录 Servlet学习笔记(四) 一.会话技术Cookie.session 1. 什么是会话技术? 2. 会话技术有什么用? 3. Cookie 3.1 什么是Cookie? 3.2 使用Cooki ...

  3. Servlet学习笔记(三)

    目录 Servlet学习笔记(三) 一.HTTP协议 1.请求:客户端发送欸服务器端的数据 2.响应:服务器端发送给客户端的数据 3.响应状态码 二.Response对象 1.Response设置响应 ...

  4. Servlet学习笔记(二)

    目录 Servlet学习笔记(二) Request对象 1.request和response对象: 2.request对象继承体系结构: 3.什么是HttpServletRequest ? 4.Htt ...

  5. jsp&servlet学习笔记

    1.路径引用问题 一个css.jsp.html.或者javascript文件从从一个工程复制到另一工程,如果引用的时候使用的时相对路径,看似没有错误,但是却一直引用不进来,这时候要使用绝对路径,这样才 ...

  6. Servlet 学习笔记

    Servlet 运行在服务器上的 java 类: Servlet 容器为 javaWeb 应用提供运行时环境,负责管理 servlet 和 jsp 生命周期,以及管理他们的共享数据. 现在我们知道了 ...

  7. Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

    servlet的404错误困扰了两天,各种方法都试过了,翻书逛论坛终于把问题解决了,写此博客来纪念自己的第一个servlet经历. 下面我会将自己的编写第一个servlet的详细过程提供给初学者,大神 ...

  8. Servlet学习笔记(七)—— 自己定义过滤器的编写改进:自己定义实现FilterChain

    笔记六中实现了三种过滤器:字符编码过滤.登录权限过滤.敏感词过滤,可是有个缺陷就是,限定了过滤顺序,而不能实现先进行request过滤.最后response过滤,而且中间几项过滤的顺序不能动态改变.所 ...

  9. Servlet学习笔记(八)—— 文件下载

    一.文件下载概述 比如图片或者HTML这类静态资源,仅仅要在浏览器中打开正确的网址就行下载.仅仅要资源放在应用程序文件夹或者其下的子文件夹中,但不在WEB-INF下.Servlet/JSP容器就会将资 ...

随机推荐

  1. let和const命令//////////////////////z

    let和const命令 let命令 块级作用域 const命令 全局对象的属性 let命令 基本用法 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的 ...

  2. scale配合过渡的时候bug

    使用scale的时候注意两点 1:scale(1)的时候尽量图片的 width==naturalWidth bug表现为过渡生效时候图片变模糊 2:scale在过渡前和过渡后的计算后的width和he ...

  3. Masonry 创建Button的简单使用

    代码创建控制器,控件在实际开发中很实用,方便快捷,而Masonry第三方框架更是将代码创建效率提高了很多! 如何代码创建?如何使用第三方框架? 1.首先删除系统自带的SB,详见下图 2.在AppDel ...

  4. SQL2008代理作业出现错误: c001f011维护计划创建失败的解决方法

    SQL2008数据库总会出现从 IClassFactory 为 CLSID 为 {17BCA6E8-A95D-497E-B2F9-AF6AA475916F} 的 COM 组件创建实例失败,原因是出现以 ...

  5. ios webView 放大网页解决/input 获得焦点focus 网页放大 解决

    新手遇到的问题: 终于找到原因,各种HTML viewport 都试过 setScalePageToFit 也试过,webViewDidFinishLoad加JS代码,动态算webView.scrol ...

  6. PHP动态图像的创建要如何实现呢?

    with-gd=[/path/to/gd] --with-jpeg-dir=[/path/to/jpeg-6b] --with-t1lib=[/path/to/t1lib]  完成添加后执行make命 ...

  7. AB窗体互传参数

    一.找了好几个,都不靠谱,不是说不靠谱,自己感觉太繁琐 二.父窗口传子窗口好传,有两种方法(自己认为比较简单的方法哈), 1第一种方法:在子窗口中新建一个属性:再新建一个方法,当然方法就是把属性个窗体 ...

  8. 浮点型数据运算精度bug

    /** * 校验是否为数字 * @param arg * @return */ function checkIsNumber(arg){ if(arg != null && arg.t ...

  9. 【转】struts1.2的action参数配置

    转载地址:http://chenfeng0104.iteye.com/blog/796870 <struts-config>     <form-beans>         ...

  10. javascript中怎样区分元素和节点?

    1.所谓元素,即html文档里面,所有的标签都可以称之为元素,比如说<p>.<tr>等,也就是说元素是个统称,一个文档里面有很多的元素.2.所谓节点,是js为了对html文档进 ...