• Servlet基础认识


    1. 简述:

      Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

    2. 任务:

      Servlet 执行以下主要任务:

    • 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
    • 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
    • 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
    • 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
    • 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 Cookies 和缓存参数,以及其他类似的任务。

    3. 架构:

        

     4. 生命周期(执行过程):

      Servlet的生命周期就是从servlet出现到销毁的全过程。主要分为以下几个阶段:

      加载类 —> 实例化(为对象分配空间) —> 初始化(为对象的属性赋值) —> 请求处理(服务阶段) —> 销毁

      

    package com.tsvv;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class TsvvServlet extends HttpServlet{
        //初始化servlet,调用init方法
        @Override
        public void init() throws ServletException {
            System.out.println("初始化时调用");
        }
        //开启服务
        @Override
        protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
            System.out.println("开启服务时调用");
        }
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
        }
        //销毁时调用destory
        @Override
        public void destroy() {
            System.out.println("销毁时调用");
        }
    }

    5. Servlet的三种创建方式:

      1. 实现 Servlet 接口

    package com.tsvv;
    import java.io.IOException;
    
    import javax.servlet.Servlet;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    //Servlet的生命周期:从Servlet被创建到Servlet被销毁的过程
    //一次创建,到处服务
    //一个Servlet只会有一个对象,服务所有的请求
    /*
     * 1.实例化(使用构造方法创建对象)
     * 2.初始化  执行init方法
     * 3.服务     执行service方法
     * 4.销毁    执行destroy方法
     */
    public class ServletDemo1 implements Servlet {
    
        //public ServletDemo1(){}
    
        //生命周期方法:当Servlet第一次被创建对象时执行该方法,该方法在整个生命周期中只执行一次
        public void init(ServletConfig arg0) throws ServletException {
            System.out.println("=======init=========");
        }
    
        //生命周期方法:对客户端响应的方法,该方法会被执行多次,每次请求该servlet都会执行该方法
        public void service(ServletRequest arg0, ServletResponse arg1)
                throws ServletException, IOException {
            System.out.println("=======service=========");
    
        }
    
        //生命周期方法:当Servlet被销毁时执行该方法
        public void destroy() {
            System.out.println("=======destroy=========");
        }
        //当停止tomcat时也就销毁的servlet。
        public ServletConfig getServletConfig() {
    
            return null;
        }
    
        public String getServletInfo() {
    
            return null;
        }
    }

      2. 继承 GenericServlet 类,它实现了 Servlet 接口除了 service 的方法,不过这种方法我们极少用。

    package com.tsvv;
    
    import java.io.IOException;
    
    import javax.servlet.GenericServlet;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    public class ServletDemo2 extends GenericServlet {
    
        @Override
        public void service(ServletRequest arg0, ServletResponse arg1)
                throws ServletException, IOException {
            System.out.println("=======service=========");
    
        }
    }

      3. 继承 HttpServlet (通过Eclipse创建Servlet,默认继承HttpServlet

    package com.tsvv;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class ServletDemo3 extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("=======Get=========");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("=======Post=========");
            doGet(req,resp);
        }
    
    }

      在通过Eclipse创建Servlet时,会自动在web.xml文件中进行Servlet相关信息的配置

      (注意:如果是复制类文件,配置信息不会配置,需要自己手动配置!)

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        id="WebApp_ID" version="3.0">
        <display-name>TestSetvlet</display-name>
        <welcome-file-list>
            <welcome-file>index.html</welcome-file>
            <welcome-file>index.htm</welcome-file>
            <welcome-file>index.jsp</welcome-file>
            <welcome-file>default.html</welcome-file>
            <welcome-file>default.htm</welcome-file>
            <welcome-file>default.jsp</welcome-file>
        </welcome-file-list>
        <servlet>
            <servlet-name>TsvvServlet</servlet-name>
            <servlet-class>com.tsvv.TsvvServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>TsvvServlet</servlet-name>
            <url-pattern>/TsvvServlet</url-pattern>
        </servlet-mapping>
        <servlet>
            <servlet-name>ServletDemo1</servlet-name>
            <servlet-class>com.tsvv.ServletDemo1</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>ServletDemo1</servlet-name>
            <url-pattern>/ServletDemo1</url-pattern>
        </servlet-mapping>
        <servlet>
            <servlet-name>ServletDemo2</servlet-name>
            <servlet-class>com.tsvv.ServletDemo2</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>ServletDemo2</servlet-name>
            <url-pattern>/ServletDemo2</url-pattern>
        </servlet-mapping>
        <servlet>
            <servlet-name>ServletDemo3</servlet-name>
            <servlet-class>com.tsvv.ServletDemo3</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>ServletDemo3</servlet-name>
            <url-pattern>/ServletDemo3</url-pattern>
        </servlet-mapping>
    </web-app>

      关于上面的配置信息:

        a) Eclipse每创建一个Servlet, 就会在web.xml文件中添加两个标签:<servlet>和<servlet-mapping>标签(可以将这两个标签看成一个组的标签)

        b) <servlet>和<servlet-mapping>标签内都会有一个<servlet-name>标签,标签的内容可以更改,但要求更改后的这两个<servlet-name>标签的内容也必须一致。

        c) <servlet-class>标签用于配置Servlet类的全路径名(即包名+类名)

          需要注意:如果在创建Servlet后修改了Servlet类的名称,这个地方也要一起更改,否则将会出现"ClassNotFoundException" 即类找不到异常

        d) <url-pattern>标签用于配置浏览器以什么路径访问当前Servlet(即Servlet对外访问的路径),默认的路径是:/类名

          例如:上面为HelloServlet配置的<url-pattern>为 /ServletDemo1,因此我们在浏览器中的访问路径则为:

          http://主机名/web项目访问路径/ServletDemo1

    6. Servlet的继承关系:

      

      可以看到,核心的部分在于:
    • 两个顶级接口
      • Servlet
      • ServletConfig
    • 接口的实现类
      • GenericServlet
    • 基于HTTP协议的实现类
      • HttpServlet

      Servlet的整体继承关系如下:

      

       

    • ServletConfig  Servlet的配置信息,常用来在Servlet初始化时进行信息传递
      • getServletContext()  获取Servlet运行的上下文环境对象,可以获取对应信息(如Servlet路径),存取容量级的变量
      • getInitParameter(String name)  获取初始化参数(web.xml中配置的init-param)
     
    • GenericServlet  一般的Servlet,实现了Servlet和ServletConfig接口
      • init(ServletConfig config)  初始化方法,方法中调用了init()
      • init()  初始化方法,方法体为空,主要用于自定义Servlet的覆盖
      • service(ServletRequest request, ServletResponse response)  抽象方法service,要求继承类实现
      • destory()  Servlet销毁前要执行的方法
     
    • HttpServlet  基于HTTP协议的实现类
      • service(ServletRequest request, ServletResponse response) 实现了GenericServlet的抽象方法,调用了service(HttpServletRequest, HttpServletResponse)
      • service(HttpServletRequest request, HttpServletResponse response)  根据请求的不同调用了doGet或doPost方法
      • doGet()  处理GET方式的请求
      • doPost()  处理POST方式的请求

       

       

      简单总结下要点:
    • Servlet只初始化一次,它是单例的,只有一个实例,通过多线程访问。即Servlet是多线程单实例的
    • 实例化过程中,先调用构造方法,再调用init方法,所以初始化操作可以覆盖写到init方法中
    • 请求方式不同会调用doGet()或doPost()方法
    • 根据实际情况在Servlet销毁前调用其destroy()方法

    7. Servlet 的工作原理:

      Servlet接口定义了ServletServlet容器之间的契约。这个契约是:Servlet容器将Servlet类载入内存,并产生Servlet实例和调用它具体的方法。但是要注意的是,在一个应用程序中,每种Servlet类型只能有一个实例

      用户请求致使Servlet容器调用Servlet的Service()方法,并传入一个ServletRequest对象和一个ServletResponse对象ServletRequest对象和ServletResponse对象都是由Servlet容器(例如TomCat)封装好的,并不需要程序员去实现,程序员可以直接使用这两个对象。

      ServletRequest中封装了当前的Http请求,因此,开发人员不必解析和操作原始的Http数据。ServletResponse表示当前用户的Http响应,程序员只需直接操作ServletResponse对象就能把响应轻松的发回给用户

      对于每一个应用程序,Servlet容器还会创建一个ServletContext对象。这个对象中封装了上下文(应用程序)的环境详情。每个应用程序只有一个ServletContext。每个Servlet对象也都有一个封装Servlet配置的ServletConfig对象。

    8. Servlet三大域:

      

    9. JSP与Servlet:

      JSP是Servlet的一种特殊形式,每个JSP页面就是一个Servlet实例——JSP页面由系统编译成Servlet,Servlet再负责响应用户请求。JSP其实也是Servlet的一种简化,使用JSP时,其实还是使用Servlet,因为Web应用中的每个JSP页面都会由Servlet容器生成对应的Servlet。对于Tomcat而言,JSP页面生成的Servlet放在work路径对应的Web应用下。

  • 相关阅读:
    日期类型存储方法
    Log4j2的一些记录
    【Maven】学习记录
    HTML 图片加载问题
    浏览器的组成
    javascript数组的实例属性(方法)
    javascript数组的内置对象Array
    javascript之this
    css的position,float属性的理解
    简单介绍帧动画
  • 原文地址:https://www.cnblogs.com/tsvv-plus/p/11809610.html
Copyright © 2020-2023  润新知