一、SpringMVC的文件上传
1、文件上传-客户端表单实现(应用)
文件上传客户端表单需要满足:
1、表单项type=“file”
2、表单的提交方式是post
3、表单的enctype属性是多部分表单形式,及enctype=“multipart/form-data”
<form action="${pageContext.request.contextPath}/user/quick22" method="post"
enctype="multipart/form-data">
名称<input type="text" name="username"><br/>
文件1<input type="file" name="uploadFile"><br/>
<input type="submit" value="提交">
</form>
2、单文件上传的代码实现1(应用)
添加依赖
<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.3</version>
</dependency>
spring-mvc.xml中配置多媒体解析器
<!--配置文件上传解析器 下面的id不可以改变-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.
CommonsMultipartResolver">
<!--默认编码-->
<property name="defaultEncoding" value="UYF-8"/>
<!--上传文件总大小 还可以配一些其他的-->
<property name="maxUploadSize" value="500000"/>
</bean>
后台程序
@RequestMapping(value="/quick22")
@ResponseBody
public void save22(String username, MultipartFile uploadFile) throws IOException {
System.out.println(username);
//获得上传文件的名称
String originalFilename = uploadFile.getOriginalFilename();
//用原文件名保存到路径
uploadFile.transferTo(new File("C:\\upload\\"+originalFilename));
}
3、多文件上传的代码实现(应用)
前台:(只需要将页面修改为多个文件上传项)
<form action="${pageContext.request.contextPath}/user/quick23" method="post"
enctype="multipart/form-data">
名称<input type="text" name="username"><br/>
文件1<input type="file" name="uploadFile"><br/>
文件2<input type="file" name="uploadFile"><br/>
<input type="submit" value="提交">
</form>
后台:(将方法参数MultipartFile 类型修改为MultipartFile[] 类型,要保证数组名称与前台所有文件上传项的name属性的值相同,才能正确的传过来赋值到数组中)
@RequestMapping(value="/quick23")
@ResponseBody
public void save23(String username, MultipartFile[] uploadFile) throws IOException {
System.out.println(username);
for (MultipartFile multipartFile : uploadFile) {
String originalFilename = multipartFile.getOriginalFilename();
multipartFile.transferTo(new File("C:\\upload\\"+originalFilename));
}
}
4、文件上传的原理
二、SpringMVC的拦截器
1、拦截器的作用(理解)
Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(InterceptorChain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。
2、(拦截器)interceptor和filter区别(理解,记忆)
3、拦截器的快速入门
自定义拦截器很简单,只有如下三步:
①创建拦截器类实现HandlerInterceptor接口
public class MyInterceptor1 implements HandlerInterceptor {
//在目标方法执行之前 执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
System.out.println("preHandle.....");
}
//在目标方法执行之后 视图对象返回之前执行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
System.out.println("postHandle...");
}
//在流程都执行完毕后 执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("afterCompletion....");
}
}
②配置拦截器(在SpringMVC的配置文件中配置)
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--对哪些资源执行拦截操作-->
<mvc:mapping path="/**"/>
<bean class="com.itheima.interceptor.MyInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
③测试拦截器的拦截效果
@Controller
public class TargetController {
@RequestMapping("/target")
public ModelAndView show(){
System.out.println("目标资源执行......");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("name","itcast");
modelAndView.setViewName("index");
return modelAndView;
}
}
拦截器详解:
1、当拦截器的preHandle方法返回值是一个boolean类型,返回 true则会放行,执行目标资源,如果返回false则拦截,不执行目标资源。
2、postHandle在目标方法执行之后 视图对象返回之前执行,意思就是可以操作返回前的modelAndView,
操作完,再返回。
3多个拦截器情况下,配置在前的先执行,配置在后的后执行。比如说先配置了拦截器1,然后配置了拦截器2,执行顺序是:(拦截器1preHandle方法,拦截器2的preHandle方法,目标方法,拦截器2的postHandle方法,拦截器1的postHandle方法,拦截器2的afterCompletion方法,拦截器1的afterCompletion方法)和多个过滤器的执行流程一样。
4、知识小结(记忆)
三、SpringMVC异常处理机制
3.1 异常处理的思路
系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信
息,后者主要通过规范代码开发、测试等手段减少运行时异常的发生。
系统的Dao、Service、Controller出现都通过throws Exception向上抛出(向上抛出的意思的交给调用者处理,
谁调用谁处理,所以最后是抛到前端控制器,交由框架处理),最后由SpringMVC前端控制器交由异常处理器进行异
常处理。
3.2 异常处理两种方式
① 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver(一般用这个就可以满足了)
② 实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器
3.3 简单异常处理器SimpleMappingExceptionResolver
SpringMVC已经定义好了该类型转换器,在使用时可以根据项目情况进行相应异常与视图的映射配置
<!--配置简单映射异常处理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="error"/><!--默认错误视图-->
<property name="exceptionMappings">
<map>
<!--异常类型--> <!--错误视图-->
<entry key="java.lang.ClassCastException" value="error1"/>
<entry key="com.itheima.exception.MyException" value="error2"/>
</map>
</property>
</bean>
3.4 自定义异常处理步骤
①创建异常处理器类实现HandlerExceptionResolver
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
//处理异常的代码实现
//创建ModelAndView对象
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("exceptionPage");
return modelAndView;
}
}
②配置异常处理器
<bean id="exceptionResolver"
class="com.itheima.exception.MyExceptionResolver"/>
③编写异常页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
这是一个最终异常的显示页面
</body>
</html>
④测试异常跳转
@RequestMapping("/quick22")
@ResponseBody
public void quickMethod22() throws IOException, ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
simpleDateFormat.parse("abcde");
}