Servlet

Servlet

一、servlet是什么?

Servlet是一个运行在Web服务器中的Java小程序,Servlet将会接收和响应来自Web客户端的请求,使用HTTP(超文本传输协议)进行通信。

Servlet是所有Web应用程序的核心类,它是唯一既可以直接处理和响应用户请求,也可以将处理工作委托给应用中的其他部分的类。除非某些过滤器提前终止了客户端的请求,否则所有的请求都将被发送到某些Servlet中。

在JSP+Servlet+JavaBean开发模式中,JSP作为视图将数据展现给用户,Servlet作为控制器,统一调度用户的请求,JavaBean封装和处理数据。

二、servlet怎么用?

1、Servlet继承关系

Servlet_第1张图片
Screenshot from 2019-06-16 16-02-19.png

)

(1)Servlet

所有的Servlet都实现了javax.servlet.Servlet接口,但通常不是直接实现的。Servlet只是一个简单接口,它包含了初始化并销毁Servlet和处理请求的方法。不过,无论什么类型的请求,甚至是非HTTP请求,也会调用service方法。

(2)GenericServlet

一般情况下,Servlet都继承自javax.servlet.GenericServlet。GenericServlet也是一个不依赖具体协议的Servlet,它只包含了一个抽象的service方法和几个用于日志操作的辅助方法。

(3)HttpServlet

javax.servlet.http.HttpServlet继承自GenericServlet,主要用来响应HTTP请求。HttpServlet实现了service方法。并且提供了响应每种HTTP方法类型的方法的空实现。

(4)ServletConfig

表示此Servlet在web.xml中的配置信息。web容器将配置信息封装为ServletConfig对象.

此外,可以用ServletContext对象表示一个web工程

获取ServletConfig对象和ServletContext对象
this.getServletConfig()
this.getServletContext()

2、HttpServlet中的方法

HTTP方法类型 Servlet方法 目的
GET doGet() 从指定的URL中获取资源
HEAD doHead() 与GET一致,唯一的区别在于该请求只返回页面的头部数据
POST doPost() 通常用于处理Web表单提交
PUT doPut() 存储URL中提供的实体
DELETE doDelete() 删除由URL标示的资源
OPTIONS doOptions() 返回支持的HTTP方法
TRACE doTrace() 用于诊断目的

3、Servlet的生命周期

(1)初始化调用init()

init()方法只会在web容器初始化Servlet时调用一次,只会调用一次

(2)服务器响应客户端时调用service()

每次客户端请求服务器,服务器进行响应时都会调用service()方法,会调用多次

(3)终止阶段调用destory()

当将web工程从web容器移除时,将会调用
destory()方法

4、Servlet的执行过程

(1)在浏览器地址栏中输入访问路径,向服务器发出请求。

(2)服务器根据请求的URL地址在web.xml文件中的标签下的子标签中寻找匹配路径,找到对应的

(3)服务器根据已经寻找到找到(包名+类名)。


         
  
  
  Hello Web Application

  
  
    hello
    com.hello.Servlet.HelloServlet
    1
  

  
  
  
    hello
    /
  
  

(4)服务器根据包名和类名寻找Servlet类(用户自定义的),创建Servlet实例。

(5)执行init方法

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }

    public void init() throws ServletException {
    }
}

(6)调用service方法

//GenericServlet类
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    //......
    public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
}

//HttpServlet类
public abstract class HttpServlet extends GenericServlet {
    //.......
    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);
    }
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long errMsg;
        if(method.equals("GET")) {
           //。。。。
        } else if(method.equals("HEAD")) {
            //。。。。
        } else if(method.equals("POST")) {
            this.doPost(req, resp);
        } else if(method.equals("PUT")) {
            this.doPut(req, resp);
        } else if(method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if(method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if(method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            //错误请求
        }

    }
}

(7)当Web应用程序被停止或卸载,或者Web容器关闭后,Servlet不在接收请求后,立即调用destroy方法。

你可能感兴趣的:(Servlet)