• 什么是Servlet?


    什么是Servlet?

    狭义上 : 

    Servlet就是一个接口,全名Servlet.class,位于Servlet-api.jar包里的javax.servlet包内,

    我们看一下Servlet.class的源码 : 

    广义上:

    任何实现了这个Servlet接口的类,都可以叫做是Servlet.一般我们说Servlet是指广义上的Servlet.

    Servlet是干嘛的?

    接口的作用是规范!

    servlet接口定义的是一套处理网络请求的规范,所有实现servlet的类,都需要实现它那五个方法.

    其中最主要的是两个生命周期方法 init()和destroy(),还有一个处理请求的service()

    所有实现servlet接口的类,或者说,所有想要处理网络请求的类,都需要回答这三个问题:

      *你初始化时要做什么

      *你销毁时要做什么

      *你接到请求时要做什么

    servlet可以直接处理请求吗?

    答案是,不能!   相信我,你从来不会在servlet中写什么监听8080端口的代码,servlet不会直接和客户端打交道!

    那请求怎么来到servlet呢?答案是servlet容器,比如我们最常用的tomcat.

    tomcat才是与客户端直接打交道的家伙,他监听了端口,请求过来后,根据url信息和web.xml配置文件匹配,
    确定要将请求交给哪个servlet去处理,然后调用那个servlet的service方法,service方法返回一个response对象,
    tomcat再把这个response返回给客户端
    请求的大致流程:
    客户端发送http请求----->Tomcat服务器----->到达Servlet----->执行service()----->返回数据
     
    总结 : 
    Servlet接口就是处理网络请求的一套规范,Servlet运行于支持Java的应用服务器中(比如Tomcat),交互式的生成动态的web内容

    Servlet框架构成

    Servlet框架主要由两个java包组成 : javax.servlet和javax.servlet.http (详情查看jar包servlet-api.jar)
    javax.servlet : 定义了所有的Servlet类都必须实现或扩展的的通用接口和类
         常见的类有:Filter接口,Servlet接口,ServletContext接口,ServletRequest接口, ServletResponse接口,GenericServlet类等
    javax.servlet.http : 定义了采用HTTP通信协议的HttpServlet类
         常见的类有:Cookie类,HttpFilter类,HttpServlet类,HttpServletRequest和HttpServletResponse类,HttpSession类等等

    HttpServlet

    HttpServlet是一个抽象类,继承自GenericServlet(抽象类),而GenericServlet实现了Servlet接口

    在使用servlet编写web应用时,控制层的servlet类都要继承HttpServlet类,重写doGet(),doPost,或者doService()以完成客户端的请求

    为什么要专门做一个HttpServlet类?它和Servlet类有什么区别?

     HttpServlet是专门处理http请求的Servlet ! 

    因为我们现在处理的请求,都是基于http协议的,所以就有了专门为处理HTTP请求的Servlet,即HttpServlet.

    HttpServlet中的doGet(), doPost(), doService()等方法,参数都是HttpServletRequest和HttpServletResponse,

    而Servlet中的参数则是ServletRequest和ServletResponse.

    Servlet的生命周期

    1. 调用 init() 方法初始化
    2. 调用 service() 方法来处理客户端的请求
    3. 调用 destroy() 方法释放资源,标记自身为可回收
    4. 被垃圾回收器回收

    Servlet在服务器运行过程中,

    ***只会初始化(init)一次***

    ***只会消亡(destroy)一次***

    ***一个Servlet只会产生一个实例***

    当多个请求同时访问Servlet时,容器会起多个线程同时访问Servlet的service()方法

    Servlet的线程安全问题

    由上面内容我们可以得知,当同时有多个请求访问service()方法时,就会涉及线程安全问题.

    我们排列情况如下:

    service()方法访问的内容 是否有读写操作 是否线程安全
    Servlet的成员变量 只有只读操作 线程安全
    Servlet的成员变量 有读写操作 不安全,需要加上同步控制语句
    全局的静态变量 有读写操作 不安全,需要加上同步控制语句
    全局资源(文件,数据库连接等) 有读写操作 不安全,需要加上同步控制语句

    Servlet是单实例多线程

    Servlet容器处理请求的流程:

    1. 当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例)
    2. 容器初始化化Servlet主要就是读取配置文件
    3. 当请求到达时,Servlet容器通过调度线程(Dispatchaer Thread),调度它管理下线程池中等待执行的线程(Worker Thread)给请求者
    4. 线程执行对应Servlet的service方法;
    5. 请求结束,线程被放回线程池,等待被调用;

    Servlet单实例多线程的特点

    1. Servlet单实例,减少了产生servlet的开销
    2. 通过线程池来响应多个请求,减少了请求的响应时间
    3. Servlet容器并不关心到达的Servlet请求访问的是否是同一个Servlet还是另一个Servlet,直接分配给它一个新的线程;如果是同一个Servlet的多个请求,那么Servlet的service方法将在多线程中并发的执行

    Servlet的实际应用

    1.编写Servlet类(省略)

    2.在web.xml配置Servlet映射

      <servlet>
          <servlet-name>servletDemo</servlet-name>
          <servlet-class>com.test.servletDemo</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>servletDemo</servlet-name>
          <url-pattern>/test/servletDemo</url-pattern>
      </servlet-mapping>
    

      

    未完待续......

  • 相关阅读:
    Android广播接收器和Activity间传递数据
    Android广播接收器里弹出对话框
    Android本地广播
    setSupportActionBar()方法报错
    exec使用小计
    关于NSA的EternalBlue(永恒之蓝) ms17-010漏洞利用
    20154312 曾林 ExpFinal CTF Writeup
    20154312 曾林 EXP9 Web安全基础
    20154312 曾林 Exp8 web基础
    20154312 曾林 EXP7 网络欺诈防范
  • 原文地址:https://www.cnblogs.com/jinyu59/p/10727274.html
Copyright © 2020-2023  润新知