一、Servlet概述与运行机制
Servlet是Java Web应用开发的核心组件,主要在服务器端运行,负责接收客户端请求并发送响应。Servlet的运行机制涵盖了多个环节,从客户端请求的发起到服务器端的处理和响应,整个过程井然有序。
(一)Servlet容器与Tomcat
Servlet容器是Servlet运行的基础设施,负责管理Servlet的生命周期、资源分配和请求处理等任务。Tomcat是广泛使用的Servlet容器之一,以其强大的功能和卓越的性能著称。在Tomcat中,Context容器直接管理Servlet的封装类Wrapper,每个Context对应一个Web项目。例如,在Tomcat的配置文件中,可以通过
标签配置Web应用的相关参数,如路径、文档库等。
(二)Servlet生命周期
- 加载与实例化
- Servlet容器在启动时或首次需要Servlet响应请求时,会加载Servlet类。它通过类加载器从本地文件系统、远程文件系统或网络服务中获取Servlet类。例如,在Web应用启动时,Tomcat会根据web.xml中的配置找到对应的Servlet类并加载它。
-
容器利用Java反射API创建Servlet实例,并调用默认构造方法(无参构造方法),因此在编写Servlet类时不应提供带参数的构造方法。
-
初始化
java
public void init(ServletConfig config) throws ServletException {
super.init(config);
// 初始化操作,如获取初始化参数
String paramValue = config.getInitParameter("paramName");
// 其他初始化逻辑
} -
Servlet实例化后,容器调用Servlet的init()方法进行初始化。在这个方法中,Servlet可以进行一些准备工作,如建立数据库连接、获取配置信息等。每个Servlet实例的init()方法只被调用一次,初始化期间可以使用ServletConfig对象获取web.xml中配置的初始化参数。如果发生错误,可抛出ServletException或UnavailableException异常通知容器。
-
请求处理
java
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
// 进行登录验证等业务逻辑处理
if (isValidUser(username, password)) {
response.getWriter().println("登录成功");
} else {
response.getWriter().println("登录失败");
}
} -
容器调用Servlet的service()方法处理请求。在service()方法中,Servlet通过ServletRequest对象获取客户端信息和请求信息,处理后通过ServletResponse对象设置响应信息。如果service()方法执行期间发生错误,可抛出ServletException或UnavailableException异常。若UnavailableException指示实例永久不可用,容器将调用destroy()方法释放实例。
-
服务终止
java
public void destroy() {
// 释放资源的逻辑,如关闭数据库连接
if (connection!= null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
super.destroy();
} - 当容器检测到Servlet实例应被移除时,调用destroy()方法释放资源,如关闭数据库连接、保存数据等。destroy()方法调用后,容器释放Servlet实例,由Java垃圾收集器回收。若再次需要该Servlet处理请求,容器会创建新的实例。
(三)Servlet体系结构
Servlet规范基于几个关键类运转,其中ServletConfig、ServletRequest和ServletResponse与Servlet主动关联。ServletConfig在初始化时传递给Servlet,用于获取Servlet的配置属性;ServletRequest和ServletResponse在请求处理时传递给Servlet,分别用于获取请求信息和设置响应信息。
在Tomcat容器中,存在门面设计模式的应用。例如,StandardWrapper和StandardWrapperFacade实现了ServletConfig接口,传给Servlet的是StandardWrapperFacade对象,它能保证Servlet获取到所需数据而不暴露无关数据。同样,ServletContext也有类似结构,Servlet中获取的实际对象是ApplicationContextFacade,用于获取应用的相关信息。
二、Servlet的基本使用与配置
(一)创建Servlet类
创建Servlet类需要继承HttpServlet类并重写相应方法。例如,创建一个简单的HelloWorldServlet:
```java
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloWorldServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应内容类型为HTML
response.setContentType("text/html");
// 获取输出流对象
PrintWriter out = response.getWriter();
// 输出HTML内容
out.println("
out.println("