Java技术,用于处理HTTP请求和生成动态Web内容。Servlet运行在Web服务器中,通常与Java EE应用程序一起使用。
Servlet的核心概念
-
Servlet容器: Servlet容器(如Apache Tomcat)是Servlet运行的环境,它负责管理Servlet的生命周期,包括创建、初始化、处理请求和销毁等。容器接收客户端的请求,将其封装为
HttpServletRequest
对象,并将响应封装为HttpServletResponse
对象,再将它们传递给对应的Servlet进行处理。 -
Servlet生命周期:
-
加载和实例化:当Servlet容器启动或收到第一次请求时,会加载Servlet类并创建一个实例。
-
初始化:容器调用
init()
方法对Servlet进行初始化。这个方法只会在Servlet实例化后调用一次。 -
请求处理:每次有请求到达时,Servlet的
service()
方法被调用,该方法会根据请求的类型(GET、POST等)调用相应的doGet()
、doPost()
等方法。 -
销毁:当Servlet容器决定销毁Servlet实例时,会调用
destroy()
方法进行清理工作。这通常是在容器关闭或Servlet被卸载时发生。
-
-
请求和响应对象:
-
HttpServletRequest:封装了客户端请求的详细信息,包括请求参数、请求头、请求体等。通过该对象,Servlet可以获取客户端传递的数据。
-
HttpServletResponse:封装了服务器对客户端的响应,包括响应状态码、响应头、响应体等。Servlet通过该对象将处理结果返回给客户端。
-
-
Servlet的三大域对象:
-
ServletContext(应用域):全局作用域对象,用于存储整个Web应用中所有用户共享的数据。可以通过
getServletContext()
方法获取。- 用途:存储应用初始化参数,跨Servlet共享数据。
-
Session(会话域):用于存储与特定用户会话相关的数据,每个用户对应一个独立的会话。通过
request.getSession()
方法获取。- 用途:保持用户登录状态、存储用户会话信息。
-
ServletRequest(请求域):请求范围内的共享对象,用于存储一次请求内的数据。通过
request
对象本身可以直接操作。- 用途:获取请求参数、请求头信息,转发数据到其他Servlet或JSP。
-
-
转发与重定向:
-
请求转发(Forward):服务器内部的操作,客户端并不知道请求被转发了。转发后的请求和响应对象仍然是同一个,可以在多个Servlet或JSP之间共享数据。转发通过
RequestDispatcher.forward()
方法实现。适用于同一应用内的页面跳转,数据共享更方便。- 原理:服务器内部的资源跳转,URL不变。
-
请求重定向(Redirect):服务器告诉客户端去请求另一个URL,是一次新的请求,因此请求对象和响应对象会重新创建。重定向后,客户端的浏览器地址(URL)栏会发生变化,数据不能在请求间共享。重定向通过
response.sendRedirect()
方法实现。适用于跨域或外部资源的跳转,不适合大量数据传递。- 原理:服务器告诉客户端重定向到新URL,客户端再发起请求。
-
Servlet的作用
-
处理客户端请求: Servlet是Web应用的核心,负责接收并处理客户端(通常是浏览器)发送的请求。通过Servlet,开发者可以动态生成响应内容,如HTML页面、JSON数据或文件下载等。
-
控制业务逻辑: Servlet通常负责处理核心业务逻辑,如处理表单提交、执行数据库查询、调用后端服务等。它在MVC(Model-View-Controller)模式中通常扮演控制器(Controller)的角色。
-
管理会话: Servlet能够通过
HttpSession
对象管理用户的会话状态,如用户登录信息、购物车内容等。它为开发者提供了一个简单的接口来管理与特定用户相关的数据。 -
请求转发与重定向: Servlet能够在接收到请求后,决定将请求转发给其他资源(如另一个Servlet或JSP),或者通过重定向将客户端引导到另一个URL。
-
过滤器与监听器: Servlet API还包括过滤器(Filter)和监听器(Listener),它们允许开发者在请求到达Servlet之前或响应返回客户端之前,拦截和处理请求/响应,或者监听应用中的事件(如会话创建、销毁等)。
综合实例
-
Servlet中的转发与重定向示例:
-
转发(Forward):
RequestDispatcher dispatcher = request.getRequestDispatcher(“/newPage.jsp”);
dispatcher.forward(request, response); -
重定向(Redirect):
response.sendRedirect(“http://www.example.com/newPage.jsp”);
-
说明:使用转发时,
newPage.jsp
页面可以访问request
中的数据,而重定向则会丢失这些数据,因为是一次新的请求。
-