
1. Servlet技术概述与核心价值Servlet作为Java EE体系中的核心组件已经发展了二十余年。我至今记得第一次在Tomcat上成功运行Servlet时那种豁然开朗的感觉——原来动态网页是这么实现的。本质上Servlet就是一个用Java编写的服务器端程序它通过特定的生命周期方法处理HTTP请求并生成响应。与直接使用JSP相比Servlet更适合处理业务逻辑而JSP则专注于视图呈现这种MVC分层思想在当今前后端分离架构中依然适用。当前主流使用的是Servlet 3.0规范虽然Servlet 5.0已经发布它支持注解配置、异步处理等现代特性。在实际企业级开发中Servlet常与JDBC、连接池、Spring框架等技术栈配合使用。比如我们团队最近开发的电商促销系统就用Servlet处理了每秒上千次的优惠券核销请求。2. 开发环境准备与项目搭建2.1 基础环境配置建议使用最新稳定版的Java 8或11LTS版本搭配Apache Tomcat 9.x作为Servlet容器。我习惯用IntelliJ IDEA Ultimate版它对Java EE支持更完善# 验证Java环境 java -version javac -version # Tomcat基础目录结构 ├── bin # 启动/停止脚本 ├── conf # server.xml等重要配置 ├── webapps # 应用部署目录 └── lib # 公用库重要提示避免直接修改Tomcat的lib目录项目依赖应该通过Maven管理2.2 Maven项目初始化创建标准的webapp项目结构!-- pom.xml关键配置 -- packagingwar/packaging dependencies dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope /dependency /dependencies !-- 编译插件配置 -- build finalNamemyapp/finalName plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-war-plugin/artifactId version3.3.2/version /plugin /plugins /build项目目录结构应该符合Maven标准src ├── main │ ├── java # Servlet源代码 │ ├── resources # 配置文件 │ └── webapp # WEB-INF/web.xml │ ├── WEB-INF │ └── index.jsp3. Servlet核心实现详解3.1 基于注解的Servlet开发Servlet 3.0推荐使用注解替代web.xml配置。下面是一个处理用户登录的完整示例WebServlet( name loginServlet, urlPatterns /api/login, initParams { WebInitParam(name maxAttempts, value 3) }, loadOnStartup 1 ) public class LoginServlet extends HttpServlet { private int maxAttempts; Override public void init() throws ServletException { this.maxAttempts Integer.parseInt( getInitParameter(maxAttempts)); } Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取JSON请求体 BufferedReader reader req.getReader(); JsonObject json JsonParser.parseReader(reader).getAsJsonObject(); // 业务处理 String username json.get(username).getAsString(); String password json.get(password).getAsString(); // 模拟数据库验证 UserService userService new UserService(); boolean valid userService.validateUser(username, password); // 构建响应 resp.setContentType(application/json); resp.setCharacterEncoding(UTF-8); JsonObject responseJson new JsonObject(); if(valid) { responseJson.addProperty(status, success); // 创建会话 HttpSession session req.getSession(); session.setAttribute(user, username); } else { responseJson.addProperty(status, fail); } resp.getWriter().write(responseJson.toString()); } }3.2 请求处理关键技巧获取请求参数的几种方式表单数据request.getParameter(paramName)URL参数同样使用getParameterJSON请求体如上面示例中的JsonParser文件上传需要MultipartConfig注解响应处理的注意事项始终设置contentType和characterEncoding对于API响应建议统一使用JSON格式敏感操作需要设置适当的CORS头错误处理应该返回合适的HTTP状态码4. 高级特性与性能优化4.1 异步Servlet处理对于耗时操作如调用外部API应该使用异步处理避免线程阻塞WebServlet(urlPatterns /async, asyncSupported true) public class AsyncServlet extends HttpServlet { Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) { AsyncContext asyncCtx req.startAsync(); asyncCtx.setTimeout(3000); // 3秒超时 CompletableFuture.runAsync(() - { try { // 模拟耗时操作 Thread.sleep(2000); ServletResponse response asyncCtx.getResponse(); response.getWriter().write(Async result); } catch (Exception e) { // 错误处理 } finally { asyncCtx.complete(); } }); } }4.2 过滤器(Filter)的应用实现一个记录请求耗时的过滤器WebFilter(/*) public class TimingFilter implements Filter { Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { long start System.currentTimeMillis(); chain.doFilter(request, response); long duration System.currentTimeMillis() - start; if(request instanceof HttpServletRequest) { String path ((HttpServletRequest)request).getRequestURI(); System.out.printf(Request %s took %d ms%n, path, duration); } } }5. 常见问题排查指南5.1 典型错误与解决方案错误现象可能原因解决方案404 Not FoundURL映射错误检查WebServlet注解或web.xml配置500 Internal Error未捕获异常查看Tomcat日志中的堆栈跟踪中文乱码字符编码未设置确保request/response都设置了UTF-8获取不到POST参数未调用getReader前调用getParameter参数只能读取一次5.2 性能优化建议对象复用避免在service方法中频繁创建对象连接池数据库连接必须使用连接池如HikariCP缓存策略对静态资源设置Cache-Control头线程安全Servlet实例是单例的不要使用实例变量保存状态合理使用Session大数据对象不要放在Session中6. 现代技术栈中的Servlet定位虽然现在流行Spring Boot等框架但理解Servlet原理仍然至关重要Spring MVC底层DispatcherServlet本身就是个Servlet微服务场景轻量级服务可以直接使用ServletJetty遗留系统维护很多老系统仍基于Servlet/JSP我在实际项目中见过最巧妙的Servlet用法是用它实现了一个高性能的WebSocket代理。这充分说明只要理解核心机制Servlet依然能解决现代问题。