MVC快速入门 📅 2026/6/29 22:00:24 MVC英文是Model View Controller是模型(model)视图(view)控制器(controller)的缩写一种软件设计规范本质上也是一种解耦。Model模型是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。View视图是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。Controller控制器是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据控制用户输入并向模型发送数据。什么是SpringMVC而Spring Web MVC 则是一种基于Java 的实现了Web MVC 设计模式的请求驱动类型的轻量级Web 框架即使用了MVC 架构模式的思想将 web 层进行职责解耦基于请求驱动指的就是使用请求-响应模型框架的目的就是为了简化开 发Spring Web MVC 也是要简化我们日常Web 开发的。说白了Spring MVC 就是 【接收请求】【响应数据】Spring MVC 下一般把后端项目分为 Service 层处理业务、Dao 层数据库操作、Entity 层实体类、Controller 层(控制层返回数据给前台页面)。常用组件前端控制器DispatcherServlet接收用户请求给用户返回结果。处理器映射器HandlerMapping根据请求的url路径通过注解或者xml配置寻找匹配的Handler。处理器适配器HandlerAdapterHandler 的适配器调用 handler 的方法处理请求。处理器Handler执行相关的请求处理逻辑并返回相应的数据和视图信息将其封装到ModelAndView对象中。视图解析器ViewResolver将逻辑视图名解析成真正的视图View。视图View接口类实现类可支持不同的View类型JSP、FreeMarker、Excel等MVC案例基于webxml示例源码点击这里maven引入xmlproject 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/maven-v4_0_0.xsd modelVersion4.0.0/modelVersion parent groupIdcom.seven/groupId artifactIdspring-demo/artifactId version1.0-SNAPSHOT/version /parent artifactId07-spring-mvc-helloworld/artifactId packagingwar/packaging name07-spring-mvc-helloworld Maven Webapp/name urlhttp://maven.apache.org/url properties maven.compiler.source8/maven.compiler.source maven.compiler.target8/maven.compiler.target spring.version5.3.37/spring.version servlet.version4.0.1/servlet.version /properties dependencies dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version${spring.version}/version /dependency dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version${servlet.version}/version /dependency dependency groupIdjavax.servlet/groupId artifactIdjstl/artifactId version1.2/version /dependency dependency groupIdtaglibs/groupId artifactIdstandard/artifactId version1.1.2/version /dependency /dependencies build finalName07-spring-mvc-helloworld/finalName /build /project业务代码编写entity的User类javaData AllArgsConstructor public class User { private String name; private int age; }dao层javaRepository public class UserDaoImpl { public ListUser findUserList() { return Collections.singletonList(new User(seven, 18)); } }service层javaService public class UserServiceImpl { Autowired private UserDaoImpl userDao; public ListUser findUserList() { return userDao.findUserList(); } }controller层javaController public class UserController { Autowired private UserServiceImpl userService; RequestMapping(/user) public ModelAndView list(HttpServletRequest request, HttpServletResponse response) { ModelAndView modelAndView new ModelAndView(); modelAndView.addObject(dateTime, new Date()); modelAndView.addObject(userList, userService.findUserList()); modelAndView.setViewName(userList); // views目录下userList.jsp return modelAndView; } }webapp下的web.xmlxml!DOCTYPE web-app PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN http://java.sun.com/dtd/web-app_2_3.dtd 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_3_1.xsd version3.1 display-nameArchetype Created Web Application/display-name servlet servlet-namespringmvc-demo/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 load-on-startup1/load-on-startup /servlet servlet-mapping servlet-namespringmvc-demo/servlet-name url-pattern//url-pattern /servlet-mapping filter filter-nameencodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param init-param param-nameforceEncoding/param-name param-valuetrue/param-value /init-param /filter filter-mapping filter-nameencodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping /web-appspringmvc.xmlweb.xml中配置初始化参数contextConfigLocation路径是classpath:springmvc.xml因此文件直接创建在resources目录下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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd !-- 扫描注解 -- context:component-scan base-packagecom.seven.springmvchelloworld/ !-- 静态资源处理 -- mvc:default-servlet-handler/ !-- 开启SpringMVC注解 -- mvc:annotation-driven/ !-- 可以代替下边的配置实际开发中一般使用上面的方式开启注解-- !--注解映射器 -- !--bean classorg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping/-- !--注解适配器 -- !--bean classorg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter/-- !-- 视图解析器 -- bean idjspViewResolver classorg.springframework.web.servlet.view.InternalResourceViewResolver property nameviewClass valueorg.springframework.web.servlet.view.JstlView/ property nameprefix value/views// property namesuffix value.jsp/ /bean /beansJSP视图创建userList.jspjava% page contentTypetext/html;charsetUTF-8 languagejava % % taglib prefixc urihttp://java.sun.com/jsp/jstl/core % !DOCTYPE html html langzh-CN head meta charsetutf-8 meta http-equivX-UA-Compatible contentIEedge meta nameviewport contentwidthdevice-width, initial-scale1 titleUser List/title !-- Bootstrap -- link relstylesheet href//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css /head body div classcontainer c:if test${!empty userList} table classtable table-bordered table-striped tr thName/th thAge/th /tr c:forEach items${userList} varuser tr td${user.name}/td td${user.age}/td /tr /c:forEach /table /c:if /div /body /html之后就是使用tomcat部署测试了这块就不说了纯注解版无需配置xml文件依靠注解和配置类完成配置注意需要注意满足sevlet3.0规范具体源码点击这里这个不做过多讲解真实项目的用得较少。因为若是老项目就是基于webxml的若是新项目则直接上springboot了。Spring MVC响应请求直接返回ModelAndView对象ModelAndView对象将数据模型和视图信息封装在一起。javaRequestMapping(/order) public ModelAndView getOrderPage() { // 1. 创建ModelAndView对象 ModelAndView mav new ModelAndView(); // 2. 添加模型数据相当于model.addAttribute Order order orderService.getLatestOrder(); mav.addObject(currentOrder, order); mav.addObject(pageTitle, 订单详情); // 3. 设置视图名称 mav.setViewName(orderDetail); // 视图解析器会处理为完整路径 return mav; }返回视图名称页面跳转该方法返回userDetail.jsp并可以在页面上通过${user}获取数据javaController RequestMapping(/user) public class UserController { RequestMapping(/detail) public String getUserDetail(Model model) { // 模拟查询用户信息 User user userService.findUserById(1); // 将数据添加到Model中会自动存入请求域 model.addAttribute(user, user); // 返回逻辑视图名视图解析器会将其拼接为 /WEB-INF/views/userDetail.jsp return userDetail.jsp; } }使用Map传递数据该方法返回userDetail.jsp并可以在页面上通过${user}获取数据javaController RequestMapping(/user) public class UserController { RequestMapping(/detail) public String getUserDetail(MapString, User map) { // 模拟查询用户信息 User user userService.findUserById(1); // 将数据添加到Model中会自动存入请求域 map.addAttribute(user, user); // 返回逻辑视图名视图解析器会将其拼接为 /WEB-INF/views/userDetail.jsp return userDetail.jsp; } }返回void这种方式绕过了SpringMVC的视图解析提供了最大灵活性但需要自行处理响应细节与Servlet API耦合度高一般不推荐作为主要方式javaRequestMapping(/raw) public void handleRawResponse(HttpServletResponse response) throws IOException { // 设置响应类型和编码 response.setContentType(text/plain; charsetUTF-8); // 直接通过HttpServletResponse输出 PrintWriter out response.getWriter(); out.write(这是一个直接输出的响应); out.flush(); }重定向跳转redirect:会让浏览器地址栏变为新的URL。注意重定向是两次请求原始请求域request scope中的数据会丢失。若要传递参数可使用 RedirectAttributesjavaPostMapping(/submit) public String submitForm(LoginForm form) { // ... 处理表单提交逻辑如保存数据 boolean isSuccess loginService.processLogin(form); // 重定向到另一个地址防止用户刷新浏览器导致表单重复提交 return redirect:/login/success; // 浏览器会向 /login/success 发起新请求 } GetMapping(/success) public String successPage() { return success; // 展示成功页面 }