首页 > 其他分享 >Servlet

Servlet

时间:2023-01-02 11:56:41浏览次数:35  
标签:Servlet config init sc ServletConfig public

前言

  在微人事的项目中,我们看到了很多HttpServletRequest request, HttpServletResponse response作为参数传入到某个方法中,它通常作为HttpServlet中的service()方法传入参数;serveice()方法,它起源于Servlet接口,属于其中非常重要的一部分。

1.Servlet接口

  1.1 Tomcat的工作机制(重要)

  1. 客户端向Servlet容器(如Tomcat)发起Http请求,此时Servlet还未初始化
  2. Tomcat从磁盘中加载servlet,servlet加载成功
  3. Tomcat将Http请求封装为request对象,转发request给对应的Servlet处理
  4. Servlet将request处理为response返回给Tomcat,Tomcat将request转换成Http响应
  5. Tomcat将Http响应给客户端

  1.2 Servlet定义

  1. 定义:java编写的应用成簇
  2. 功能:交互式地浏览和修改数据,生成动态web内容
  3. 狭义Servlet:实现了Servlet的接口
  4. 任何实现了Servlet接口的一个实现类

  1.3 Servlet的结构组成

       Servlet接口、ServletRequest接口、ServletResponse接口、GenericServlet抽象类(实现了Servlet接口)、ServletContext接口、ServletConfig接口、ServletDispatcher接口、Filter接口

  1.4 Servlet的工作原理

  1. Servlet容器将servlet加载到内存中,并产生servlet以及它能够调用的方法;在一个应用程序中,每个Servlet类型只能有一个Servlet对象
  2. 用户请求致使Servlet调用Servlet的service()方法,并传入一个ServletRequest和ServletResponse对象
  3. ServletRequest中封装了Http请求,无需技术人员解析原始Http数据,ServletResponse表示当前用户响应,程序员直接操作该对象返回响应给客户端用户
  4. 对任何一个应用程序,Servlet容器还会创建一个ServletConfig对象,该对象封装了应用程序的上下文环境,每个应用程序只有一个ServletConfig,每个Servlet对象只有一个Servlet配置的ServletConfig对象

  1.5 Servlet中的定义方法

public interface Servlet{
    void init(SerlvetConfig var1) throws ServletException;
    
    //返回Servlet容器传给init()方法的ServletConfig对象
    Servlet getServletConfig();

    void service(ServletRequest req, ServletResponse resp) throws ServletException{
        
    } 

    String getServletInfo();

    void destroy();
}

    

  1.6 Servlet的生命周期

  1. 在上面的方法中,init()、sevice()、destroy()方法表示了Servlet对象出生到死亡的过程
  2. init()方法:当Servlet第一次被请求是,Servlet就会调用该方法,并传入一个ServletConfig对象初始化一个Servlet对象,在后续请求中,它不会再被调用
  3. service()方法:每当Servlet被请求是,Servlet就会调用该方法,init()只会被调用一次,而service像人生中的工作一样,一直工作知道去世
  4. destroy()方法:当要销毁Servlet时会调用该方法(卸载应用程序或关闭Serlvet容器),就会调用该方法,它也只会被调用一次

  1.7 GenericServlet抽象类

   在实现Servlet的实现类中,我们都需要实现Servlet接口中的所有方法,及时不使用这些方法,而且还需要手动维护init()方法中ServletConfig对象的应用,这样显得很麻烦,GenericServlet抽象类应需而生,它实现了Servlet以及ServletConfig接口

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
    private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.LocalStrings");
    private transient ServletConfig config;
 
    public GenericServlet() {
    }
 
    public void destroy() {
    }
 
    public String getInitParameter(String name) {
        ServletConfig sc = this.getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
        } else {
            return sc.getInitParameter(name);
        }
    }
 
    public Enumeration<String> getInitParameterNames() {
        ServletConfig sc = this.getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
        } else {
            return sc.getInitParameterNames();
        }
    }
 
    public ServletConfig getServletConfig() {
        return this.config;
    }
 
    public ServletContext getServletContext() {
        ServletConfig sc = this.getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
        } else {
            return sc.getServletContext();
        }
    }
 
    public String getServletInfo() {
        return "";
    }
 
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }
 
    public void init() throws ServletException {
    }
 
    public void log(String msg) {
        this.getServletContext().log(this.getServletName() + ": " + msg);
    }
 
    public void log(String message, Throwable t) {
        this.getServletContext().log(this.getServletName() + ": " + message, t);
    }
 
    public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
 
    public String getServletName() {
        ServletConfig sc = this.getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
        } else {
            return sc.getServletName();
        }
    }
}
GenericServlet抽象类

  GenericServlet中两个init()方法的作用

public void init(ServletConfig var1) throws ServletException{

}

public void init(ServletConfig config) throws ServletException{
    this.config = config;
    this.init();
}

  GenericServlet是一个抽象类无法产生实例,所以需要一个类继承它,就会出现覆盖的问题,如果实现该类就会覆盖该类的init()方法,那么程序员需要手动维护ServletConfig对象,这个不带参数的init()方法就是解决实现类覆盖问题的

2.javax.servlet.http

 

3.ServletContextListener

 

标签:Servlet,config,init,sc,ServletConfig,public
From: https://www.cnblogs.com/kzf-99/p/17019501.html

相关文章