深入理解SpringMVC:数据处理、文件上传与异常处理等常见技术应用及解决方案

目录

前言

第一章:数据处理与跳转

[1. 结果跳转方式](#1. 结果跳转方式)

[2. 使用 @ResponseBody 返回 JSON 数据](#2. 使用 @ResponseBody 返回 JSON 数据)

[3. 配置静态资源不被拦截](#3. 配置静态资源不被拦截)

[第二章:SpringMVC 实现文件上传](#第二章:SpringMVC 实现文件上传)

[1. 导入文件上传的依赖](#1. 导入文件上传的依赖)

[2. 配置文件上传解析器](#2. 配置文件上传解析器)

[3. 文件上传示例](#3. 文件上传示例)

[第三章:SpringMVC 的异常处理](#第三章:SpringMVC 的异常处理)

[1. 异常处理思路](#1. 异常处理思路)

[2. 局部异常处理](#2. 局部异常处理)

[3. 全局异常处理](#3. 全局异常处理)


前言

SpringMVC 是一种非常流行的 Web 应用框架,广泛用于构建基于 Java 的 Web 应用程序。在这篇博客中,我们将详细讲解 SpringMVC 中的几种常见技术应用及解决方案,包括页面跳转、响应 JSON 数据、文件上传、异常处理等。

第一章:数据处理与跳转

1. 结果跳转方式

在 SpringMVC 中,我们有多种方式来处理页面跳转,下面介绍几种常见的方式。

① 使用 ModelAndView 对象跳转

通过 ModelAndView 对象可以将数据和视图绑定,然后返回给客户端。下面是一个简单的例子:

java 复制代码
@Controller
public class UserController {
    
    @RequestMapping("/save3")
    public ModelAndView save3() {
        System.out.println("执行了...");
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "用户名或者密码已经存在");
        mv.setViewName("suc");
        return mv;
    }
}

这里我们通过 mv.addObject() 向视图传递数据,然后通过 mv.setViewName() 设置跳转的视图。

② 使用 Servlet API 跳转

除了通过 SpringMVC 的方式跳转外,我们还可以直接使用原生的 Servlet API 来进行页面跳转。常用的跳转方式有输出响应、重定向和转发。

java 复制代码
@Controller
@RequestMapping("/role")
public class RoleController {

    @RequestMapping("/t1")
    public void test1(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
        rsp.getWriter().println("Hello,Spring BY servlet API");
    }

    @RequestMapping("/t2")
    public void test2(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
        rsp.sendRedirect("/SpringMVCDemo/html/suc.html");
    }

    @RequestMapping("/t3")
    public void test3(HttpServletRequest req, HttpServletResponse rsp) throws Exception {
        req.setAttribute("msg", "hello");
        req.getRequestDispatcher("/html/suc.html").forward(req, rsp);
    }
}
③ 使用 SpringMVC 的跳转方式

SpringMVC 也提供了更为简洁的方式来进行页面的跳转,主要通过返回 String 类型的视图名。

java 复制代码
@Controller
@RequestMapping("/role")
public class RoleController {

    @RequestMapping("/t1")
    public String test1() {
        return "/html/suc.html"; // 简单的页面跳转
    }

    @RequestMapping("/t2")
    public String test2() {
        return "forward:/html/suc.html"; // 转发
    }

    @RequestMapping("/t3")
    public String test3() {
        return "redirect:/html/suc.html"; // 重定向
    }
}

2. 使用 @ResponseBody 返回 JSON 数据

如果要返回 JSON 数据,可以使用 @ResponseBody 注解,该注解会自动将返回对象转换为 JSON 格式。

配置 jackson 依赖

首先需要引入 jackson 依赖库来支持对象和 JSON 之间的转换:

XML 复制代码
<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>
示例代码
java 复制代码
@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/save6")
    public @ResponseBody User save6(User user) {
        System.out.println(user);
        user.setUsername("hello");
        user.setAge(100);
        return user;
    }
}

在前端,您可以使用 AJAX 进行异步请求并处理 JSON 响应:

javascript 复制代码
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script>
    $(function(){
        $("#btn").click(function(){
            $.ajax({
                type: "post",
                url: "/SpringMVCDemo/user/save6",
                data: {username: "haha", age: "20"},
                success: function(d) {
                    alert(d.username + " ‐ " + d.age);
                }
            });
        });
    });
</script>

3. 配置静态资源不被拦截

SpringMVC 的 DispatcherServlet 会拦截所有请求,导致静态资源(如图片、CSS、JS)也被拦截。为了解决这个问题,我们可以配置静态资源路径,使其不被 DispatcherServlet 拦截。

XML 复制代码
<mvc:resources mapping="/css/**" location="/css/"/> <!-- 样式 -->
<mvc:resources mapping="/images/**" location="/images/"/> <!-- 图片 -->
<mvc:resources mapping="/js/**" location="/js/"/> <!-- JavaScript -->

第二章:SpringMVC 实现文件上传

1. 导入文件上传的依赖

为了支持文件上传,需要添加 commons-fileuploadcommons-io 依赖:

XML 复制代码
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

2. 配置文件上传解析器

SpringMVC 配置文件中配置 CommonsMultipartResolver 来处理文件上传。

XML 复制代码
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="8388608" /> <!-- 最大文件上传大小 8MB -->
</bean>

3. 文件上传示例

在 Controller 中处理文件上传:

java 复制代码
@Controller
@RequestMapping("/file")
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\"}";
    }
}

第三章:SpringMVC 的异常处理

1. 异常处理思路

SpringMVC 中的异常处理分为两种方式:

  1. 局部异常处理:在 Controller 中捕获异常并处理。
  2. 全局异常处理 :使用 HandlerExceptionResolver 统一处理异常。

2. 局部异常处理

java 复制代码
@RequestMapping("/findAll")
public String findAll(Model model) {
    try {
        int a = 10 / 0;  // 模拟异常
    } catch (Exception e) {
        model.addAttribute("errorMsg", "系统正在维护,请联系管理员");
        return "404";
    }
    return "suc";
}

404 页面如下:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>错误提示页面</title>
</head>
<body>
<h1>404 <b th:text="${errorMsg}"></b></h1>
</body>
</html>

3. 全局异常处理

为了实现全局异常处理,可以自定义异常类和异常处理器。

自定义异常类
java 复制代码
public class SysException extends Exception {
    private String message;

    public SysException(String message) {
        this.message = message;
    }

    @Override
    public String getMessage() {
        return message;
    }

    @Override
    public String toString() {
        return "SysException{" + "message='" + message + '\'' + '}';
    }
}
自定义异常处理器
java 复制代码
public class SysExceptionResolver implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        SysException exception = (ex instanceof SysException) ? (SysException) ex : new SysException("系统正在维护,请联系管理员");
        ModelAndView mv = new ModelAndView();
        mv.addObject("errorMsg", exception.getMessage());
        mv.setViewName("404");
        return mv;
    }
}

配置异常处理器:

XML 复制代码
<bean id="sysExceptionResolver" class="com.qcby.conf.SysExceptionResolver" />

结语

SpringMVC 提供了灵活的页面跳转、数据交互、文件上传以及异常处理机制,可以帮助开发者轻松处理常见的 Web 开发问题。在开发过程中,理解并熟练应用这些基本功能,能够让你更高效地开发出稳定且功能丰富的 Web 应用。

相关推荐
jonyleek4 小时前
「JVS更新日志」生产计划排程系统APS已上线!以及智能BI、低代码、规则引擎2.6更新说明
java·大数据·低代码·数据分析·软件需求
大厂在职_Xbg4 小时前
Git Command(待更新)
大数据·git·elasticsearch
抛砖者5 小时前
04. Flink的状态管理与容错机制
大数据·flink
Data-Miner5 小时前
精品PPT | 企业大数据治理平台统一指标库建设方案
大数据
SeaTunnel5 小时前
Apache SeaTunnel 整体架构运行原理
大数据
WHYBIGDATA6 小时前
Hive之数据操作DML
大数据·hive·hadoop
云上的阿七6 小时前
Elasticsearch集群模式保姆级教程
大数据·elasticsearch
数据智能老司机7 小时前
使用 Databricks Lakehouse 构建现代数据应用程序——使用 Delta Live Tables 应用数据转换
大数据·架构·数据分析
数据智能老司机7 小时前
使用 Databricks Lakehouse 构建现代数据应用程序——使用 Delta Live Tables 管理数据质量
大数据·架构·数据分析