`

Servlet基本工作原理

 
阅读更多

Servlet容器工作原理  

 

 

本 文介绍一个简单 servlet 容器的基本原理。现有两个servlet容器,第一个很简单,第二个则是根据第一个写出。为了使第一个容器尽量简单,所以没有做得很完整。复杂一些的 servlet容器(包括TOMCAT4和5)在TOMCAT运行内幕的其他章节有介绍。

两个servlet容器都处理简单的 servlet及staticResource。您可以使用 webroot/ 目录下的 PrimitiveServlet 来测试它。复杂一些的 servlet会超出这些容器的容量,您可以从 TOMCAT 运行内幕 一书学习创建复杂的 servlet 容器。

两个应用程序的类都封装在ex02.pyrmont 包下。在理解应用程序如何运作之前,您必须熟悉 javax.servlet.Servlet 接口。首先就来介绍这个接口。随后,就介绍servlet容器服务servlet的具体内容。

javax.servlet.Servlet 接口

servlet 编程,需要引用以下两个类和接口:javax.servlet 和 javax.servlet.http,在这些类和接口中,javax.servlet.Servlet接口尤为重要。所有的 servlet 必须实现这个接口或继承已实现这个接口的类。

Servlet 接口有五个方法,如下

public void init(ServletConfig config) throws ServletException
public void service(ServletRequest request, ServletResponse response)
throws ServletException, jsp servlet ejb 





.io.IOException
  public void destroy()
  public ServletConfig getServletConfig()
  public jsp servlet ejb 





.lang.String getServletInfo()


init、 service和 destroy 方法是 Servlet 生命周期的方法。当 Servlet 类实例化后,容器加载 init,以通知 servlet 它已进入服务行列。init 方法必须被加载,Servelt 才能接收和请求。如果要载入数据库驱动程序、初始化一些值等等,程序员可以重写这个方法。在其他情况下,这个方法一般为空。

service 方法由 Servlet 容器调用,以允许 Servlet 响应一个请求。Servlet 容器传递 javax.servlet.ServletRequest 对象和 javax.servlet.ServletResponse 对象。ServletRequest 对象包含客户端 HTTP 请求信息,ServletResponse 则封装servlet 响应。这两个对象,您可以写一些需要 servlet 怎样服务和客户怎样请求的代码。

从service中删除Servlet实例之 前,容器调用destroy方法。在servlet容器关闭或servlet容器需要更多的内存时,就调用它。这个方法只有在servlet的 service方法内的所有线程都退出的时候,或在超时的时候才会被调用。在 servlet 容器调用 destroy方法之后,它将不再调用servlet的service方法。destroy 方法给了 servlet 机会,来清除所有候住的资源(比如:内存,文件处理和线程),以确保在内存中所有的持续状态和 servlet的当前状态是同步的。Listing 2.1 包含了PrimitiveServlet 的代码,此servlet非常简单,您 可以用它来测试本文中的servlet容器应用程序。

PrimitiveServlet 类实现了javax.servlet.Servlet 并提供了五个servlet方法的接口 。它做的事情也很简单:每次调用 init,service 或 destroy方法的时候,servlet就向控制口写入方法名。service 方法也从ServletResponsec对象中获得java.io.PrintWriter 对象,并发送字符串到浏览器。

Listing 2.1.PrimitiveServlet.java
import javax.servlet.*;
import jsp servlet ejb 





.io.IOException;
import jsp servlet ejb 





.io.PrintWriter;
public class PrimitiveServlet implements Servlet 
{
 public void init(ServletConfig config) throws ServletException 
{
   System.out.println("init");
    }
 public void service(ServletRequest request, ServletResponse  response)
 throws ServletException, IOException 
{
      System.out.println("from service");
      PrintWriter out = response.getWriter();
      out.println("Hello.Roses are red.");
      out.print("Violets are blue.");
    }
 public void destroy() 
{
    System.out.println("destroy");
    }
    public String getServletInfo()
 {
   return null;
    }

 public ServletConfig getServletConfig() 
{
    return null;
    }
}



Application 1

现在,我们从 servlet容器的角度来看看 servlet 编程。一个功能健全的 servlet容器对于每个 servlet 的HTTP请求会完成以下事情:

当servlet 第一次被调用的时候,加载了 servlet类并调用它的init方法(仅调用一次)

响应每次请求的时候 ,构建一个javax.servlet.ServletRequest 和 javax.servlet.ServletResponse实例。

激活servlet的service方法,传递 ServletRequest 和 ServletResponse 对象。

当servlet类关闭的时候,调用servlet的destroy方法,并卸载servlet类。

发生在 servlet 容器内部的事就复杂多了。只是这个简单的servlet容器的功能不很健全,所以,这它只能运行非常简单的servelt ,并不能调用servlet的init和destroy方法。然而,它也执行了以下动作:

等待HTTP请求。

构建ServletRequest和ServletResponse对象

如果请求的是一个staticResource,就会激活StaticResourceProcessor实例的 process方法,传递ServletRequest 和 ServletResponse 对象。

如果请求的是一个servlet ,载入该类,并激活它的service方法,传递ServletRequest和ServletResponse 对象。注意:在这个servlet 容器,每当 servlet被请求的时候该类就被载入。

在第一个应用程序中,servlet容器由六个类组成 。

HttpServer1

Request

Response

StaticResourceProcessor

ServletProcessor1

Constants



证 如前文中的应用程序一样,这个程序的进入口(静态 main 方法)是HttpServer 类。这个方法创建了HttpServer实例,并调用它的await方法。这个方法等待 HTTP 请示,然后创建一个 request 对象和 response对象,根据请求是否是staticResource还是 servlet 来分派它们到 StaticResourceProcessor实例或ServletProcessor实例。

Constants 类包含 static find WEB_ROOT,它是从其他类引用的。 WEB_ROOT 指明 PrimitiveServlet 位置 和容器服务的staticResource。

HttpServer1 实例等待 HTTP 请求,直到它收到一个 shutdown 命令。发布 shutdown命令和前文是一样的。

HttpServer1 类

此应用程序内的 HttpServer1类 与前文简单的 WEB 服务器应用程序中的HttpServer 十分相似。但是,此应用程序内的 HttpServer1 能服务静态资源和 servlet。如果要请求一个静态资源,请输入以下 URL:

http://machineName:port/staticResource

它就是前文中提到的怎样在 WEB 服务器应用程序里请求静态资源。如果要请求一个 servlet,请输入以下 URL:

http://machineName:port/servlet/servletClass

如果您想在本地浏览器请求一个 PrimitiveServle servlet ,请输入以下 URL:

http://localhost:8080/servlet/PrimitiveServlet

下面 Listing 2.2 类的 await 方法,是等待一个 HTTP 请求,直到一个发布 shutdown 命令。与前文的 await 方法相似。

Listing 2.2. HttpServer1 类的 await 方法
public void await() {
ServerSocket serverSocket = null;
int       port  = 8080;

try {
serverSocket =  new ServerSocket(port, 1,
InetAddress.getByName("127.0.0.1"));
    }
catch (IOException e) {
e.printStackTrace();
System.exit(1);
    }

// 循环,等待一个请求
while (!shutdown) {
Socket socket       = null;
InputStream input   = null;
OutputStream output = null;

try {
socket = serverSocket.accept();
input  = socket.getInputStream();
output = socket.getOutputStream();

// 创建请求对象并解析
Request request = new Request(input);
request.parse();

// 创建回应对象
Response response = new Response(output);
response.setRequest(request);

//检测是否是 servlet 或静态资源的请求
//servlet 请求以 "/servlet/" 开始 
if (request.getUri().startsWith("/servlet/")) {
ServletProcessor1 processor = new ServletProcessor1();
processor.process(request, response);
            }
else {
StaticResourceProcessor processor =
new StaticResourceProcessor();
processor.process(request, response);
            }

// 关闭socket
socket.close();

//检测是否前面的 URI 是一个 shutdown 命令
shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
        }
catch (Exception e) {
e.printStackTrace();
System.exit(1);
        }
    }
}


此文 await 方法和前文的不同点就是,此文的 await 方法中的请求调度到StaticResourceProcessor 或 ervletProcessor 。

如果 URI中包含 "/servlet/.",请求推进到后面,否则,请求传递到 StaticResourceProcessor 实例

Request 类

Servlet service 方法接受 servlet 容器的 javax.servlet.ServletRequest 和javax.servlet.ServletResponse 实例。因此,容器必须构建 ServletRequest和ServletResponse对象,然后将其传递到正在被服务的service 方法。

ex02.pyrmont.Request 类代表一个请求对象传递到 service 方法。同样地,它必须实现 javax.servlet.ServletRequest 接口。这个类必须提供接口内所有方法的实现。这里尽量简化它并只实现几个方法。要编译 Request 类的话,必须提供这些方法的空实现。再来看看 request 类,内部所有需要返回一个对象实例都返回null,如下:

public Object getAttribute(String attribute) {
return null;
  }

public Enumeration getAttributeNames() {
return null;
  }

public String getRealPath(String path) {
return null;
  }


另外,request 类仍需有前文有介绍的 parse 和getUri 方法。

Response 类

response 类实现 javax.servlet.ServletResponse,同样,该类也必须提供接口内所有方法的实现。类似于 Request 类,除 getWriter 方法外,其他方法的实现都为空。

public PrintWriter getWriter() {
// autoflush is true, println() will flush,
// but print() will not.
writer = new PrintWriter(output, true);
return writer;

}


PrintWriter 类构建器的第二个参数是一个代表是否启用 autoflush 布尔值 ,如果为真,所有调用println 方法都 flush 输出。而 print 调用则不 flush 输出。因此,如果在servelt 的service 方法的最后一行调用 print方法,则从浏览器上看不到此输出 。这个不完整性在后面的应用程序内会有调整。

response 类也包含有前文中介绍的 sendStaticResource方法。

StaticResourceProcessor 类

StaticResourceProcessor 类用于服务静态资源的请求。它唯一的方法是 process。

Listing 2.3.StaticResourceProcessor 类的 process方法。
public void process(Request request, Response response) {
try {
response.sendStaticResource();
    }
catch (IOException e) {
e.printStackTrace();
    }
}


process 方法接受两个参数:Request 和 Response 实例。它仅仅是调用 response 类的 sendStaticResource 方法。
ServletProcessor1 类

ServletProcessor1 类用来处理对 servlet 的 HTTP 请求。 它非常简单,只包含了一个 process 方法。 而这个方法接受两个参数: 一个javax.servlet.ServletRequest 实例和一个 avax.servlet.ServletResponse实例。 process 方法也构建了一个 jsp servlet ejb .net.URLClassLoader 对象并使用它装载 servlet 类文件。 在从类装载器获得的 Class 对象上,process 方法创建一个 servlet 实例并调用它的 service 方法。

process 方法

Listing 2.4. ServletProcessor1 类中 process 方法

public void process(Request request, Response response) {
    String uri            = request.getUri();
    String servletName    = uri.substring(uri.lastIndexOf("/") + 1);
    URLClassLoader loader = null;

    try {
        // create a URLClassLoader
        URLStreamHandler streamHandler = null;

        URL[] urls        = new URL[1];
        File classPath    = new File(Constants.WEB_ROOT);
        String repository = (new URL("file", null, 
            classPath.getCanonicalPath() + File.separator)).toString() 
        urls[0]           = new URL(null, repository, streamHandler);
        loader            = new URLClassLoader(urls);
    }
    catch (IOException e) {
        System.out.println(e.toString());
    }

    Class myClass = null;

    try {
        myClass = loader.loadClass(servletName);
    }
    catch (Exception e) {
        System.out.println(e.toString());
    }

    Servlet servlet = null;
    try {
        servlet = (Servlet) myClass.newInstance();
        servlet.service((ServletRequest) request, (ServletResponse) response);
    }
    catch (Exception e) {
        System.out.println(e.toString());
    }
    catch (Throwable e) {
        System.out.println(e.toString());
    }
}


process方法接受两个参数:一个 ServletRequest实例和一个 ServletResponse 实例。process方法通过调用 getRequestUri 方法从 ServletRequest获取 URI。

String uri = request.getUri();切记 URI 的格式:

/servlet/servletName

servletName是servlet类的名称。

如 果要装载 servlet 类,则需要使用以下代码从 URI 获知 servlet 名称:String servletName = uri.substring(uri.lastIndexOf("/") + 1);然后 process 方法装载 servlet。 要做到这些,需要创建一个类装载器,并告诉装载器该类的位置, 该 servlet 容器可以指引类装载器在 Constants.WEB_ROOT 指向的目录中查找。 在工作目录下,WEB_ROOT 指向 webroot/ 目录。

如果要装载一个 servlet,则要使用 jsp servlet ejb .net.URLClassLoader 类,它是java.lang.ClassLoader 的间接子类。 一旦有了 URLClassLoader 类的实例,就可以使用 loadClass 方法来装载一个 servlet 类。 实例化 URLClassLoader 是很简单的。 该类有三个构建器,最简单的是:

public URLClassLoader(URL[] urls);

urls 是一组指向其位置 jsp servlet ejb .net.URL 对象, 当装载一个类时它会自动搜索其位置。任一以 / 结尾的 URL 都被假定为一目录, 否则,就假定其为 .jar 文件,在需要时可以下载并打开。

在 一个 servlet 容器内,类装载器查找 servlet 类的位置称为储存库 (repository)。在所举的应用程序中,类装载器只可在当前工作目录下的 webroot/ 目录查找,所以,首先得创建一组简单的 URL。 URL 类提供了多个构建器,因此有许多的方法来构建一个URL 对象。 在这个应用程序内,使用了和 TOMCAT 内另外一个类所使用的相同的构建器。 该构建器头部 (signature) 如下:

public URL(URL context, String spec, URLStreamHandler hander)

throws MalformedURLException

可以通过传递给第二个参数一个规范,传递给第一个和第三个参数 null 值来使用这个构建器, 但在些有另外一种可接受三个参数的构建器:

public URL(String protocol, String host, String file)

throws MalformedURLException

因此,如果只写了以下代码,编译器将不知道是使用的哪个构建器:

new URL(null, aString, null);

当然也可以能过告诉编译器第三个参数的类型来避开这个问题,如:

URLStreamHandler streamHandler = null;

new URL(null, aString, streamHandler);

对于第二个参数,可以传递包含储存库 (repository) 的 String 。 以下代码可创建:

String repository = (new URL("file", null,

classPath.getCanonicalPath() + File.separator)).toString();

结合起来,以下是构建正确 URLClassLoader 实例的 process 方法的部分代码

// create a URLClassLoader
URLStreamHandler streamHandler = null;
URL[] urls        = new URL[1];
File classPath    = new File(Constants.WEB_ROOT);
String repository = (new URL("file", null, 
    classPath.getCanonicalPath() + File.separator)).toString() 
urls[0]           = new URL(null, repository, streamHandler);
loader            = new URLClassLoader(urls);


创 建储存库 (repository)的代码摘自org.apache.catalina.startup.ClassLoaderFactory内的 createClassLoader 方法,而创建 URL 的代码摘自org.apache.catalina.loader.StandardClassLoader 类内的 addRepository 方法。 但在此阶段您还没有必要去关心这些类。

有了类装载器,您可以使用loadClass方法装载servlet类:

Class myClass = null;
try {
    myClass = loader.loadClass(servletName);
}
catch (ClassNotFoundException e) {
    System.out.println(e.toString());
}


然后,process方法创建已装载的 servlet类的实例,传递给 javax.servlet.Servlet ,并激活 servlet 的 service 方法:

Servlet servlet = null;
try {
    servlet = (Servlet) myClass.newInstance();
    servlet.service((ServletRequest) request, (ServletResponse) response);
}
catch (Exception e) {
    System.out.println(e.toString());
}
catch (Throwable e) {
    System.out.println(e.toString());
}


编译并运行该应用程序

如果要编译该应用程序,在工作目录下键入以下命令:

javac -d . -classpath ./lib/servlet.jar src/ex02/pyrmont/*.java

如果要在 windows 下运行该应用程序,在工作目录下键入以下命令:

jsp servlet ejb -classpath ./lib/servlet.jar;./ ex02.pyrmont.HttpServer1

在 linux 环境下,使用冒号来隔开类库:

jsp servlet ejb -classpath ./lib/servlet.jar:./ ex02.pyrmont.HttpServer1

如果要测试该应用程序,请在 URL 或浏览器地址栏键入以下命令:

http://localhost:8080/index.html

或者是:

http://localhost:8080/servlet/PrimitiveServlet

您将会在浏览器中看到以下文本:

Hello. Roses are red.

注意:您不能看到第二行字符 (Violets are blue),因为只有第一行字符送入到浏览器。 Tomcat 运行工作原理 随后的章节会告诉您怎样来解决这个问题。
Application 2

第 一个应用程序里存在一个值得注意的问题。 在ServletProcessor1 类的 process 方法里,上溯 (upcast)ex02.pyrmont.Request 实例到 javax.servlet.ServletRequest,将其作为第一个参数传递给 servlet 的 service 方法。 另上溯(upcast) ex02.pyrmont.Response 实例到 javax.servlet.ServletResponse ,并将其作为第二个参数传递给 servlet 的 service 方法。

try {
   servlet = (Servlet) myClass.newInstance();
   servlet.service((ServletRequest) request, (ServletResponse) response);
}


这 样会使安全性能大打折扣。 知道 servlet 容器工作原理的程序员可以将 ServletRequest 和 ServletResponse 实例向下转型 (downcast) 到Request 和 Response ,并调用它们的 public 方法。 Request 实例能调用它的 parse 方法; Request 实例能调用它的 sendStaticResource 方法。

可以将 parse 和 sendStaticResource 方法设为 private,因为在 ex02.pyrmont 里将会从其他类里调用它们。 然而,这两个方法在 servlet 内应该是不可用的。 一个解决方法是:给 Request 和 Response 类一个默认的访问修饰符,以致他们在 ex02.pyrmont 外不能被使用。 但还有一个更好的解决方法: 使用 facade 类。

在 第二个应用程序内,添加两个 facade 类:RequestFacade 和 ResponseFacade。 RequestFacade 类实现 ServletRequest 接口,并通过传递 Request 实例来实例化, Request 实例将在 ServletRequest 对象的构建器里被引用 。 ServletRequest 对象本身是 private 类型的,不能在类之外访问。 就构建 RequestFacade 对象,并将其传递给 service 方法,而不上溯 (upcast) Request 对象给 ServletRequest,并将其传递给 service 方法。 servlet 程序员仍旧可以向下转型 (downcast) ServletRequest 到 RequestFacade,但是,只要访问 ServletRequest 接口的可用方法就可以了。 现在,parseUri 就安全了。

Listing 2.5 显示 RequestFacade 类部分代码:

Listing 2.5. RequestFacade 类

package ex02.pyrmont;

public class RequestFacade implements ServletRequest {
    private ServletRequest request = null;

    public RequestFacade(Request request) {
        this.request = request;
    }

    /* implementation of the ServletRequest*/
    public Object getAttribute(String attribute) {
        return request.getAttribute(attribute);
    }

    public Enumeration getAttributeNames() {
        return request.getAttributeNames();
    }

    ...
}


注意 RequestFacade 构造函数。 它会接受一个 Request 对象,即刻分配给私有的 servletRequest 对象引用。 还要注意,RequestFacade 内的每个方法调用 ServletRequest 对象内相应的方法。

ResponseFacade 类也是如此。

以下是 application 2 所包含的类

HttpServer2 
Request 
Response 
StaticResourceProcessor 
ServletProcessor2 
Constants 
HttpServer2 类类似于 HttpServer1,
只是它在 await 方法内使用了 ServletProcessor2 而不是ServletProcessor1。
if (request.getUri().startsWith("/servlet/")) {
   ServletProcessor2 processor = new ServletProcessor2();
   processor.process(request, response);
}
else {
    ...
}
ServletProcessor2 类也类似于 ServletProcessor1,
只是在以下 process 方法的部分代码有点不同:
Servlet servlet = null;
RequestFacade requestFacade   = new RequestFacade(request);
ResponseFacade responseFacade = new ResponseFacade(response);

try {
    servlet = (Servlet) myClass.newInstance();
    servlet.service((ServletRequest) requestFacade, 
        (ServletResponse) responseFacade);
}



编译并运行该应用程序

如果要编译该应用程序,在工作目录下键入以下命令:

javac -d . -classpath ./lib/servlet.jar src/ex02/pyrmont/*.java

如果要在 windows 下运行该应用程序,在工作目录下键入以下命令:

jsp servlet ejb -classpath ./lib/servlet.jar;./ ex02.pyrmont.HttpServer2

在linux环境下,使用分号来隔开类库:

jsp servlet ejb -classpath ./lib/servlet.jar:./ ex02.pyrmont.HttpServer2

您可以使用和 application 1 相同的 URL 以收到同样的结果。

总结

本文讨论了简单的能够用于服务静态资源,以及处理如 PrimitiveServlet 一样简单的 servlet 的 servlet 容器。 同时也提供 javax.servlet.Servlet 的背景信息。

 

 

转自:http://lxs9731.blog.163.com/blog/static/34793702007112263521960/

 

 

资料:http://www.ibm.com/developerworks/cn/java/j-lo-servlet/

分享到:
评论

相关推荐

    SERVLET基本原理

    SERVLET 基本原理 SERVLET 基本原理是指 SERVLET 的装载、初始化、服务和销毁等过程。SERVLET 是一种小型的 Java 程序,可以在 Web 服务器中运行,提供动态网页服务。 SERVLET 生命周期是指 SERVLET 从创建到销毁...

    servlet容器工作原理

    ### Servlet容器工作原理 #### 一、概述 Servlet容器,如Tomcat,是Java Web应用的基础组成部分之一。本文旨在深入探讨Tomcat中的Servlet容器工作原理,重点解释Servlet容器如何加载和管理Servlet,以及如何处理...

    servlet工作原理

    ### Servlet工作原理详解 #### 一、Servlet简介与工作流程 Servlet是一种服务器端的Java应用程序,主要用于接收客户端发送的HTTP请求,并返回响应结果。Servlet在Java Web开发中扮演着核心角色,它负责处理用户...

    servlet工作原理(2)

    `init()`方法由Servlet容器自动调用,开发者可以在其中进行一些基本的初始化工作,如数据库连接、读取配置文件等。 - 当Servlet类继承自`HttpServlet`时,如果子类没有定义自己的`init()`方法,则会默认调用父类...

    servlet模拟struts1工作原理

    本文将通过使用Servlet来模拟Struts1的工作流程,深入理解其核心机制。 首先,让我们探讨Struts1的基本架构。Struts1框架的核心组件包括ActionServlet、ActionForm、Action、Tiles以及配置文件(struts-config.xml...

    JSP servlet 课件(清华IT)(适用于有一定基础的编程人员)

    **Servlet基本工作原理** Servlet的核心工作流程包括: 1. `HttpServlet`是一个抽象类,我们创建的Servlet需要继承它,并覆盖`doPost()`和`doGet()`方法。 2. 当Web容器接收到请求时,会调用`service()`方法,该方法...

    Servlet容器工作原理讲解

    在这个讲解中,我们将深入探讨Servlet容器的工作原理以及Servlet接口的关键方法。 首先,Servlet容器(如Tomcat)的核心职责是管理和调度Servlet实例。当一个HTTP请求到达服务器时,Servlet容器负责解析请求,识别...

    Servlet生命周期与工作原理

    下面将详细阐述这三个阶段以及Servlet的工作原理。 1. 初始化阶段: 当Servlet容器(如Tomcat)启动时,可以通过在`web.xml`配置文件中设置`<load-on-startup>`标签来指定Servlet在容器启动时自动加载,或者在容器...

    Servlet工作原理解析PDF版

    ### Servlet工作原理深入解析 #### 一、引言 随着互联网技术的快速发展,Web应用程序已成为企业和个人进行在线交互的重要手段。在众多Web开发框架和技术中,Servlet作为一种基于Java的服务器端编程模型,自诞生...

    servlet原理

    Servlet是Java Web开发中的核心组件,它是一种服务器端的Java应用程序,用于处理来自客户端(通常是Web浏览器)的请求并...通过源码阅读和实践,我们可以更好地掌握Servlet的工作机制,并利用相关工具提高开发效率。

    servlet工作原理解析

    ### Servlet工作原理与生命周期解析 #### 一、Servlet概述 Servlet是Java Web开发中的核心组件之一,主要用于处理客户端发送到服务器端的HTTP请求,并生成相应的响应。Servlet技术由Sun Microsystems在1997年推出...

    用购物车,Servlet的基本原理,Ajax增强用户体验

    Servlet的基本原理 使用Ajax增强用户体验 使用分层思想进行程序设计 使用session保存用户和购物车信息 使用面向对象编程进行实现功能开发 能够使用JDBC实现数据库访问 能够使用EL+JSTL简化页面布局

    servlet运行原理及生命周期.pdf

    - **无参 init() 方法**:首先调用无参的 `init()` 方法,进行一些基本的初始化工作。 - **有参 init(ServletConfig config) 方法**:随后调用有参的 `init(ServletConfig config)` 方法,传入 `ServletConfig` ...

    servlet课件(工作原理,处理表单)

    Servlet的工作原理可以分为三个主要步骤: 1. **请求**:当客户端(通常是浏览器)发起HTTP请求时,该请求被Web服务器接收。如果请求的目标是一个Servlet,Web服务器会根据`web.xml`配置文件找到对应的Servlet实例...

    深入Java Web心脏:Servlet工作原理全解析

    ### 深入Java Web心脏:Servlet工作原理全解析 ...以上内容涵盖了Java语言的基本特征、应用领域以及Servlet的工作原理和实现方式。通过了解这些知识点,开发者能够更好地利用Java进行Web应用的开发。

    Servlet框架基本源码

    以下将详细讲解Servlet框架的基本源码及其工作原理。 1. **Servlet的生命周期** Servlet的生命周期包括加载、初始化、服务、销毁四个阶段。在Web应用启动时,Servlet容器(如Tomcat)会根据web.xml配置文件加载...

Global site tag (gtag.js) - Google Analytics