Servlet入门学习

1.概述

  web服务器中有一些静态资源和动态资源,其中动态资源是由java代码来实现的,需要服务器中的tomcat来执行它。当然,想要tomcat执行它,这些java代码必须要遵守一些规则,才能被tomcat所识别。这些规则就是Servlet接口,java类需要实现(implements)Servlet接口,复写相应的方法。
  因此,Servlet本质上就是一个接口,定义了java类被浏览器访问到(tomcat识别)的规则。

2.快速入门

(1)创建JavaEE项目(创建方式见Tomcat配置及在IDEA上部署方法第2.4小节)
(2)定义一个类,实现Servlet接口
(3)实现接口中的抽象方法
(4)配置Servlet
web.xml:配置Servlet


<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>
        
        <servlet-name>demo1servlet-name>
        
        <servlet-class>cn.ecarg.web.servlet.ServletDemo1servlet-class>
    servlet>


    
    <servlet-mapping>
        
        <servlet-name>demo1servlet-name>
        
        <url-pattern>/demo1url-pattern>
    servlet-mapping>
web-app>

ServletDemo2.java

package cn.ecarg.web.servlet;

import javax.servlet.*;
import java.io.IOException;

public class ServletDemo2 implements Servlet {
    /**
     * 初始化方法
     * 在Servlet在创建时执行,只会执行一次。
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init...");
    }

    /**
     * 获取ServletConfig对象
     * ServletConfig:Servlet的配置对象
     * @return
     */
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * 提供服务的方法
     * 每一次Servlet被访问时执行,会执行多次。
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service...");
    }

    /**
     * 获取Servlet的一些信息,如版本、作者等
     * @return
     */
    @Override
    public String getServletInfo() {
        return null;
    }

    /**
     * 销毁方法
     * 在服务器正常关闭时执行,只会执行一次。
     */
    @Override
    public void destroy() {
        System.out.println("destroy...");
    }
}

3.Servlet执行原理

(1)当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径。
(2)查找web.xml文件,是否有对应的标签体内容。
(3)如果有,则再找到对应的全类名。
(4)tomcat会将字节码文件加载进内存,并且创建其对象。
(5)调用其方法。

4.Servlet生命周期

(1)Servlet被创建:执行init方法,只执行一次。

  • 在默认情况下,第一次被访问时,Servlet被创建。
    标签下配置,值设置为负数。
  • 也可以配置执行Servlet的创建时机。
    标签下配置,值设置为0或者正整数。

(2)Servlet提供服务:执行service方法,执行多次。
  每次访问Servlet时,service方法都会被调用一次。
(3)Servlet被销毁时,执行destroy方法,只执行一次。
  Servlet被销毁时执行,服务器关闭时,Servlet被销毁。(destroy方法在Servlet销毁之前执行,是对资源的释放)

5.Servlet注解配置(Servlet3.0)

  使用Servlet3.0及之后版本,可以不需要web.xml,支持注解配置。
(1)创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml。(创建方式见Tomcat配置及在IDEA上部署方法第2.4小节)
(2)定义一个类,实现Servlet接口。
(3)复写方法。
(4)在类上使用@WebServlet注解进行配置,主要配置Servlet类的访问路径,即@WebServlet注解中的urlPattern属性。
  urlPattern路径定义规则有如下几种:
  ① /xxx
  ② /xxx/xxx
  ③ *.do (不加斜杠)
ServletDemo.java

package cn.ecarg.web.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/demo")
public class ServletDemo implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Servlet3.0");
    }

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

    @Override
    public void destroy() {

    }
}

6.Servlet接口结构

(1)API结构
  Servlet接口中主要定义了init()、getServletConfig()、service()、getServletInfo()、destroy()方法。如果程序员定义Servlet类implements接口Servlet,则里面每个方法都要进行实现,但在实际情况中,主要实现service方法即可。因此,就有了实现抽象类GenericServlet和HttpServlet。
  Servlet入门学习_第1张图片
  Servlet入门学习_第2张图片
(2)GenericServlet抽象类
  GenericServlet抽象类将Servlet接口中的其他方法做了默认空实现,只将service()方法作为抽象方法。将来在定义Servlet类时,可以继承GenericServlet抽象类,只实现service方法即可。(这种方法在实际开发中基本不用)
(3)HttpServlet抽象类
  HttpServlet抽象类是GenericServlet抽象类的子类,是对http协议的一种封装,简化操作。在具体使用中,只需要定义类继承HttpServlet抽象类,复写doGet或doPost等对应不同请求方式的操作方法。
  service方法主要就是接受请求和返回请求返回请求执行结果。HTTP请求方式有7种,分别为GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE。所以在接受请求后,需要根据对应的请求方式来执行具体操作。而HttpServlet抽象类在继承GenericServlet抽象类后,对service方法做了实现,主要内容就是判断HTTP请求方式,并做对应的操作。因此,我们写程序时可以定义类继承HttpServlet抽象类,复写其中的HTTP操作方法即可,如doGet()、doPost()方法等。
  以下是HttpServlet类中的service方法:
Servlet入门学习_第3张图片

你可能感兴趣的:(Java)