Java Web开发核心框架入门指南:Servlet、JSP与Spring MVC实践

一、Servlet技术体系详解

1.1 Servlet容器与请求处理机制

Servlet作为Java Web的基石组件,运行在Servlet容器(如Tomcat、Jetty)中,通过生命周期管理实现请求响应。其核心流程包含:

  • 初始化阶段:容器加载Servlet类并调用init()方法,完成资源初始化
  • 服务阶段:每个请求触发service()方法,根据HTTP方法分发至doGet()/doPost()
  • 销毁阶段:容器关闭时调用destroy()释放资源
  1. public class DemoServlet extends HttpServlet {
  2. @Override
  3. public void init() throws ServletException {
  4. // 数据库连接池初始化
  5. }
  6. @Override
  7. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  8. throws ServletException, IOException {
  9. resp.getWriter().write("Hello Servlet");
  10. }
  11. }

1.2 请求响应对象解析

  • HttpServletRequest:封装客户端请求信息,提供参数解析、头信息获取、会话管理等功能

    1. String username = req.getParameter("user"); // 获取表单参数
    2. HttpSession session = req.getSession(); // 获取会话对象
  • HttpServletResponse:控制响应内容,支持重定向、状态码设置、内容类型定义

    1. resp.setContentType("text/html;charset=UTF-8");
    2. resp.sendRedirect("/newPath"); // 302重定向

1.3 部署与配置管理

通过web.xml部署描述符实现Servlet映射:

  1. <servlet>
  2. <servlet-name>DemoServlet</servlet-name>
  3. <servlet-class>com.example.DemoServlet</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6. <servlet-name>DemoServlet</servlet-name>
  7. <url-pattern>/demo</url-pattern>
  8. </servlet-mapping>

二、会话管理技术演进

2.1 无状态协议挑战

HTTP协议的无状态特性要求开发者自行实现会话跟踪,主流方案包括:

  • URL重写:在URL中附加会话ID(兼容无Cookie环境)

    1. resp.encodeURL("/path?id=123"); // 自动添加jsessionid参数
  • 隐藏域:通过HTML表单隐藏字段传递会话标识

    1. <input type="hidden" name="sessionId" value="abc123">

2.2 Cookie机制深度解析

Cookie作为客户端存储方案,需注意:

  • 安全属性:设置SecureHttpOnlySameSite防范XSS攻击
  • 生命周期控制:通过setMaxAge()定义存活时间
  • 域路径限制setDomain()setPath()控制作用范围
  1. Cookie cookie = new Cookie("theme", "dark");
  2. cookie.setHttpOnly(true);
  3. cookie.setMaxAge(3600); // 1小时
  4. resp.addCookie(cookie);

2.3 HttpSession高级应用

服务器端会话管理的核心接口,支持:

  • 分布式会话:通过Redis等中间件实现集群环境共享
  • 属性管理:存储用户登录状态等临时数据
  • 失效策略:配置超时时间或手动失效
  1. // 存储会话数据
  2. session.setAttribute("user", userObj);
  3. // 配置会话超时(web.xml)
  4. <session-config>
  5. <session-timeout>30</session-timeout> <!-- 30分钟 -->
  6. </session-config>

三、JSP动态页面技术

3.1 JSP运行原理

JSP本质是Servlet的语法糖,首次访问时经历:

  1. 翻译阶段:生成对应的.java文件
  2. 编译阶段:编译为.class字节码
  3. 执行阶段:由Servlet容器加载运行

3.2 脚本元素与表达式

  • 脚本片段<% ... %>嵌入Java代码
  • 表达式<%= expression %>输出计算结果
  • 声明<%! ... %>定义成员变量/方法
  1. <%-- 计算阶乘示例 --%>
  2. <%!
  3. public int factorial(int n) {
  4. return n <= 1 ? 1 : n * factorial(n-1);
  5. }
  6. %>
  7. <%
  8. int num = 5;
  9. int result = factorial(num);
  10. %>
  11. <p>5! = <%= result %></p>

3.3 隐式对象与指令

九大隐式对象

  • request/response:请求响应对象
  • session:会话对象
  • out:输出流对象
  • pageContext:页面上下文(获取其他隐式对象)

核心指令

  1. <%@ page import="java.util.*" %> <%-- 导入类 --%>
  2. <%@ include file="header.jsp" %> <%-- 静态包含 --%>

四、Spring MVC架构设计

4.1 核心组件协作流程

  1. DispatcherServlet:前端控制器,统一接收请求
  2. HandlerMapping:定位具体控制器方法
  3. Controller:处理业务逻辑,返回ModelAndView
  4. ViewResolver:解析视图名称
  5. View:渲染最终响应

4.2 注解驱动开发

  1. @Controller
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @Autowired
  5. private UserService userService;
  6. @GetMapping("/{id}")
  7. public ModelAndView getUser(@PathVariable Long id) {
  8. User user = userService.findById(id);
  9. return new ModelAndView("user/detail", "user", user);
  10. }
  11. @PostMapping
  12. public String createUser(@ModelAttribute User user, BindingResult result) {
  13. if(result.hasErrors()) {
  14. return "user/form";
  15. }
  16. userService.save(user);
  17. return "redirect:/user/" + user.getId();
  18. }
  19. }

4.3 高级特性实现

  • 数据绑定:自动将请求参数映射到对象属性
  • 异常处理@ExceptionHandler统一处理控制器异常
  • 拦截器HandlerInterceptor实现权限校验等横切关注点
  • 文件上传:通过MultipartFile处理多部分请求

五、技术选型建议

  1. 传统项目:Servlet+JSP适合轻量级应用,学习成本低
  2. 现代开发:Spring MVC提供更完善的MVC实现,推荐企业级应用
  3. 性能考量:异步Servlet(Servlet 3.0+)提升并发处理能力
  4. 安全实践:所有框架均需防范XSS、CSRF等常见漏洞

本指南通过理论解析与代码示例相结合的方式,系统梳理了Java Web开发的核心技术栈。开发者可根据项目需求选择合适的技术方案,建议从Servlet基础开始逐步深入,最终掌握Spring MVC等现代框架的高级特性。