当前位置: 首页 > article >正文

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 的请求处理流程

  1. 客户端发送请求到 DispatcherServlet。

  2. DispatcherServlet 根据请求的 URL,通过 HandlerMapping 查找对应的处理器。

  3. 找到处理器后,DispatcherServlet 使用 HandlerAdapter 执行处理器。

  4. 处理器执行完成后,返回一个 ModelAndView 对象,其中包含模型数据和逻辑视图名。

  5. DispatcherServlet 根据逻辑视图名,通过 ViewResolver 解析为具体的视图实现。

  6. 视图渲染模型数据,生成最终的响应内容,返回给客户端。

五、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 开发的效率和质量。


http://www.kler.cn/a/600650.html

相关文章:

  • 《TCP/IP网络编程》学习笔记 | Chapter 22:重叠 I/O 模型
  • 基础场景-------------------(5)重载和重写的区别
  • 数据库练习
  • 笔试专题(三)
  • 思考我的未来职业
  • 力扣15.三数之和(双指针)
  • 【从零实现Json-Rpc框架】- 项目设计篇
  • ngx_conf_parse - location块
  • C# MemoryStream 中 ToArray 和 GetBuffer 的区别
  • 唯品会 unidbg 补环境 分析
  • 菜鸟的程序编程理解
  • 《大语言模型》学习笔记(四)--Transformer 模型
  • 大模型思维链COT:Chain-of-Thought Prompting Elicits Reasoningin Large Language Models
  • k8s存储介绍(二)Secret
  • 爬虫豆瓣电影
  • 国内常用各类证件照的尺寸,证件照尺寸大小汇总【免费改图网站】
  • 《Python实战进阶》第33集:PyTorch 入门-动态计算图的优势
  • 微软纳德拉最新一期访谈
  • 基于Java,SpringBoot和Vue高考志愿填报辅助系统设计
  • aab 转 apk