
前言在 Java EE 开发中Servlet 作为传统的控制层实现方式存在诸多缺陷而 SpringMVC 作为 Spring 框架的核心模块之一是基于 MVC 设计模式的轻量级 Web 开发框架现已成为企业级项目表述层开发的首选方案。本文将从 SpringMVC 概述、环境搭建、核心注解、参数处理、数据传递到 JSON 交互全方位讲解 SpringMVC 入门核心知识点。一、SpringMVC 概述1.1 为什么选择 SpringMVC先看传统 Servlet 的实现案例WebServlet(/addUser) public class AddUserServlet extends HttpServlet { private UserService userService new UserServiceImpl(); Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 手动接收所有参数繁琐且易出错 String username req.getParameter(username); String password req.getParameter(password); String sex req.getParameter(sex); Integer age Integer.parseInt(req.getParameter(age)); String address req.getParameter(address); userService.addUser(username, password, sex, age, address); resp.sendRedirect(selectUser); } }Servlet 的核心缺陷一个 Servlet 实例只能处理一个请求导致类爆炸参数接收需手动解析类型转换繁琐如 String 转 Integer代码耦合度高不利于维护和扩展1.2 MVC 设计模式MVC 将软件分为三层各司其职层级说明具体实现Model模型层处理数据数据承载 BeanUser/Student、业务处理 BeanService/DaoView视图层交互展示HTML/JSP 页面Controller控制层接收请求 / 响应浏览器Servlet/SpringMVC 的 ControllerMVC 工作流程用户通过视图层发送请求 → 控制器接收请求 → 调用模型层处理数据 → 模型层返回结果给控制器 → 控制器渲染视图 → 响应给浏览器1.3 SpringMVC 核心定位SpringMVC 本质上等价于 Servlet是 Spring 为控制层提供的完整解决方案对比 Struts2 等框架SpringMVC 具有轻量、高效、易整合 Spring 生态的优势是当前 Java EE 项目表述层开发的首选框架二、SpringMVC 入门环境搭建2.1 工程创建IDEA创建 Maven 工程选择maven-archetype-webapp或普通 Maven 工程后添加 Web 支持右键项目 →Add Framework Support→ 勾选Web Application将生成的web目录拖拽到main下并重命名为webapp关键2.2 核心依赖pom.xml?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.hg/groupId artifactIdSpringMVC_day01/artifactId version1.0-SNAPSHOT/version packagingwar/packaging dependencies !-- Spring核心依赖 -- dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version5.2.8.RELEASE/version /dependency !-- SpringMVC核心依赖 -- dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version5.2.8.RELEASE/version /dependency !-- Servlet依赖仅编译时有效 -- dependency groupIdjavax.servlet/groupId artifactIdservlet-api/artifactId version2.5/version scopeprovided/scope /dependency /dependencies build !-- Tomcat插件配置 -- plugins plugin groupIdorg.apache.tomcat.maven/groupId artifactIdtomcat7-maven-plugin/artifactId version2.2/version configuration port8080/port path//path !-- 解决GET请求中文乱码 -- uriEncodingUTF-8/uriEncoding /configuration /plugin /plugins /build /project2.3 入门案例核心代码1前端页面index.jsp% page contentTypetext/html;charsetUTF-8 languagejava % html head titleSpringMVC入门/title /head body a href/helloHello SpringMVC/a /body /html2控制器HelloController.javaimport org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; // 交给Spring容器管理 Controller public class HelloController { // 建立请求URL与方法的映射关系 RequestMapping(/hello) public ModelAndView hello() { // 封装模型数据和视图信息 ModelAndView mv new ModelAndView(); // 等价于request.setAttribute(hello, 欢迎你 springmvc!!) mv.addObject(hello, 欢迎你 springmvc!!); // 设置逻辑视图名由视图解析器拼接物理路径 mv.setViewName(success); return mv; } }3SpringMVC 配置文件springmvc.xml?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/context xmlns:mvchttp://www.springframework.org/schema/mvc xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd !-- 扫描指定包下的注解如Controller -- context:component-scan base-packagecom.hg/context:component-scan !-- 配置视图解析器拼接逻辑视图名 -- bean classorg.springframework.web.servlet.view.InternalResourceViewResolver !-- 前缀视图文件所在目录 -- property nameprefix value/WEB-INF/pages//property !-- 后缀视图文件扩展名 -- property namesuffix value.jsp/property /bean !-- 开启SpringMVC注解支持自动配置HandlerMapping/HandlerAdapter -- mvc:annotation-driven/mvc:annotation-driven /beans4视图页面success.jsp% page contentTypetext/html;charsetUTF-8 languagejava % html head title成功页/title /head body h2${hello}/h2 /body /html5Web 配置文件web.xml?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd version4.0 !-- 配置SpringMVC前端控制器 -- servlet servlet-namespringmvc/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class !-- 指定SpringMVC配置文件位置 -- init-param param-namecontextConfigLocation/param-name param-valueclasspath:springmvc.xml/param-value /init-param !-- 容器启动时立即加载Servlet优先级1 -- load-on-startup1/load-on-startup /servlet !-- 映射所有请求/ 不包含.jsp/* 包含所有 -- servlet-mapping servlet-namespringmvc/servlet-name url-pattern//url-pattern /servlet-mapping !-- 解决POST请求中文乱码过滤器 -- filter filter-nameCharacterEncodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-nameCharacterEncodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping /web-app2.4 测试访问启动 Tomcat访问http://localhost:8080/hello页面显示欢迎你 springmvc!!即为成功。三、SpringMVC 核心组件与执行流程3.1 核心组件组件核心作用DispatcherServlet前端控制器流程控制中心协调所有组件HandlerMapping处理器映射器根据请求 URL 查找对应的 HandlerHandlerAdapter处理器适配器适配并执行 Handler适配器模式ViewResolver视图解析器将逻辑视图名解析为物理视图地址View视图渲染模型数据响应浏览器3.2 完整执行流程用户发起请求到 DispatcherServletDispatcherServlet 请求 HandlerMapping 查找 HandlerHandlerMapping 返回 HandlerExecutionChain包含 Handler 拦截器DispatcherServlet 通过 HandlerAdapter 执行 HandlerHandler 执行完成返回 ModelAndViewDispatcherServlet 请求 ViewResolver 解析视图ViewResolver 返回 View 对象DispatcherServlet 渲染 View将 Model 数据放入 requestDispatcherServlet 响应结果给用户四、RequestMapping 注解详解4.1 核心作用建立请求 URL 与控制器方法的映射关系可作用于类或方法。4.2 窄化路径类级别Controller RequestMapping(/account) // 第一级路径 public class AccountController { RequestMapping(/findAccount) // 第二级路径 public ModelAndView findAccount() { ModelAndView mv new ModelAndView(); mv.addObject(msg, 窄化路径测试); mv.setViewName(success); return mv; } }访问路径http://localhost:8080/account/findAccount4.3 指定请求方式method 属性RequestMapping(value /findAccount1, method RequestMethod.POST) public ModelAndView findAccount1() { ModelAndView mv new ModelAndView(); mv.addObject(msg, POST请求测试); mv.setViewName(success); return mv; }仅允许 POST 请求访问GET 请求会返回 405 错误可同时指定多个请求方式method {RequestMethod.GET, RequestMethod.POST}五、Controller 方法返回值类型5.1 返回 ModelAndView最基础方式封装模型数据和视图名如入门案例。5.2 返回字符串1逻辑视图名RequestMapping(/findAccount2) public String findAccount2(Model model) { model.addAttribute(msg, 返回字符串视图名); return success; // 逻辑视图名由视图解析器拼接路径 }2重定向RedirectRequestMapping(/findAccount3) public String findAccount3() { // 重定向到另一个方法浏览器地址栏变化新请求 return redirect:/account/findAccount4; } RequestMapping(/findAccount4) public String findAccount4(Model model) { model.addAttribute(msg, 重定向测试); return success; }3转发ForwardRequestMapping(/findAccount3) public String findAccount3() { // 转发到另一个方法地址栏不变共用request return forward:/account/findAccount4; }六、参数接收全攻略6.1 基本数据类型RequestMapping(/findAccount5) public String findAccount5(String username, Integer age, Model model) { model.addAttribute(msg, 用户名 username 年龄 age); return success; }访问路径http://localhost:8080/account/findAccount5?usernameericage226.2 POJO 类型参数绑定1定义 POJOpublic class Account implements Serializable { private Integer id; private String name; private Float money; private String pwd; private String address; // getter/setter/toString }2接收参数RequestMapping(/saveAccount) public String saveAccount(Account account, Model model) { model.addAttribute(msg, account.toString()); return success; }3前端表单form actionaccount/saveAccount methodpost 账户名称input typetext namenamebr/ 账户金额input typetext namemoneybr/ 账户密码input typetext namepwdbr/ 账户地址input typetext nameaddressbr/ input typesubmit value保存 /form6.3 RESTful 风格传参PathVariable1RESTful 核心思想URL 定位资源HTTP 动词GET/POST/PUT/DELETE描述操作传统 URLRESTful URL请求方式操作/user/query?id1/user/1GET查询/user/save/userPOST新增/user/update/userPUT修改/user/delete?id1/user/1DELETE删除2代码实现RequestMapping(/findAccount7/{id}) public String findAccount7(PathVariable Integer id, Model model) { model.addAttribute(msg, RESTful传参 id); return success; }访问路径http://localhost:8080/account/findAccount7/123