SpringMVC 配置与应用详解
引言
在 Java Web 开发领域,SpringMVC 框架凭借其强大的功能和灵活的配置,成为了众多开发者构建 Web 应用的首选之一。本文将深入探讨 SpringMVC 的配置过程、核心组件以及实际应用案例,帮助读者全面掌握 SpringMVC 的使用方法。
一、SpringMVC 的背景与优势
1. MVC 模式简介
MVC(Model-View-Controller)是一种软件架构模式,将应用程序分为三个基本部分:
-
Model(模型):负责处理数据和业务逻辑,通常包括实体类和业务处理类。
-
View(视图):负责与用户交互,展示数据,如 JSP、HTML 页面等。
-
Controller(控制器):负责接收用户请求,调用模型进行处理,并将结果返回给视图。
这种分层设计降低了代码的耦合度,提高了代码的可维护性和可扩展性。
2. SpringMVC 的优势
SpringMVC 是 Spring 框架的一个模块,专门用于 Web 开发。它具有以下优势:
-
松散耦合:控制器、视图和模型之间相互独立,便于维护和扩展。
-
强大的配置能力:通过 XML 配置文件或注解,可以灵活地定义控制器、视图解析器等组件。
-
支持多种视图技术:如 JSP、Thymeleaf 等。
-
内置的 MVC 组件:提供了处理器映射器、处理器适配器等组件,简化了开发流程。
二、SpringMVC 的入门案例
1. 创建 WEB 工程并引入依赖
首先,创建一个 WEB 工程,并在 pom.xml
中引入必要的依赖:
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<!-- Jackson 用于 JSON 处理 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
<!-- Spring 相关依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Servlet API -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- Thymeleaf 模板引擎 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring4</artifactId>
<version>3.0.9.RELEASE</version>
</dependency>
</dependencies>
2. 配置 DispatcherServlet
在 web.xml
中配置 SpringMVC 的前端控制器 DispatcherServlet:
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<!-- 配置字符编码过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置 DispatcherServlet -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 欢迎页 -->
<welcome-file-list>
<welcome-file>/index.html</welcome-file>
</welcome-file-list>
</web-app>
3. 配置 springmvc.xml
创建 springmvc.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">
<!-- 组件扫描 -->
<context:component-scan base-package="com.qcby.controller"/>
<!-- 视图解析器 -->
<bean id="viewResolver" class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
<property name="order" value="1"/>
<property name="characterEncoding" value="UTF-8"/>
<property name="templateEngine" ref="templateEngine"/>
</bean>
<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
<property name="templateResolver" ref="templateResolver"/>
</bean>
<bean id="templateResolver" class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver">
<property name="prefix" value="/html/"/>
<property name="suffix" value=".html"/>
<property name="templateMode" value="HTML5"/>
</bean>
<!-- 开启注解驱动 -->
<mvc:annotation-driven/>
</beans>
4. 创建 Controller 和视图
创建一个简单的 Controller:
@Controller
public class HelloController {
@RequestMapping("/hello")
public String sayHello(Model model) {
model.addAttribute("msg", "Hello, SpringMVC");
return "hello";
}
}
创建对应的视图 hello.html
:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<h1 th:text="${msg}"></h1>
</body>
</html>
预览
5. 测试
启动 Tomcat 服务器,访问 http://localhost:8080/your_project_name/hello
,即可看到页面显示 "Hello, SpringMVC"。
三、SpringMVC 的核心组件
1. 前端控制器(DispatcherServlet)
DispatcherServlet 是 SpringMVC 的核心,负责接收客户端请求,并将请求分发到相应的处理器。
2. 处理器映射器(HandlerMapping)
HandlerMapping 负责根据请求的 URL 查找对应的处理器(Controller 中的方法)。
3. 处理器适配器(HandlerAdapter)
HandlerAdapter 负责执行处理器,并返回一个 ModelAndView 对象。
4. 视图解析器(ViewResolver)
ViewResolver 根据逻辑视图名解析为具体的视图实现,如 JSP 页面、Thymeleaf 模板等。
5. 视图(View)
View 负责将模型数据通过页面展示给用户。
四、SpringMVC 的请求处理流程
-
客户端发送请求到 DispatcherServlet。
-
DispatcherServlet 根据请求的 URL,通过 HandlerMapping 查找对应的处理器。
-
找到处理器后,DispatcherServlet 使用 HandlerAdapter 执行处理器。
-
处理器执行完成后,返回一个 ModelAndView 对象,其中包含模型数据和逻辑视图名。
-
DispatcherServlet 根据逻辑视图名,通过 ViewResolver 解析为具体的视图实现。
-
视图渲染模型数据,生成最终的响应内容,返回给客户端。
五、SpringMVC 的扩展应用
1. 文件上传与下载
文件上传
@Controller
public class FileController {
@RequestMapping(value = "/upload", method = RequestMethod.POST)
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException {
String rootPath = request.getSession().getServletContext().getRealPath("WEB-INF/upload");
String originalFileName = file.getOriginalFilename();
File newFile = new File(rootPath + File.separator + originalFileName);
if (!newFile.getParentFile().exists()) {
newFile.getParentFile().mkdirs();
}
file.transferTo(newFile);
return "{\"data\":\"success\"}";
}
}
对应的上传页面 file.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="/your_project_name/upload" method="post" enctype="multipart/form-data">
选择文件: <input type="file" name="file">
<input type="submit" value="上传">
</form>
</body>
</html>
预览
文件下载
@RequestMapping("/download")
public String down(HttpServletRequest request, HttpServletResponse response) throws Exception {
String filename = request.getParameter("filename");
String filePath = request.getSession().getServletContext().getRealPath("WEB-INF/upload") + "/" + filename;
File file = new File(filePath);
if (file.exists()) {
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
response.setContentType("multipart/form-data");
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
int len;
while ((len = bis.read()) != -1) {
out.write(len);
out.flush();
}
bis.close();
out.close();
}
return null;
}
下载页面:
<form action="/your_project_name/download" method="get">
文件名: <input type="text" name="filename">
<input type="submit" value="下载">
</form>
预览
2. 数据绑定与 JSON 返回
@Controller
public class BController {
@RequestMapping("/find")
@ResponseBody
public User find() {
return new User("张三", 25, '男');
}
}
通过 @ResponseBody
注解,可以将 Java 对象直接转换为 JSON 格式返回给客户端。
六、总结
本文详细介绍了 SpringMVC 的配置过程、核心组件以及实际应用案例。通过入门案例,读者可以快速上手 SpringMVC 的基本使用;通过扩展应用,展示了 SpringMVC 在文件上传下载、数据绑定等方面的强大功能。希望本文能帮助读者更好地理解和使用 SpringMVC 框架,提升 Java Web 开发的效率和质量。