JavaWeb Servlet 核心技术
一、Servlet 技术概述
- 核心定位与运行原理
Servlet 是 JavaEE 规范中处理 HTTP 请求的核心组件,通过 请求-响应模型 实现动态网页交互。其运行依赖 Web 容器(如 Tomcat),生命周期由容器管理,支持多线程处理并发请求。
!
// 典型 Servlet 类结构
@WebServlet("/demo")
public class HelloServlet extends HttpServlet {
// 初始化方法
public void init() { System.out.println("Servlet 初始化"); }
// 处理 GET 请求
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getWriter().print("<h1>Hello Servlet</h1>");
}
}
二、Servlet 生命周期详解
- 生命周期阶段
// 生命周期方法重写示例
public class LifecycleServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("---- init() executed ----");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("---- service() processing ----");
}
@Override
public void destroy() {
System.out.println("---- destroy() invoked ----");
}
}
三、Servlet 开发全流程
- 配置方式对比
XML 配置(传统方式)
<!-- web.xml 配置示例 -->
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.example.HelloServlet</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
注解配置(Servlet 3.0+)
@WebServlet(
name = "userServlet",
urlPatterns = {"/user", "/member"},
initParams = {@WebInitParam(name="maxOnline", value="1000")}
)
public class UserServlet extends HttpServlet { ... }
四、核心 API 深度解析
- HttpServletRequest 对象
// 获取请求参数与头信息
String username = req.getParameter("uname");
String userAgent = req.getHeader("User-Agent");
Part filePart = req.getPart("uploadFile"); // 文件上传处理
// 请求域属性操作
req.setAttribute("currentTime", LocalDateTime.now());
RequestDispatcher rd = req.getRequestDispatcher("/result.jsp");
rd.forward(req, resp); // 请求转发
- HttpServletResponse 对象
// 设置响应头与状态码
resp.setContentType("text/html;charset=utf-8");
resp.setHeader("Cache-Control", "no-cache");
resp.sendError(404, "页面不存在"); // 发送错误状态
// 重定向与输出流
resp.sendRedirect("https://www.example.com");
try (PrintWriter out = resp.getWriter()) {
out.println("<html><body>响应内容</body></html>");
}
五、会话管理技术
- Cookie 应用
// 创建与读取 Cookie
Cookie cookie = new Cookie("lastVisit", LocalDateTime.now().toString());
cookie.setMaxAge(60*60*24); // 有效期1天
resp.addCookie(cookie);
// 读取客户端 Cookie
Cookie[] cookies = req.getCookies();
Arrays.stream(cookies)
.filter(c -> "lastVisit".equals(c.getName()))
.findFirst()
.ifPresent(c -> System.out.println("上次访问时间:" + c.getValue()));
- Session 机制
// Session 的创建与使用
HttpSession session = req.getSession(true);
session.setAttribute("loginUser", userObj);
session.setMaxInactiveInterval(1800); // 30分钟超时
// 监听器实现会话销毁
@WebListener
public class SessionLogger implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
System.out.println("Session ID: " + se.getSession().getId());
}
}
六、过滤器与监听器
- Filter 实现请求拦截
@WebFilter(urlPatterns = "/*", initParams = @WebInitParam(name="exclusions", value="/static/"))
public class AuthFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
if (request.getSession().getAttribute("user") == null) {
resp.getWriter().write("请先登录!");
return;
}
chain.doFilter(req, resp); // 放行请求
}
}
- ServletContextListener 应用
// 容器启动时加载全局配置
@WebListener
public class AppInitializer implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
String dbUrl = sce.getServletContext().getInitParameter("jdbcUrl");
// 初始化数据库连接池
DataSource pool = DatabaseUtil.createConnectionPool(dbUrl);
sce.getServletContext().setAttribute("connectionPool", pool);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理