文件上传
既然Spring是用来替代Servlet的WEB功能,那么就必不可少的也能处理前端上传过来的文件.
准备:导入fileupload的Jar包
在没有fileupload之前,我们要过滤前端上传过来的文件数据是非常麻烦的,繁琐的.
后来fileupload出现了,它一定程度上地简化了前端上传文件的过滤机制,但总体上来说还是较为麻烦.
后来SpringMvc将fileupload应用其中,并对fileupload的数据过滤机制进一步简化,这才使得开发者能够简单方便的过滤前端发来的文件数据内容.
Maven下的固定格式:
<!-- 导入FiliUpload 用于快捷地获取前端所提交的文件数据 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
准备:配置文件解析器
在springmvc.xml中配置文件解析器
注意:文件解析器的Id,必须为"multipartResolver"
格式:
<!-- 配置文件解析器 用于配合FileUpload来读取前端提交的数据内容(多数为图片文件) -->
<!-- id必须为'multipartResolver' 否则将无法同FileUpload耦合 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 上传文件的编码类型 默认为UTF-8 -->
<property name="defaultEncoding" value="utf-8"/>
<!-- 当上传多个文件时,总文件大小的上限(默认为10MB) -->
<property name="maxUploadSize" value="10485600"/>
<!-- 单个文件的大小(默认为5MB) -->
<property name="maxUploadSizePerFile" value="5242800"/>
</bean>
应用一:上传单个文件
步骤一
.创建html页面的文件上传表单
格式:
<form action="自定义要提交的虚拟路径" method="post" enctype="multipart/form-data">
<!--此处需要为'multipart/form-data' 将其表单定义为文件上传的表单,且提交类型必须为post -->
文件:<input type="file" name="自定义请求参数名,参数名必须后端MultipartFile对象的形参名一致"><br> <!-- 此处的type要为'file' 这样能够选择一个文件并开启io流 -->
<input type="submit" value="提交"><br>
</form>
列如:
<form action="${pageContext.request.contextPath}/uploadfile" method="post" enctype="multipart/form-data">
<!--此处需要为'multipart/form-data' 将其表单定义为文件上传的表单,且提交类型必须为post -->
姓名:<input type="text" name="username"><br>
年龄:<input type="text" name="age"><br>
文件:<input type="file" name="fileparam"><br> <!-- 此处的type要为'file' 这样能够选择一个文件并开启io流 -->
<input type="submit" value="提交"><br>
</form>
步骤二
:定义web类的业务方法
格式:
@RequestMapping("/自定义虚拟路径名")
@ResponseBody //当使用Multipart来读取表单提交的文件数据时,必须要用上ResponseBody注解
public void fileupload(MultipartFile 自定义MultipartFile对象名) throws IOException {
//自定义业务代码......
// MultipartFile对象的tranferTo方法是一个io流,我们可以通过它来直接把文件写到本地.
自定义MultipartFile对象名.transferTo(new File("自定义路径\\自定义文件名.文件格式"));
}
列如:
@RequestMapping("/uploadfile")
@ResponseBody //当使用Multipart来读取表单提交的文件数据时,必须要用上ResponseBody注解
public void fileupload(String username, String age, MultipartFile fileparam) throws IOException {
System.out.println("run...");
System.out.println("username:" + username);
System.out.println("age:" + age);
// MultipartFile对象的getOriginalFilename可以获得前端上传的文件名
String param = fileparam.getOriginalFilename();
System.out.println(param);
//此时通过Io,参数为其文件名.便可以把前端上传的文件保存到本地了
// MultipartFile对象的tranferTo方法是一个io流,我们可以通过它来直接把文件写到本地.
fileparam.transferTo(new File("C:\\Users\\1\\Desktop\\test.txt"));
}
应用二:上传多个文件
步骤一
.创建html页面的文件上传表单
格式:
<form action="自定义要提交的虚拟路径" method="post" enctype="multipart/form-data">
<!--此处需要为'multipart/form-data' 将其表单定义为文件上传的表单,且提交类型必须为post -->
文件1:<input type="file" name="自定义请求参数名,参数名必须后端MultipartFile对象的形参名一致"><br> <!-- 此处的type要为'file' 这样能够选择一个文件并开启io流 -->
文件2:<input type="file" name="自定义请求参数名,参数名必须后端MultipartFile对象的形参名一致"><br> <!-- 此处的type要为'file' 这样能够选择一个文件并开启io流 -->
文件3:<input type="file" name="自定义请求参数名,参数名必须后端MultipartFile对象的形参名一致"><br> <!-- 此处的type要为'file' 这样能够选择一个文件并开启io流 -->
....等多个文件上传input标签
<input type="submit" value="提交"><br>
</form>
列如:
<form action="${pageContext.request.contextPath}/uploadfilearr" method="post" enctype="multipart/form-data">
<!--此处需要为'multipart/form-data' 将其表单定义为文件上传的表单 -->
姓名:<input type="text" name="username"><br>
年龄:<input type="text" name="age"><br>
文件1:<input type="file" name="fileparam"><br> <!-- 此处的type要为'file' 这样能够选择一个文件并开启io流 -->
文件2:<input type="file" name="fileparam"><br> <!-- 此处的type要为'file' 这样能够选择一个文件并开启io流 -->
文件3:<input type="file" name="fileparam"><br> <!-- 此处的type要为'file' 这样能够选择一个文件并开启io流 -->
<input type="submit" value="提交"><br>
</form>
步骤二
:定义web类的业务方法
格式:
@RequestMapping("uploadfilearr")
@ResponseBody
public void fileUploadArr(MultipartFile[] 自定义MultipartFile对象名) throws IOException {//既然是多个文件上传,那么此处的MultipartFile文件就是数组
//自定义业务代码.......
//通过增强for来遍历数组的对象元素
for (MultipartFile 自定义遍历元素名: 自定义MultipartFile对象名) {
自定义遍历元素名.transferTo(new File("自定义路径\\自定义文件名.文件格式"));
}
}
列如:
@RequestMapping("uploadfilearr")
@ResponseBody
public void fileUploadArr(String username, String age, MultipartFile[] fileparam) throws IOException {//既然是多个文件上传,那么此处的MultipartFile文件就是数组
System.out.println("username:" + username);
System.out.println("age:" + age);
for (MultipartFile multipartFile : fileparam) {
String fileName = multipartFile.getOriginalFilename();
System.out.println("saveFile:" + fileName);
multipartFile.transferTo(new File("C:\\Users\\1\\Desktop\\fileSave\\" + fileName));
}
}
SpringMVC的拦截器
概念
‘拦截器’不如’过滤器’好用,应用范围也不如’过滤器’广阔.
但是基于这属于SpringMVC的知识点,所以就来连同SpringMVC的’拦截器’也学一学
面试题:
当SpringMVC拦截器的参数为’/**
’时,会拦截html和jsp.
要注意的点是,Servlet过滤器的执行级别要比SrpingMVC的拦截器执行级别要优先.
因此当一个资源访问时,是会先用Servlet的过滤器来过滤,如果通过了Servlet过滤器的验证,才再由SpringMVC的拦截器来验证.
步骤一:创建拦截器的实现类
定义一个类,实现HandlerInterceptor接口,重写preHandle方法
意义:
通过拦截器的实现类,来定义拦截器拦截了某个访问后要做什么事,以及要不要对该请求放行
列如:
public class InterceptorClass implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
System.out.println("拦截.... preHandle方法起效");
response.setContentType("text/html;charset=utf-8");
try {
response.getWriter().write("您的权限不够,访问该网页被拦截!");
System.out.println(".............................preHandle");
} catch (IOException e) {
e.printStackTrace();
}
return true;//返回值为true,则代表拦截器对该访问放行.为false则代表不对该访问放行.我们可以用于验证是否处于登录状态
}
}
步骤二:在springmvc中配置拦截器
在springmvc.xml配置文件中.配置拦截器
格式:
<!-- 配置SpringMVC的拦截器 -->
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--通过规则,来拦截所有请求 通常为一个杠两个星号'/**'-->
<mvc:mapping path="/**"/>
<!--指定被拦截器排除的页面 比如用于访问登录页面的:"/login"-->
<mvc:exclude-mapping path="/要被拦截器忽略拦截的虚拟路径-可省略该标签"/>
<!--配置拦截器实现类的路径-->
<bean class="拦截器实现类的路径"/>
</mvc:interceptor>
</mvc:interceptors>
SpringMvc异常体系
SpringMvc分为两种处理机制
一种是’简单处理机制’,一种是’自定义异常处理机制’.
’自定义异常处理机制’在日常的开发中更为常用
简单异常处理机制
应用:配置文件
简单异常处理机制很简单,只需要在springmvc.xml中配置文件即可.
其中
格式:
<!-- 简单异常处理 -->
<!--配置简单映射异常处理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!--默认错误视图 假若是计算异常和类型转换异常以外的其它异常,将由默认视图来处理 出现异常后跳转的页面为:"erroNum.jsp"-->
<property name="defaultErrorView" value="forward:/erroNum.jsp"/>
<property name="exceptionMappings">
<map>
<!-- 处理计算异常 'ArithmeticException' 代表计算异常 出现异常后跳转的页面为:"erroNum.jsp" -->
<entry key="ArithmeticException" value="forward:/erroNum.jsp"/>
<!-- 处理类型转换异常 'ClassCastException' 代表类型转换异常 出现异常后跳转的页面为:"erroNum.jsp" -->
<entry key="ClassCastException" value="forward:/erroNum.jsp"/>
</map>
</property>
</bean>
自定义异常处理机制(常用)
自定义异常处理器在实际开发中较简单异常处理机制更为常用
步骤一:实现异常处理类
定义一个类,实现HandlerExceptionResolver接口,然后按Alt+Enter来重写resolveException方法
格式模板:
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
//创建ModelAndVied(数据共享与跳转),目的在于根据异常类型的不同,将ModelAndVied作为返回值返回给前端,ModelAndVied自带跳转页面功能(还会携带共享数据)
ModelAndView 自定义modelAndView对象名 = new ModelAndView();
//判断出现的异常是什么异常
if (e instanceof ArithmeticException) { //如果是计算异常,则执行下面的代码,
自定义modelAndView对象名.setViewName("跳转链接");
} else if (e instanceof ClassCastException) {//如果是类型转换异常,则执行下面的代码
自定义modelAndView对象名.setViewName("跳转链接");
} else {//如果是其它异常,则则执行下列代码
自定义modelAndView对象名w.setViewName("跳转链接");
}
return 自定义modelAndView对象名;//返回给前端
}
步骤二:配置springmvc.xml
格式
<!-- 配置SpringMvc的自定义异常处理器 其路径为自定义异常处理器的实现类 -->
<bean class="自定义"/>