浅谈Servlet

Servlet是什么

Java Servlet是运行在Web服务器或应用服务器上的程序,作为HTTP请求和HTTP服务器上的数据库或者应用之间的一层中间层。Servlet动态的处理来自客户端的请求,动态的生成html页面来响应请求。

Servlet运行在容器Container中,并不直接访问服务器计算机,而且Java存在安全管理器限制,所以使用Servlet可以保护计算机上的资源,是可信的。

Servlet架构

Servlet 架构

如图是Servlet架构,比较容易困惑的是HTTP Server和Servlets Program之间的关系,做如下解释:

  1. HTTP Server (HTTP服务器)
    • HTTP服务器是一个网络服务,用于接受客户端的请求,并返回相应的HTTP响应。是Web应用的基础,负责处理网络层面的通信。
    • HTTP服务器的职责
      • 监听网络端口
      • 解析HTTP请求
      • 处理静态资源(如html文件,图片,CSS文件等)
      • 转发动态请求(如将请求转发给后端应用,Servlet Container也视作后端应用的其中一种)
      • 返回响应,将处理结果以HTTP响应的形式返回给客户端
  2. Servlet
    • Servlet并不是一个独立的服务器,而是运行在Servlet容器中,动态处理HTTP服务器转发过来的HTTP请求并且生成响应。
    • Servlet的职责
      • 动态生成HTML,XML数据等内容
      • 业务逻辑的处理,比如处理用户输入,与数据库交互等等
      • 请求和响应管理,如通过Java API(HttpServletRequest & HttpServletResponse)读取请求数据和构造响应。
  3. Servlet Container (Servlet容器)
    • Servlet容器时HTTP Server的一部分,专门用于来管理和运行Servlet。常见的Servlet容器有Apache Tomcat,Jetty等等。
    • Servlet的职责
      • Servlet生命周期的管理:负责加载、初始化、运行和销毁Servlet。
      • 请求的转发:将HTTP Server接收到的动态请求转发给相对应的Servlet。
      • 线程管理:为每个请求分配线程,确保Servlet的并发处理能力。
      • 提供服务:为Servlet提供运行环境,包括请求解析、响应封装、安全控制等等。
  4. 三者的关系是什么?
    • HTTP Server是基础
    • Servlet容器是HTTP服务器的拓展,Servlet容器运行在HTTP服务器的内部
    • Servlet是动态处理的核心
    • 整体的Servlet处理的流程如下
      • 客户端发起HTTP请求(Request)
      • HTTP服务器接收到客户端的请求,判断是否需要动态处理
      • 如果是动态的,那么转发给Servlet容器
      • Servlet容器根据请求信息选择合适的Servlet
      • Servlet处理请求并且生成响应(Response)
      • Sevlet容器将响应返回给HTTP服务器
      • HTTP服务器将最终的请求发回给客户端

Servlet生命周期

Servlet生命周期

Servlet生命周期中有很多方法,比较重要的是init()方法,service()方法,doGet()方法,doPost()方法和destroy方法

init()方法

init()方法在第一次创建Servlet时被调用,在后续每次用户请求中不再被调用,当一个Servlet被调用时,就会创建一个Servlet实例,每一个用户请求会产生一个新的线程,并在适当的时候移交给doGet和doPost方法,在init方法中被加载的数据将会被用于Servlet的整个生命周期。

1
2
3
public void init() throws ServeletException {
//初始化代码
}

service()方法

service方法是实际上提供服务,或者说执行任务的方法。Servlet容器实际上是通过调用service方法来处理来自客户端的请求的,并且将处理好的响应重新发送回客户端。

每当服务器接收到一个Servlet请求的是偶,服务器都会产生一个新的线程并且调用service方法。service方法会检查接收到的HTTP请求的类型(GET,POST等等),并且在适当的时候去调用对应的doGet,doPost等方法。

1
2
3
4
5
public void service(ServletRequest request, 
ServletResponse response)
throws ServletException, IOException {
//代码
}

doGet()方法

GET请求来自于一个URL的正常求情,或者来自于一个没有指定METHOD的HTML表单,它由doGet方法来处理

1
2
3
4
5
public void doGet(HttpServletRequest request, 
HttpServletResponse response)
throw ServletException, IOException {
//代码
}

doPost()方法

POST请求来自于一个制定了POST METHOD的HTML

1
2
3
4
5
6
public void doPost(HttpServletRequest request, 
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}

destroy()方法

在生命周期结束时destroy方法将会被调用,这个方法会让Servlet进行关闭数据库连接,停止后台线程等活动,并且在调用此方法过后Servlet对象将会被标记为垃圾,等待垃圾回收机制的回收。

1
2
3
public void destroy() {
//代码
}

Servlets API

在Java中,Servlets API主要由javax.servletjavax.servlet.http两个包提供,一共包含了38个接口和21个类。

javax.servlet这个包可以被拓展来应用于处理任何一种应用层协议的请求,其中HTTP协议是使用比较广泛的协议之一。javax.servlet.http则是一个javax.servlet包的拓展,专门用于处理HTTP协议的请求。

如果要实现不同的HTTP Servlet,则可以通过继承HttpServlet这个类的子类来实现独立的Servlet编写。只需要重写doGet和doPost等方法。

如何实现一个简单的Servlet类

首先导入一些必要的包

1
2
3
4
5
6
7
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

然后开始重写servlet方法,这里以一个实现每次请求counter+1的servlet为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@WebServlet(name = "CounterServlet", urlPatterns = "/counter")
public class CounterServlet extends HttpServlet {
private int count = 0;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
count = count + 1;
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>CounterServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>CounterServlet</h1>");
out.println("<h2>" + count + "</h2>");
out.println("</body>");
out.println("</html>");
}

}

这个servlet类继承了HttpServlet类并且重写了doGet方法来实现业务逻辑。

总结

Servlet是一种运行在Web服务器或应用服务器上的Java程序,它作为HTTP请求与数据库或其他应用之间的中间层。Servlet容器负责管理Servlet的生命周期,包括初始化、请求处理和销毁等。Servlet通过实现doGet和doPost等方法来处理客户端的请求,并动态生成响应内容。Servlet的架构中,HTTP服务器负责处理网络请求,Servlet容器则运行在其之上,负责动态请求的处理。通过Servlet,开发者可以实现Web应用的业务逻辑,以满足用户的请求。


浅谈Servlet
http://blog.fantasticjoe.com/8e11fbe7.html
作者
JoeZhu
发布于
2025年3月12日
更新于
2025年3月12日
许可协议