引言
在 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 开发的效率和质量。