一、Servlet简介与工作原理
Servlet是Java Web开发中的重要组件,它运行在服务器端,用于处理客户端的请求并返回响应。其工作原理涉及多个组件和步骤,从客户端发起请求到服务器端的处理和响应,整个过程有条不紊地进行。
(一)Servlet容器与Tomcat
Servlet容器是Servlet运行的环境,负责管理Servlet的生命周期、资源分配和请求处理等工作。Tomcat是常用的Servlet容器之一,它具有强大的功能和良好的性能。在Tomcat中,Context容器直接管理Servlet的包装类Wrapper,一个Context对应一个Web工程。例如,在Tomcat的配置文件中,可以通过<Context>
标签来配置Web应用的相关参数,如路径、文档库等。
(二)Servlet的生命周期
- 加载和实例化
- Servlet容器在启动时或首次检测到需要Servlet响应请求时,会加载Servlet类。它通过类加载器从本地文件系统、远程文件系统或网络服务中获取Servlet类。例如,在一个Web应用启动时,Tomcat会根据web.xml中的配置找到对应的Servlet类并加载它。
- 容器使用Java反射API创建Servlet实例,调用默认构造方法(无参构造方法),因此编写Servlet类时不应提供带参数的构造方法。
- 初始化
- 实例化后,容器调用Servlet的init()方法进行初始化。在这个方法中,Servlet可以进行一些准备工作,如建立数据库连接、获取配置信息等。例如,以下是一个简单的init()方法实现:
public void init(ServletConfig config) throws ServletException {
super.init(config);
// 在这里进行初始化操作,如获取初始化参数
String paramValue = config.getInitParameter("paramName");
// 其他初始化逻辑
}
- 每个Servlet实例的init()方法只被调用一次,初始化期间可以使用ServletConfig对象获取web.xml中配置的初始化参数。如果发生错误,可抛出ServletException或UnavailableException异常通知容器。
- 请求处理
- 容器调用Servlet的service()方法处理请求。在service()方法中,Servlet通过ServletRequest对象获取客户端信息和请求信息,处理后通过ServletResponse对象设置响应信息。例如,在一个处理登录请求的Servlet中:
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("登录失败");
}
}
- 如果service()方法执行期间发生错误,可抛出ServletException或UnavailableException异常。若UnavailableException指示实例永久不可用,容器将调用destroy()方法释放实例。