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应用下。

猜你喜欢

转载自www.cnblogs.com/tsvv-plus/p/11809610.html