1.SpringMVC方式文件上传
SpringMVC框架提供了MultipartFile对象,该对象表示上传的文件,要求变量名称必须和表单file标签的 name属性名称相同。
1.1在pom.xml文件中导入依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
1.2在springmvc.xml中配置文件解析器,id 名称必须为:multipartResolver
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10240000"></property>
</bean>
1.3创建html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post" enctype="multipart/form-data" action="student/upload">
<input type="file" name="file"><br>
<input type="submit" value="上传">
</form>
</body>
</html>
1.4测试(controller类)
package com.coffee.control;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
@Controller
@RequestMapping("student")
public class Control {
@RequestMapping("upload")
public String upload(MultipartFile file, Model model){
String originalFilename = file.getOriginalFilename();
System.out.println("老名字为:"+originalFilename);
originalFilename = UUID.randomUUID().toString().replace("-","")+originalFilename;
System.out.println("新名字为:"+originalFilename);
// 上传路径 我上传到另一个tomcat服务器上了 所以上传后运行两个服务器打开网页可以进行访问
String path = "D:\\apache-tomcat-8.5.31\\webapps\\imgs\\";
try {
// 上传
file.transferTo(new File(path,originalFilename));
} catch (IOException e) {
e.printStackTrace();
}
model.addAttribute("originalFilename",originalFilename);
return "/main.jsp";
}
}
<%--
Created by IntelliJ IDEA.
User: 86156
Date: 2021/10/20
Time: 10:17
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--我自己另一个tomcat的端口号为9999--%>
<img src="http://localhost:9999/imgs/${originalFilename}">
</body>
</html>
点击上传后就跳转到图片所在的路径啦(前提是打开你上传的另一个tomcat服务器)

2.SpringMVC的异常处理
Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进行异常的处理。
2.1创建自定义异常类
package com.coffee.exception;
public class Myexception extends Exception{
public Myexception(String message){
super(message);
}
}
2.2创建异常处理器类
package com.coffee.exception;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException
(javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response,
Object handler,
Exception ex) {
// new 一个modelAndView 用来传递信息和跳转页面
ModelAndView modelAndView = new ModelAndView();
// if - else 语句来判断异常属于社么
if (ex instanceof NullPointerException){
modelAndView.addObject("message","空指针异常");
}else if (ex instanceof Myexception){
modelAndView.addObject("message","自定义异常");
}else {
modelAndView.addObject("message","其他异常");
}
// 跳转到另一个页面
modelAndView.setViewName("/error");
return modelAndView;
}
}
2.3在springmvc.xml中配置并写创建一个显示错误的页面 error.jsp
<!--配置异常处理器-->
<bean id="myExceptionResolver" class="com.qf.exception.MyExceptionResolver"/>
<%--
Created by IntelliJ IDEA.
User: 86156
Date: 2021/10/20
Time: 11:33
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
错误页面
<br>
${message}
</body>
</html>
2.4测试
package com.coffee.control;
import com.coffee.exception.Myexception;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
@Controller
@RequestMapping("student")
public class MyTest {
@RequestMapping("upload")
public String upload(MultipartFile file, Model model) throws Myexception {
System.out.println("方法执行了。。。。");
// 自己写一个空指针异常
// String s = null;
// int length = s.length();
// 自己写一个自定义异常
// throw new Myexception("我的异常");
//其他异常
int i=1/0;
return null;
}
}



3.SpringMVC框架中的拦截器
拦截器的概述 SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。 可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。
拦截器和过滤器的功能比较类似,有以下区别:
过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。 拦截器是SpringMVC框架独有的。
过滤器配置了/*,可以拦截任何资源。 拦截器只会对控制器中的方法进行拦截。
拦截器也是AOP思想的一种实现方式 想要自定义拦截器,需要实现HandlerInterceptor接口。
3.1创建自定义拦截器
package com.coffee.intercepter;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyIntercepter implements HandlerInterceptor {
/**
* 预处理,controller方法执行前
* return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
* return false 不放行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("我是预处理方法preHandle");
return true;
}
//后处理方法,controller方法执行后,success.jsp执行之前
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("我是后处理方法postHandle");
}
//jsp页面执行后,该方法会执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("我是在jsp页面执行后执行的方法afterCompletion");
}
}
3.2在springmvc.xml中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/student/upload"/>
<!-- 配置拦截器的-->
<bean id="myIntercepter" class="com.coffee.intercepter.MyIntercepter"></bean>
</mvc:interceptor>
</mvc:interceptors>
3.3测试
package com.coffee.control;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
@Controller
@RequestMapping("student")
public class Control {
@RequestMapping("upload")
public String upload(MultipartFile file, Model model){
String originalFilename = file.getOriginalFilename();
// System.out.println("老名字为:"+originalFilename);
originalFilename = UUID.randomUUID().toString().replace("-","")+originalFilename;
// System.out.println("新名字为:"+originalFilename);
// 上传路径
String path = "D:\\apache-tomcat-8.5.31\\webapps\\imgs\\";
try {
// 上传
file.transferTo(new File(path,originalFilename));
} catch (IOException e) {
e.printStackTrace();
}
model.addAttribute("originalFilename",originalFilename);
return "/main.jsp";
}
}

本文介绍了如何在SpringMVC中实现文件上传,配置了文件解析器并创建了HTML表单。同时展示了异常处理机制,包括自定义异常类和异常处理器,以及在发生异常时跳转到错误页面。最后,讨论了SpringMVC的拦截器,创建了自定义拦截器并配置到拦截器链中,展示了预处理、后处理和完成处理的方法。

306

被折叠的 条评论
为什么被折叠?



