Servlet

作者: RaymondSH | 来源:发表于2019-08-02 11:36 被阅读0次

Servlet

一、servlet是什么?

Servlet是一个运行在Web服务器中的Java小程序,Servlet将会接收和响应来自Web客户端的请求,使用HTTP(超文本传输协议)进行通信。

Servlet是所有Web应用程序的核心类,它是唯一既可以直接处理和响应用户请求,也可以将处理工作委托给应用中的其他部分的类。除非某些过滤器提前终止了客户端的请求,否则所有的请求都将被发送到某些Servlet中。

在JSP+Servlet+JavaBean开发模式中,JSP作为视图将数据展现给用户,Servlet作为控制器,统一调度用户的请求,JavaBean封装和处理数据。

二、servlet怎么用?

1、Servlet继承关系

Screenshot from 2019-06-16 16-02-19.png

)

(1)Servlet

所有的Servlet都实现了javax.servlet.Servlet接口,但通常不是直接实现的。Servlet只是一个简单接口,它包含了初始化并销毁Servlet和处理请求的方法。不过,无论什么类型的请求,甚至是非HTTP请求,也会调用service方法。

(2)GenericServlet

一般情况下,Servlet都继承自javax.servlet.GenericServlet。GenericServlet也是一个不依赖具体协议的Servlet,它只包含了一个抽象的service方法和几个用于日志操作的辅助方法。

(3)HttpServlet

javax.servlet.http.HttpServlet继承自GenericServlet,主要用来响应HTTP请求。HttpServlet实现了service方法。并且提供了响应每种HTTP方法类型的方法的空实现。

(4)ServletConfig

表示此Servlet在web.xml中的配置信息。web容器将配置信息封装为ServletConfig对象.

此外,可以用ServletContext对象表示一个web工程

获取ServletConfig对象和ServletContext对象
this.getServletConfig()
this.getServletContext()

2、HttpServlet中的方法

HTTP方法类型 Servlet方法 目的
GET doGet() 从指定的URL中获取资源
HEAD doHead() 与GET一致,唯一的区别在于该请求只返回页面的头部数据
POST doPost() 通常用于处理Web表单提交
PUT doPut() 存储URL中提供的实体
DELETE doDelete() 删除由URL标示的资源
OPTIONS doOptions() 返回支持的HTTP方法
TRACE doTrace() 用于诊断目的

3、Servlet的生命周期

(1)初始化调用init()

init()方法只会在web容器初始化Servlet时调用一次,只会调用一次

(2)服务器响应客户端时调用service()

每次客户端请求服务器,服务器进行响应时都会调用service()方法,会调用多次

(3)终止阶段调用destory()

当将web工程从web容器移除时,将会调用
destory()方法

4、Servlet的执行过程

(1)在浏览器地址栏中输入访问路径,向服务器发出请求。

(2)服务器根据请求的URL地址在web.xml文件中的<servlet-mapping>标签下的子标签<url-pattern>中寻找匹配路径,找到对应的<servlet-name>。

(3)服务器根据已经寻找到<servlet-name>找到<servlet-class>(包名+类名)。

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
         
  <!--表示应用程序在应用服务器中显示的名字-->
  <!--Tomcat管理器页面(显示出所有已安装应用程序的列表)中将显示出<display-name>标签中配置的名字-->
  <display-name>Hello Web Application</display-name>

  <!--配置Servlet,Web容器创建一个Servlet的实例-->
  <servlet>
    <servlet-name>hello</servlet-name><!--名称可以自定义-->
    <servlet-class>com.hello.Servlet.HelloServlet</servlet-class><!--指定要创建实例的Servlet类-->
    <load-on-startup>1</load-on-startup>
  </servlet>

  <!--将Servlet映射为URL地址,告诉Servlet对哪些请求URL做出响应-->
  <!--<Servlet>标签和<Servlet-mapping>标签中的<servlet-name>需要一致,Web容器通过这种方式关联这两种配置-->
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/</url-pattern><!--URL的路径-->
  </servlet-mapping>
  
</web-app>

(4)服务器根据包名和类名寻找Servlet类(用户自定义的),创建Servlet实例。

(5)执行init方法

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }

    public void init() throws ServletException {
    }
}

(6)调用service方法

//GenericServlet类
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    //......
    public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
}

//HttpServlet类
public abstract class HttpServlet extends GenericServlet {
    //.......
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        HttpServletRequest request;
        HttpServletResponse response;
        try {
            request = (HttpServletRequest)req;
            response = (HttpServletResponse)res;
        } catch (ClassCastException var6) {
            throw new ServletException("non-HTTP request or response");
        }

        this.service(request, response);
    }
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long errMsg;
        if(method.equals("GET")) {
           //。。。。
        } else if(method.equals("HEAD")) {
            //。。。。
        } else if(method.equals("POST")) {
            this.doPost(req, resp);
        } else if(method.equals("PUT")) {
            this.doPut(req, resp);
        } else if(method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if(method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if(method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            //错误请求
        }

    }
}

(7)当Web应用程序被停止或卸载,或者Web容器关闭后,Servlet不在接收请求后,立即调用destroy方法。

相关文章

  • servlet 笔记

    servlet servlet 声明周期 Servlet 的线程安全 Servlet 获取配置信息 Servlet...

  • Servlet

    Servlet介绍 Servlet开发步骤 创建Servlet 配置Servlet 配置Servlet中设置初始化...

  • 深入理解Servlet技术

    1. 什么是servlet servlet Servlet是javax.servlet.Servlet包中定义的一...

  • Servlet与Jsp(1)

    Servlet 实现原理Servlet接口使Servlet容器能将Servlet类载入内存,并在Servlet实例...

  • web.xml不同版本之间头信息的区别

    一、Servlet 2.3 二、Servlet 2.4 三、Servlet 2.5 四、Servlet 3.0 五...

  • Servlet入门

    Servlet简介 Servlet(Servlet Applet)是Java Servlet的简称,称为小服务程序...

  • Servlet 实例

    Servlet 实例 Servlet 是服务 HTTP 请求并实现 javax.servlet.Servlet 接...

  • Java Servlet API

    Servlet 支持的版本 Servlet 3.0 新特性详解 Servlet 3.0 新特性概述Servlet ...

  • 简单认识Servlet

    Servlet与JSP的关系 初识Servlet Servlet层级关系 顶层Servlet接口 GenericS...

  • 2019-10-14 SpringMVC与Servlet接口 S

    SpringMVC与Servlet接口 Servlet接口规范 Servlet 接口 定义servlet接口规范i...

网友评论

      本文标题:Servlet

      本文链接:https://www.haomeiwen.com/subject/wtzkdctx.html