一.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 setifModifiedSince = -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.报错.
开发中建议加上/ !

转载于:https://www.cnblogs.com/hlhdidi/p/6024960.html

servlet学习笔记_2相关推荐

  1. Servlet学习笔记 Servlet原理

    Servlet学习笔记 Servlet原理 一.Servlet基础 1.Servlet执行过程 用户请求一个Servlet,Servlet容器自动构建请求和响应对象,然后执行Servlet的servi ...

  2. 尚学堂JAVA基础学习笔记_2/2

    尚学堂JAVA基础学习笔记_2/2 文章目录 尚学堂JAVA基础学习笔记_2/2 写在前面 第10章 IO技术 1. IO入门 2. IO的API 3. 装饰流 4. IO实战 5. CommonsI ...

  3. java Servlet学习笔记

    前言:开始学习java web了,选择一本java Web整合开发王者归来作为我的学习图书,我觉的光看是不管用的,还要把书上的代码实践一下,通过写学习笔记的形式,加快自己对于java的理解,加油. 学 ...

  4. 基于传染病模型中的再生数R0的讨论【基于matlab的动力学模型学习笔记_2】

    /*仅当作学习笔记,若有纰漏欢迎友好交流指正,此外若能提供一点帮助将会十分荣幸*/ 在上一篇博文中介绍了病毒模型的基本计算思路方法,而本文将会重点讨论基本再生数R0-这个决定病毒是继续发展还是衰减的关 ...

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

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

  6. 一、Web服务器——Tomcat Servlet学习笔记

    今日内容 web相关概念回顾 web服务器软件:Tomcat Servlet入门学习 一.web相关概念回顾 软件架构 C/S:客户端/服务器端 B/S:浏览器/服务器端 资源分类 静态资源:所有用户 ...

  7. JSP/Servlet 学习笔记

    文章目录 Servlet/JSP 疑难汇总: Web 容器: Servlet 的相关知识点: 单例模式: 反射和注解: Web请求 JSP 相关内容: 网页中的编解码相关问题: 数据库使用的相关问题: ...

  8. javaWeb项目之Servlet学习笔记----ServletContext的读取方法

    https://www.cnblogs.com/fjdingsd/p/4846727.html ServletContext类中有这么四个方法: getRealPath(String path) ge ...

  9. Java Servlet学习笔记——3.URL重写

    写在前面 继续学习Java Servlet,这一部分学习URL重写,虽然这些技术用的不多,而且代码也比较简单,但是我还是决定一节一节的记录.仔细看看示例代码还是有很多内容. URL重写 URL重写是一 ...

  10. JSP和Servlet学习笔记1 - 访问配置

    1. 访问 WebContent 目录下的 JSP 文件 在 WebContent 目录下的文件可以直接在浏览器中访问.新建一个 test.jsp 文件 <%@ page language=&q ...

最新文章

  1. PYTHON编程导论群问题汇总(二)
  2. MySQL server has gone away报错原因分析及解决办法
  3. 阿里云宣布进入 Serverless 容器时代,推出弹性容器实例服务 ECI
  4. 前端分辨pc和移动端导入不同css
  5. android默认获取敏感权限
  6. java 分页 不 排序_java - 我应该如何将未分页但已排序的Pageable传递给Spring JPA存储库? - 堆栈内存溢出...
  7. 腾讯校招历年经典面试汇总:C++研发岗
  8. 【Java】时间的新旧比较
  9. php成长之路--1.composer下载依赖
  10. oracle之sqlloader
  11. IoT平台功能架构图
  12. 优化算法——差分进化算法(DE)
  13. 科技文献检索的途径、方法和步骤 - 易智编译 EaseEditing
  14. 解锁pdf文件,删除pdf密码
  15. css样式之导航条(nav)
  16. Kafka配置kerberos安全认证
  17. 什么是敏捷开发Scrum
  18. ubuntu teamviewer被检测为商业用途
  19. tushare pro的token凭证码设置教程详解
  20. wps怎么去除段落布局

热门文章

  1. springboot2.x 集成百度 uidgenerator
  2. IDEA 部署 Java Web 应用为 war 包
  3. sql插入时返回插入主键id(id位自动增长)
  4. 小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_35、事务介绍和常见的隔离级别,传播行为...
  5. 阶段3 1.Mybatis_11.Mybatis的缓存_7 触发清空一级缓存的情况
  6. 网络协议 18 - CDN:家门口的小卖铺
  7. 爬kuku漫画网站的小爬虫
  8. URAL 1586. Threeprime Numbers 数位dp
  9. [面试备忘]数组(一维)最大子串总结
  10. 使用Redis存取数据+数据库存取(spring+java)