目录
4. Spring MVC @RequestMapping 注解
前言
在 Java Web 开发领域,Spring MVC 框架无疑是众多开发者的选择之一。它基于 Spring 框架,提供了强大的 MVC 架构支持,帮助开发者构建高性能、可维护的 Web 应用程序。本文将按照清晰的目录结构,带你深入了解 Spring MVC 的核心概念、功能特性以及实战应用。
1. Spring MVC 概述
Spring MVC 是 Spring 框架的一部分,专门用于构建 Web 应用程序。它遵循 MVC(Model-View-Controller)设计模式,将应用程序分为模型、视图和控制器三个部分,从而实现代码的高内聚和低耦合。
2. Spring MVC 项目搭建
搭建一个 Spring MVC 项目需要以下步骤:
创建 Maven 项目 :在 IDE 中创建一个新的 Maven 项目,并添加 Spring MVC 的依赖。
xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.10</version>
</dependency>
配置前端控制器 :在
web.xml
文件中配置DispatcherServlet
,作为前端控制器。
xml
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
配置视图解析器 :在 Spring 配置文件中配置视图解析器,指定视图文件的前缀和后缀。
xml
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
3. Spring MVC 执行流程
Spring MVC 的执行流程如下:
用户发送请求 :用户通过浏览器发送 HTTP 请求到服务器。
前端控制器接收请求 :
DispatcherServlet
接收到请求,并将其分发到合适的处理器。处理器映射器查找处理器 :
HandlerMapping
查找与请求匹配的处理器(Controller)。处理器适配器调用处理器 :
HandlerAdapter
调用处理器方法,并返回ModelAndView
对象。视图解析器解析视图 :
ViewResolver
将视图名称解析为实际的视图对象。视图渲染 :视图对象使用模型数据进行渲染,并将结果返回给用户。
4. Spring MVC @RequestMapping
注解
@RequestMapping
是 Spring MVC 中最常用的注解之一,用于将请求映射到处理器方法上。以下是一个简单的示例:
java
@Controller
public class MyController {
@RequestMapping("/hello")
public String hello() {
return "hello";
}
}
5. Spring MVC 获取请求参数
Spring MVC 提供了多种方式获取请求参数,包括:
通过方法参数获取 :直接在方法参数中声明需要的参数名称。
java
@Controller
public class MyController {
@RequestMapping("/greet")
public String greet(@RequestParam("name") String name, Model model) {
model.addAttribute("message", "Hello, " + name + "!");
return "greet";
}
}
通过
@ModelAttribute
获取 :将请求参数绑定到 Java 对象上。
java
@Controller
public class MyController {
@RequestMapping("/user")
public String getUser(@ModelAttribute("user") User user, Model model) {
model.addAttribute("user", user);
return "userDetail";
}
}
6. Spring MVC 常见注解
Spring MVC 中常用的注解包括:
@Controller
:标记一个类为控制器。@RequestMapping
:将请求映射到处理器方法上。@RequestParam
:获取请求参数。@ModelAttribute
:绑定请求参数到 Java 对象。@ResponseBody
:将方法返回值直接写入响应体。
7. Spring MVC 响应处理
Spring MVC 支持多种响应处理方式,包括:
返回字符串 :返回视图名称,由视图解析器解析为实际视图。
java
@Controller
public class MyController {
@RequestMapping("/hello")
public String hello() {
return "hello";
}
}
返回
ModelAndView
:包含模型数据和视图信息。
java
@Controller
public class MyController {
@RequestMapping("/hello")
public ModelAndView hello() {
ModelAndView modelAndView = new ModelAndView("hello");
modelAndView.addObject("message", "Hello, Spring MVC!");
return modelAndView;
}
}
返回 JSON 数据 :通过
@ResponseBody
注解返回 JSON 数据。
java
@Controller
public class MyController {
@RequestMapping("/user")
@ResponseBody
public User getUser() {
User user = new User("John", 30);
return user;
}
}
8. Spring MVC SSM 整合
SSM(Spring + Spring MVC + MyBatis)是常见的 Java Web 开发框架组合。整合步骤如下:
添加依赖 :在
pom.xml
中添加 Spring、Spring MVC 和 MyBatis 的依赖。配置数据源 :配置数据库连接信息。
xml
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
配置事务管理器 :配置事务管理器,管理数据库事务。
xml
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
配置 MyBatis :配置 MyBatis 的 SqlSessionFactory 和 Mapper。
xml
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
9. Spring MVC 作用域传参
Spring MVC 支持多种作用域传参,包括:
请求作用域(Request Scope) :默认作用域,参数在请求范围内有效。
会话作用域(Session Scope) :参数在会话范围内有效。
java
@Controller
public class MyController {
@RequestMapping("/login")
public String login(@RequestParam("username") String username, HttpSession session) {
session.setAttribute("user", username);
return "home";
}
}
应用作用域(Application Scope) :参数在应用范围内有效。
10. Spring MVC 上传
Spring MVC 提供了简单的文件上传功能,通过 @RequestParam
注解获取上传的文件对象。
java
@Controller
public class FileController {
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
try {
file.transferTo(new File("path/to/save/" + file.getOriginalFilename()));
} catch (IOException e) {
e.printStackTrace();
}
return "uploadSuccess";
}
}
11. Spring MVC 下载
Spring MVC 也支持文件下载功能,通过设置响应头和输出流实现。
java
@Controller
public class FileController {
@GetMapping("/download")
public void download(HttpServletResponse response) {
File file = new File("path/to/download/file.txt");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=file.txt");
try (FileInputStream fis = new FileInputStream(file);
OutputStream os = response.getOutputStream()) {
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
os.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
12. Spring MVC 拦截器
Spring MVC 支持拦截器,用于在请求处理的不同阶段执行特定逻辑。以下是一个简单的拦截器示例:
java
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Pre Handle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("Post Handle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("After Completion");
}
}
注册拦截器:
xml
<bean class="org.springframework.web.servlet.HandlerInterceptorAdapter">
<property name="interceptors">
<list>
<ref bean="myInterceptor"/>
</list>
</property>
</bean>
13. Spring MVC 异常处理
Spring MVC 提供了全局异常处理器,通过 @ControllerAdvice
注解实现。
java
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ModelAndView handleException(Exception e) {
ModelAndView modelAndView = new ModelAndView("error");
modelAndView.addObject("message", e.getMessage());
return modelAndView;
}
}
14. Spring MVC 其他注解
Spring MVC 还提供了其他一些有用的注解,如:
@InitBinder
:用于初始化数据绑定。
java
@Controller
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setFieldDefaultPrefix("user.");
}
}
@SessionAttributes
:用于将模型属性添加到会话中。
java
@Controller
@SessionAttributes("user")
public class MyController {
// ...
}
总结
Spring MVC 作为 Spring 框架的重要组成部分,提供了强大的 Web 开发能力。通过学习 Spring MVC 的核心概念和功能特性,结合实战应用,可以快速构建高性能、可维护的 Web 应用程序。希望本文能够帮助你深入理解 Spring MVC 的精髓,为你的开发工作提供有力支持。如果你有任何问题或建议,欢迎在评论区留言,我们一起交流学习!