Servlet和Servlet容器概念

1.什么是Servlet?

在查看javax包下的Servlet,可以看到,servlet仅仅是一个普通的java接口。

package javax.servlet;

import java.io.IOException;

public interface Servlet {
    // 初始化方法
    void init(ServletConfig var1) throws ServletException;
   // 包含一个ServletConfig
    ServletConfig getServletConfig();
    // 运行方法
    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}

但是javaweb中的核心就是者一个servlet类,是javaweb应用的基础。javaweb应用中浏览器发出的请求,在java程序中就是通过servlet接收的。
问题出现了,为什么是通过servlet接收的,servlet是如何变成javaweb的基础和核心呢?
下面来详细解答:

1.1 Servlet的最初定义

通过上面的代码可以知道,Servlet就是一个接口,和其他java类没有任何区别。但这是jdk定义的规范,即Servlet就是javaweb的规范,是给servlet容器的规范。它规定了:

  • Servlet容器遇到实现了Servlet接口的class文件,就必须加载它。
  • Servlet容器要创建一个ServletConfig对象。这个对象中,包含了servlet的初始化配置信息。
package javax.servlet;
import java.util.Enumeration;
public interface ServletConfig {
    String getServletName();  //的到对应的servlet的名字。
    ServletContext getServletContext();   //得到servletContext
    String getInitParameter(String var1);
    Enumeration<String> getInitParameterNames();
}


<servlet>
    <servlet-name>springMvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>  //指的就是这些信息
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring/springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  • Servlet容器创建一个servlet对象,并且调用其中的init方法进行初始化。
  • Servlet容器接收到一个请求的时候,要针对这个请求,创建ServletRequest 和 ServletResponse 对象,并把它作为参数传给指定的servlet的service方法。

  • 当web应用被终止时,servlet会先调用servlet对象的destroy方法,然后再销毁servlet对象。

2.Servlet容器

看完上面的介绍,我们可以看出,Servlet基本没有做什么事情,全都是Servlet容器来做,那什么是Servlet容器呢?就是javaweb服务器,如Tomcat,netty等。 因此,正是这些针对Servlet容器的规范才使得Servlet一个普通的类变成了javaweb的核心。

2.1.Servlet和Servlet容器的关系比喻。

以前看过一篇文章,比喻两者的关系就像 子弹和枪 ,没有枪子弹也就是一个普通的铁块。相对的,没有tomcat等web服务器,servlet就是一个 普通的类。其实或许很难理解 “规范” 这个词,我们从另一个角度来看,java的的JDBC 就是针对各个数据库厂商的产品各不相同,而定义的统一规范。都是通过Connection来表示一个数据库连接。通过Statement来执行sql语句。 规范就是规定一些类的特殊作用。而Servlet的特殊作用就是用来在javaweb项目中,接受http请求的。

2.3Tomcat是如何实现管理Servlet的生命周期的

Tomcat相关的组件就不详细介绍了,毕竟这一篇写的是Servlet,在Tomcat中,把Servlet包装成StandardWrapper容器,所有相关的操作如Servlet的装载,初始化,执行和销毁都是由这个容器来操作。

通过 wrapper.loadServlet() 来创建Servlet对象。
public synchronized Servlet loadServlet() throws ServletException {
    Servlet servlet;
    try {
        ………
        ClassLoader classLoader = loader.getClassLoader();
        ………
        Class classClass = null;
        ………
        servlet = (Servlet) classClass.newInstance();   // 通过反射拿到Servlet对象。
        if ((servlet instanceof ContainerServlet) &&
            (isContainerProvidedServlet(actualClass) ||
            ((Context)getParent()).getPrivileged() )) {
                ((ContainerServlet) servlet).setWrapper(this);
        }
        classLoadTime=(int) (System.currentTimeMillis() -t1);
        try {
            instanceSupport.fireInstanceEvent(InstanceEvent.BEFORE_INIT_EVENT,servlet);
            if( System.getSecurityManager() != null) {
                Class[] classType = new Class[]{ServletConfig.class};
                Object[] args = new Object[]{((ServletConfig)facade)};
                SecurityUtil.doAsPrivilege("init",servlet,classType,args);
            } else {
            // 对Servlet进行初始化操作。并同时传一个StandardWrapperFacade对象,这个对象是包装了ServletConfig
                servlet.init(facade);   
            }
            .......
    return servlet;
}

再多提一句,Servlet容器的作用就是:
1. 接收请求
2. 管理Servlet的生命周期。

猜你喜欢

转载自blog.csdn.net/mooneal/article/details/79702538