深入理解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 应用。

相关推荐
AWS官方合作商27 分钟前
AWS Bedrock:开启企业级生成式AI的钥匙【深度解析】
大数据·人工智能·aws
Flink_China1 小时前
Lalamove基于Flink实时湖仓演进之路
大数据·flink
阿里云大数据AI技术2 小时前
DataWorks智能体Agent发布!基于MCP实现数据开发与治理自动化运行
大数据·mcp
朱阿朱2 小时前
大数据Hadoop(MapReduce)
大数据·hadoop·mapreduce
炒空心菜菜2 小时前
spark数据清洗案例:流量统计
大数据·分布式·spark
用户199701080183 小时前
深入研究:京东图片搜索商品 API 详解
大数据·爬虫·数据挖掘
sunxunyong4 小时前
hive/doris查询表的创建和更新时间
数据仓库·hive·hadoop
Wnq100724 小时前
具身机器人中AI(DEEPSEEK)与PLC、驱动器协同发展研究:突破数据困境与指令精确控制(3)
大数据·人工智能·程序员·机器人·aigc·ai编程·智能电视
一个天蝎座 白勺 程序猿6 小时前
大数据(7.3)Kafka量子安全加密实践指南:构建抗量子计算攻击的消息系统
大数据·安全·kafka·量子计算
结冰架构6 小时前
【AI提示词】Emoji风格排版艺术与设计哲学
大数据·人工智能·ai·提示词