Servlet的三种实现方式(详解)

文章目录

Servlet的三种实现方式

  • 实现Servlet接口(是所有java Servlet类的基础接口)
  • 继承GenericServlet类(这种方法很少用,它其实就是Servlet的实现类)
  • 继承HttpServlet类(HttpServlet类是在GenericServlet类基础上拓展HTTP协议的servlet)
    不论使用何种方式,都需要对Servlet进行配置才能使用,两种配置方式 web.xml 和 注解

实现Servlet接口

Servlet接口有5个方法需要重写,下面分别介绍这5个方法的作用

  • void init(ServletConfig var1)
    • Servlet被创建会被自动调用,对Servlet进行初始化
    • 比它先调用的是构造方法
    • init()方法只会被调用一次,就是Servlet被创建的时候,后面除非服务器关闭,否则不会调用了
    • Servlet的两种创建情况
      • 1.第一次被用户请求
      • 2.在配置文件中的标签中配置了且值>=0就会在服务器启动时自动创建
    • ServletConfig参数的作用,这是一个保存了配置文件信息的变量,我们可以通过它来获取配置文件内容,例如初始化变量
  • ServletConfig getServletConfig()
    • 获取ServletConfig对象
  • void service(ServletRequest var1, ServletResponse var2)
    • 获取请求,并决定如何处理请求的方法
    • 这个方法,每当有用户请求一次的时候就会被调用一次
    • ServletRequest 这个对象表示的是用户的请求信息
    • ServletResponse 这个对象表示的是要响应给用户的响应信息
  • String getServletInfo()
    • 获取Servlet的相关信息
  • void destroy()
    • Servlet对象的销毁方法,一般是在服务器被关闭时会调用
代码演示
//这里使用了注解的方式对servlet进行配置,下面会说
@WebServlet(
        urlPatterns = {"/test"},
        initParams = {@WebInitParam(name="name",value="张三")},
        loadOnStartup = 0
        )

public class Test implements Servlet {
    private ServletConfig servletConfig;

    @Override
    public void init(ServletConfig servletConfig){
        //init方法一般是不会被用到的,但是如果想要读取配置文件信息时,可以获取这个参数
        this.servletConfig = servletConfig;
        System.out.println("init()被调用");
    }

    @Override
    public ServletConfig getServletConfig(){
        return servletConfig;
    }

    @Override
    public void service(ServletRequest request, ServletResponse response){
        //这里也演示了servletConfig的一些功能
        System.out.println(servletConfig.getServletName() + "的service被调用,它里面的初始化参数有" + 	servletConfig.getInitParameter("name"));
    }

    @Override
    public String getServletInfo(){
        return null;
    }

    @Override
    public void destroy(){
        System.out.println("destroy()被调用");
    }
}

GenericServlet类

这个类的出现是为了简化Servlet的实例化步骤的,它里面帮我们实现了一些平时基本不需要实现的方法,然后帮我们封装了一些方法,直接看它

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    private static final long serialVersionUID = 1L;
    //就像上面的Servlet实现类一样,它也获取了congfig对象
    private transient ServletConfig config;
	
    public GenericServlet() {}
    
    //基础5大方法
    //可以看出它对destroy以及getServletInfo也没又做什么特殊处理
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }

    public void init() throws ServletException {
    }
    
    public void destroy() {
    }
	
     public ServletConfig getServletConfig() {
        return this.config;
    }
    
    public String getServletInfo() {
        return "";
    }
    //这个方法是抽象方法,必须要实现,在这里写的就是我们该如何处理请求和响应
    public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
    
    
    //多出来的方法
    //可以看到主要就是获取一些配置的信息,因为多数都是基于ServletConfig对象来的
    public String getInitParameter(String name) {
        return this.getServletConfig().getInitParameter(name);
    }

    public Enumeration<String> getInitParameterNames() {
        return this.getServletConfig().getInitParameterNames();
    }

    public ServletContext getServletContext() {
        return this.getServletConfig().getServletContext();
    }

    public String getServletName() {
        return this.config.getServletName();
    }
}

HttpServlet类

HttpServlet是基于Http协议上对Servlet进行扩展的,它继承于GenericServlet类,除了重写了service方法以外,就是自己实现的额外方法,其他基础方法都是用父类的。

HttpServlet的service方法做了什么

HttpServlet的service方法会对用户传来的HTTP请求的请求方式进行判断,然后根据不同的请求方式进行不同的处理,这些请求方式的处理逻辑要我们自己去实现(继承HttpServlet然后重写对应方法)

HTTP协议有哪些请求方式,它就有哪些方法,格式为doXXX,XXX为请求的方式,例如Post请求, doPost,get请求就是doGet,也并不是所有的请求方式我们都要实现,只需要实现自己想要的方式就好了

代码演示
public class MyServlet extends HttpServlet {
    //这是一种实现方式,这种方式中可以重写doGet和doPost方法,对应使用两种请求提交的执行代码
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        /*
        * 在容器接受到来自客户的HTTP请求后,会收集HTTP请求中的信息,并分别创建代表请求和响应JAVA对象
        *  request参数的表示的是客户端请求信息
        *  response参数的表示的是传递给客户端的响应信息
        * */
        //response代表响应对象, 最好是设置内容格式,不然有中文的话会乱码
        response.setContentType("text/html;charset=UTF-8");
        String name = request.getParameter("name"); //通过getParameter()方法获取到对应的参数

        PrintWriter writer = response.getWriter(); //获取响应的输出对象
        writer.write(name); //将提交的参数输出
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response){

    }
}

如何配置Servlet

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_4_0.xsd"
         version="4.0">
	<!--配置Servlet-->
    <servlet>
        <!--设置Servlet名字,最好和类名一致,也可以不一致-->
        <servlet-name>MyServlet</servlet-name>
        <!--Servlet所在路径-->
        <servlet-class>OneServlet.MyServlet</servlet-class>
        <!--设置init方法在服务器启动时就调用,值可以>=0都有效-->
        <load-on-startup>1</load-on-startup>
    </servlet>
	<!--建立映射-->
    <servlet-mapping>
        <!--这里是上面定义的那个Servlet名-->
        <servlet-name>MyServlet</servlet-name>
        <!--访问Servlet时填的路径-->
        <url-pattern>/MyServlet</url-pattern>
    </servlet-mapping>
</web-app>
<!--访问/MyServlet这个路径时,它会根据servlet-name去寻找对应的servlet根据指定路径调用Servlet-->
WebServlet

除了web.xml其实还有更简便的配置方法,就是使用标注,直接在类上面写

@WebServlet("servlet-pattern") //直接在这里写定外部访问路径也可以访问到

它还可以通过key=value的方式设置更多信息
@WebServlet(
	name = "Hello", //设置servlet的名称是hello
	urlPatterns = {"/hello"}, //如果url请求/hello这个路径就调用这个servlet,这个可以同时设置多个路径,
							 //value的作用于等同于urlPatterns,二者只能选一个用
	loadOnStartup = 1 //服务器打开自动初始化
	initParams = {@WebInitParam(name="key",value="value")} //设置初始化参数
)
上一篇:《Linux源码情景分析》--2.1 Linux内存管理的基本框架


下一篇:5.ServletConfig接口