深入理解SpringMVC:数据处理、文件上传与异常处理等常见技术应用及解决方案
目录
前言
第一章:数据处理与跳转
1. 结果跳转方式
2. 使用 @ResponseBody 返回 JSON 数据
3. 配置静态资源不被拦截
第二章:SpringMVC 实现文件上传
1. 导入文件上传的依赖
2. 配置文件上传解析器
3. 文件上传示例
第三章:SpringMVC 的异常处理
1. 异常处理思路
2. 局部异常处理
3. 全局异常处理
前言
SpringMVC 是一种非常流行的 Web 应用框架,广泛用于构建基于 Java 的 Web 应用程序。在这篇博客中,我们将详细讲解 SpringMVC 中的几种常见技术应用及解决方案,包括页面跳转、响应 JSON 数据、文件上传、异常处理等。
第一章:数据处理与跳转
1. 结果跳转方式
在 SpringMVC 中,我们有多种方式来处理页面跳转,下面介绍几种常见的方式。
① 使用 ModelAndView
对象跳转
通过 ModelAndView
对象可以将数据和视图绑定,然后返回给客户端。下面是一个简单的例子:
@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 来进行页面跳转。常用的跳转方式有输出响应、重定向和转发。
@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
类型的视图名。
@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 之间的转换:
<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>
示例代码
@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 响应:
<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
拦截。
<mvc:resources mapping="/css/**" location="/css/"/> <!-- 样式 -->
<mvc:resources mapping="/images/**" location="/images/"/> <!-- 图片 -->
<mvc:resources mapping="/js/**" location="/js/"/> <!-- JavaScript -->
第二章:SpringMVC 实现文件上传
1. 导入文件上传的依赖
为了支持文件上传,需要添加 commons-fileupload
和 commons-io
依赖:
<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
来处理文件上传。
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="8388608" /> <!-- 最大文件上传大小 8MB -->
</bean>
3. 文件上传示例
在 Controller 中处理文件上传:
@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 中的异常处理分为两种方式:
- 局部异常处理:在 Controller 中捕获异常并处理。
- 全局异常处理:使用
HandlerExceptionResolver
统一处理异常。
2. 局部异常处理
@RequestMapping("/findAll")
public String findAll(Model model) {
try {
int a = 10 / 0; // 模拟异常
} catch (Exception e) {
model.addAttribute("errorMsg", "系统正在维护,请联系管理员");
return "404";
}
return "suc";
}
404
页面如下:
<!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. 全局异常处理
为了实现全局异常处理,可以自定义异常类和异常处理器。
自定义异常类
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 + '\'' + '}';
}
}
自定义异常处理器
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;
}
}
配置异常处理器:
<bean id="sysExceptionResolver" class="com.qcby.conf.SysExceptionResolver" />
结语
SpringMVC 提供了灵活的页面跳转、数据交互、文件上传以及异常处理机制,可以帮助开发者轻松处理常见的 Web 开发问题。在开发过程中,理解并熟练应用这些基本功能,能够让你更高效地开发出稳定且功能丰富的 Web 应用。