Servlet API架构

Servlet接口

Servlet接口定义了所有Servlet的基本行为。
基本行为主要分为两类:

  • 与Servlet生命周期有关的基本行为,由Web容器自动调用
    • void init(ServletConfig config), 创建Servlet时调用。
    • void service(ServletRequest req,ServletResponse res),有请求到来时调用。
    • void destroy() ,销毁时调用。
  • 获取Servlet信息的有关方法
    • String getServletInfo(),返回Servlet的相关信息。
    • ServletConfig getServletConfig(),返回一个表示Servlet配置信息的接口。

ServletConfig接口

ServletConfig接口表示Servlet的配置信息,其主要有两类方法:

  • 获取Servlet配置信息的方法,配置信息写在@WebServlet(…)注解中或者web.xml中。
    • String getServletName()
    • String getInitParameter(String name)
    • Enumeration getInitParameterNames()
  • 提供一个返回ServletContext的方法
    • ServletContext getServletContext()

ServletContext接口

ServletContext接口表示的是整个web应用,它有如下几个特点:

  • 表示整个web应用,它随着web容器一起被创建一起被销毁。
  • 所有的Servlet共享一个ServletContext,里面的属性也是共享的。
  • ServletContext管理web应用下的所有资源。

该接口方法众多,不一一列举,可以去查看官方文档。

GenericServlet抽象类

该抽象类实现了Servlet接口和ServletConfig接口,但是它并未实现Sevlet中的service(ServletRequest req,ServletResponse res)方法,因此它是一个抽象类。
在这里插入图片描述
需要完成一些默认的工作,所以后面的子类Servlet如果想要完成一些初始化工作应该重载这个无参的init()方法。

HttpServlet

HttpServlet是GenericServlet的子类也是编写自己的Servlet时最需要关心的父类。
HttpServlet最主要的作用是完成了下面两件工作:

  • 重载了一个service(HttpServletRequest request,HttpServletResponse response)方法,将继承的service(ServletRequest request,ServletResponse response)方法参数转型并调用新的方法。
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);
}
  • 新增了一系列doXXX()方法,在service方法中跟去HttpServletRequest的getMethod()方法分别调用不同的doXXX()方法,因此在继承HttpServlet之后只需要覆写相应的doXXX()方法就可以了。
    在这里插入图片描述

Web容器的作用

在编写Servlet时,通常只需要编写一个继承自HttpServlet的类。而上面提到的全部接口,它们的实现类都有web容器提供。
web容器自动实例化这些类,调用并销毁。这就是wen容器的主要作用。
在这里插入图片描述

范例:一个简单的Servlet

@WebServlet(name = "HelloServlet",urlPatterns = "/hello",
        initParams = {@WebInitParam(name="inpa1",value="a"),
                      @WebInitParam(name="inpa2",value="b")
})
public class HelloServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //直接调用ServletConfig的方法获取初始化参数
        Enumeration<String> initParameterNames = getInitParameterNames();
        while(initParameterNames.hasMoreElements()){
            System.out.println(initParameterNames.nextElement());
        }
        //获取ServletContext
        getServletContext();
        
    }
}

启动tomcat就可以在浏览器地址栏上输入http://127.0.0.1/{ContextPath}/hello访问到doGet方法了。
上面这个Servlet采用Servlet3.0的注解配置,如果不希望使用注解可以在WEN-INF目录下的web.xml中作如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.patermenkey.helloweb.HelloServlet</servlet-class>
        <init-param>
            <param-name>inpa1</param-name>
            <param-value>a</param-value>
        </init-param>
        <init-param>
            <param-name>inpa2</param-name>
            <param-value>b</param-value>
        </init-param>
    </servlet>
</web-app>

通常ide会自动创建这个web.xml的模板,如果没有你可以到tomcat的wenapps目录下找一个项目复制一份拷贝。

猜你喜欢

转载自blog.csdn.net/qq_34935078/article/details/85469271