1. MVC模式是什么
MVC(Model-View-Controller)是一种设计模式,将应用程序分为三部分:
- Model(模型):管理应用的数据和业务逻辑
- View(视图):负责数据展示
- Controller(控制器):处理用户输入,调用模型和视图
2. 搭建SpringMVC环境
配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载配置文件springmvc-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
配置springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://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">
<!-- 定义控制器-->
<!-- 定义扫包后要注释掉否则会冲突-->
<!-- <bean name="/hello" class="com.ktjy.controller.HelloController"/>-->
<!-- 开启注解驱动-->
<mvc:annotation-driven/>
<!-- 扫包-->
<context:component-scan base-package="com.ktjy.controller"/>
<!-- 视图对应-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
(2) 使用注解开发SpringMVC框架
定义控制器HelloController
@Controller
@RequestMapping(value = "/hello")
public class HelloController {
Logger logger = Logger.getLogger(HelloController.class);
@RequestMapping(value = "/hello")
public ModelAndView hello(@RequestParam String realName) throws Exception {
logger.info("你好【"+realName+"】欢迎来到SpringMVC课堂");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("realName",realName);
modelAndView.setViewName("hello");
return modelAndView;
}
}
(3) SpringMVC框架梳理
DispatcherServlet
作为前端控制器,分发请求- 使用注解如
@Controller
和@RequestMapping
定义控制器和请求映射 - 视图解析器(如
InternalResourceViewResolver
)用于解析视图名称
SpringMVC工作流程
-
客户端请求发送到服务器
- 客户端(如浏览器)发送HTTP请求到服务器
-
DispatcherServlet拦截请求
- 服务器将请求传递给
DispatcherServlet
,这是SpringMVC的前端控制器DispatcherServlet
由web.xml
中配置的URL模式映射
- 服务器将请求传递给
-
请求处理器映射
DispatcherServlet
使用HandlerMapping
接口查找请求的具体处理器(即控制器)HandlerMapping
根据请求的URL找到相应的控制器和方法
-
调用处理器(控制器)
- 一旦找到处理器,
DispatcherServlet
将请求转发给相应的控制器方法 - 控制器方法通常通过注解
@RequestMapping
等来映射请求。控制器处理请求并生成模型数据
- 一旦找到处理器,
-
模型数据与视图名返回
- 控制器处理完成后返回
ModelAndView
对象或视图名字符串 ModelAndView
包含视图名和模型数据。视图名是逻辑视图名,如"hello"
- 控制器处理完成后返回
-
视图解析
DispatcherServlet
使用ViewResolver
接口解析逻辑视图名为具体的视图对象(如JSP、Thymeleaf模板)ViewResolver
根据配置找到视图文件(如hello.jsp
)
-
渲染视图
- 视图对象负责将模型数据渲染为HTML内容。渲染的视图是服务器生成的HTML页面
-
生成HTTP响应
- 渲染完成后,视图生成的内容(通常是HTML)作为HTTP响应体发送回客户端
-
客户端显示结果
- 客户端接收到HTTP响应,浏览器解析并展示结果页面
前后端数据交互
SpringMVC提供了丰富的机制来处理客户端和服务器之间的数据交互,包括请求参数绑定、请求处理、以及数据响应
1. 请求参数绑定
-
@RequestParam
- 用于将请求中的参数绑定到控制器方法的参数上。可以指定参数名称和是否为必需参数
-
@Controller public class HelloController { @RequestMapping("/hello") public String handleRequest(@RequestParam(name = "name", required = false, defaultValue = "Guest") String name, Model model) { model.addAttribute("name", name); return "hello"; } }
-
@PathVariable
- 用于绑定URL路径中的变量部分到控制器方法的参数
@Controller
public class ProductController {
@RequestMapping("/product/{id}")
public String getProduct(@PathVariable("id") int productId, Model model) {
// 根据 productId 获取产品信息
model.addAttribute("product", productService.getProductById(productId));
return "product";
}
}
URL如/product/123
会将路径中的123
绑定到方法参数productId
-
@RequestBody
- 用于将请求体中的内容绑定到方法参数(通常用于接收JSON数据)
@Controller
public class UserController {
@RequestMapping(value = "/user", method = RequestMethod.POST)
@ResponseBody
public User createUser(@RequestBody User user) {
// 处理用户数据
return userService.save(user);
}
}
请求体包含的JSON数据会自动映射到User
对象中
2. 响应数据处理
-
返回视图名
- 控制器方法通常返回一个视图名,SpringMVC会使用视图解析器将视图名映射为实际的视图(如JSP页面)
@Controller
public class HomeController {
@RequestMapping("/home")
public String home() {
return "homeView";
}
}
这里返回的"homeView"
会被视图解析器处理
-
@ResponseBody
- 用于直接将方法返回值作为HTTP响应体发送给客户端,适用于返回JSON或XML等数据格式
@Controller
public class UserController {
@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
@ResponseBody
public User getUser(@PathVariable("id") int id) {
return userService.getUserById(id);
}
}
返回的User
对象会自动转换为JSON格式
视图解析器
视图解析器负责将控制器返回的逻辑视图名(通常是字符串)解析为具体的视图对象(如JSP、Thymeleaf模板等),然后通过这些视图对象来渲染数据
1. 常见的视图解析器
-
InternalResourceViewResolver
- 用于解析JSP视图。它将逻辑视图名与实际的JSP文件路径进行映射
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
这意味着逻辑视图名home
将被解析为/WEB-INF/views/home.jsp
-
ThymeleafViewResolver
- 用于解析Thymeleaf模板。适合需要复杂页面布局和动态内容的应用。
@Bean
public ThymeleafViewResolver viewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine());
resolver.setCharacterEncoding("UTF-8");
resolver.setOrder(1);
return resolver;
}
-
其他视图解析器
- 包括
FreeMarkerViewResolver
、VelocityViewResolver
等,支持不同的模板引擎。
- 包括
2. 工作原理
当控制器方法返回一个逻辑视图名时,DispatcherServlet
会使用视图解析器根据视图名查找并渲染视图。视图解析器的主要任务是拼接视图路径和扩展名,并找到合适的视图资源来展示数据
例如,InternalResourceViewResolver
会将逻辑视图名"home"
映射到"/WEB-INF/views/home.jsp"
,然后将模型数据传递给JSP页面进行渲染