Java基础知识(十五)
1. Servlet 基本概念
Servlet 是运行在 Web 服务器或应用服务器上的 Java 程序,它是客户端请求(通常是 HTTP 请求)和服务器响应之间的中间层。
- 主要功能:处理客户端请求并生成动态响应
- 运行环境:需要 Servlet 容器(如 Tomcat、Jetty 等)
- 生命周期:由 Servlet 容器管理,而非开发者手动控制
2. Servlet 生命周期
Servlet 生命周期包含以下几个阶段:
初始化阶段:
init()
方法- 当 Servlet 第一次被请求时调用
- 用于初始化资源,只调用一次
服务阶段:
service()
方法- 每次客户端请求时调用
- 根据请求类型(GET、POST 等)调用相应的 doXXX 方法
销毁阶段:
destroy()
方法- 当 Servlet 被移除或服务器关闭时调用
- 用于释放资源
3. 实现 Servlet 的方式
方式一:实现 Servlet 接口
import javax.servlet.*;
import java.io.IOException;public class MyServlet implements Servlet {@Overridepublic void init(ServletConfig config) throws ServletException {// 初始化操作}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {// 处理请求逻辑}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {// 资源释放操作}
}
方式二:继承 GenericServlet 类
GenericServlet 实现了 Servlet 接口,提供了默认实现:
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;public class MyGenericServlet extends GenericServlet {@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {// 只需重写 service 方法}
}
方式三:继承 HttpServlet 类(最常用)
HttpServlet 继承 GenericServlet,专门用于处理 HTTP 请求:
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class MyHttpServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {// 处理 GET 请求}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {// 处理 POST 请求}
}
4. Servlet 配置方式
方式一:XML 配置(web.xml)
<web-app><servlet><servlet-name>MyServlet</servlet-name><servlet-class>com.example.MyHttpServlet</servlet-class></servlet><servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/myServlet</url-pattern></servlet-mapping>
</web-app>
方式二:注解配置(Servlet 3.0+)
import javax.servlet.annotation.WebServlet;@WebServlet("/myServlet")
public class MyHttpServlet extends HttpServlet {// 实现代码...
}
5. 请求与响应处理
获取请求信息
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {// 获取请求参数String username = req.getParameter("username");String[] hobbies = req.getParameterValues("hobby");// 获取请求方法String method = req.getMethod();// 获取请求 URIString uri = req.getRequestURI();
}
发送响应
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {// 设置响应内容类型resp.setContentType("text/html;charset=UTF-8");// 获取输出流PrintWriter out = resp.getWriter();// 发送响应内容out.println("<html>");out.println("<head><title>响应示例</title></head>");out.println("<body>");out.println("<h1>Hello, Servlet!</h1>");out.println("</body>");out.println("</html>");
}
6. 会话管理
使用 HttpSession
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {// 获取或创建会话HttpSession session = req.getSession();// 设置会话属性session.setAttribute("username", "张三");// 获取会话属性String username = (String) session.getAttribute("username");// 设置会话超时时间(秒)session.setMaxInactiveInterval(30 * 60);// 销毁会话// session.invalidate();
}
7. 请求转发与重定向
请求转发(服务器内部跳转)
// 转发到另一个 Servlet 或页面
RequestDispatcher dispatcher = req.getRequestDispatcher("/anotherServlet");
dispatcher.forward(req, resp);
重定向(客户端跳转)
// 重定向到另一个资源
resp.sendRedirect("http://example.com");
// 或相对路径
resp.sendRedirect("/anotherServlet");
8. Servlet 上下文(ServletContext)
ServletContext 代表整个 Web 应用,所有 Servlet 共享:
// 获取 ServletContext 对象
ServletContext context = getServletContext();// 设置属性
context.setAttribute("siteName", "我的网站");// 获取属性
String siteName = (String) context.getAttribute("siteName");// 获取初始化参数(在 web.xml 中配置)
String paramValue = context.getInitParameter("paramName");// 获取资源路径
String realPath = context.getRealPath("/WEB-INF/config.properties");
9. 过滤器(Filter)
过滤器用于在请求到达 Servlet 之前或响应发送到客户端之前进行处理:
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/myServlet")
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 请求处理前的逻辑System.out.println("过滤器处理前...");// 继续执行后续过滤器或Servletchain.doFilter(request, response);// 响应处理后的逻辑System.out.println("过滤器处理后...");}@Overridepublic void destroy() {// 销毁}
}
10. 监听器(Listener)
监听器用于监听 Web 应用中的事件,如 ServletContext、HttpSession、ServletRequest 的创建和销毁等。
常用监听器接口:
- ServletContextListener:监听 ServletContext 的创建和销毁
- HttpSessionListener:监听 HttpSession 的创建和销毁
- ServletRequestListener:监听 ServletRequest 的创建和销毁