SpringMVC简单总结-day03
一、
SpringMVC实现文件上传:
和Servlet方式的本质一样,都是通过commons-fileupload.jar和commons-io.jar
SpringMVC可以简化文件上传的代码,但是必须满足条件:实现MultipartResolver接口;而该接口的实现类SpringMVC也已经提供了。
具体步骤:(直接使用CommonsMultipartResolver实现上传)
a.jar包
commons-fileupload.jar、commons-io.jar
b.配置CommonsMultipartResolver,实现文件上传,将其加入SpringIOC容器
<!-- 配置CommonsMultipartResolver,实现文件上传,将其加入SpringIOC容器
-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
<property name="maxUploadSize" value="102400"></property>
</bean>
c.
@RequestMapping("testUpload")
public String testUpload(@RequestParam("desc") String desc,@RequestParam("file") MultipartFile file) {
System.out.println("文件描述信息:"+desc);
// 将file上传到服务器的某一个硬盘文件中
// 生成保存后的文件名UUID 32位随机字母+数字
String fname = UUID.randomUUID().toString().replaceAll("-", "");
// 获取上传的文件名
String fileName = file.getOriginalFilename();
// 获取源文件的后缀名
String exName = fileName.substring(fileName.lastIndexOf("."));
// 新文件名
String newFname = fname+exName;
try {
file.transferTo(new File("E:\\图片\\test\\"+newFname));
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "success";
}
}
二、
拦截器
拦截器的原理和过滤器相同。
SpringMVC:要想实现拦截器,必须实现一个接口HandlerInterceptor
快捷键:
ctrl+shift+r:自己编写的代码 .java .jsp .html
ctrl+shift+t:jar中的代码
a.编写拦截器 implements HandlerInterceptor
b.配置:将自己写的拦截器配置到SpringMVC中,默认拦截全部请求
<mvc:interceptors>
<!-- 配置具体的拦截路径 -->
<mvc:interceptor>
<!-- 指定拦截的路径,基于ant风格 -->
<mvc:mapping path="/userHeadler/testUpload.html"/>
<!-- 指定不拦截的路径 -->
<!-- <mvc:exclude-mapping path=""/> -->
<bean class="com.jh.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
三、
异常处理
SpringMVC:handlerExceptionResolver接口
该接口的每个实现类,都是异常的一种处理方式:
ExceptionHandlerExceptionResolver:主要提供了@ExceptionHandler注解,并通过该注解处理异常
//该方法可以捕获本类中,抛出的ArithmeticException异常
@ExceptionHandler({ArithmeticException.class})
public String HandlerArithmeticException(ArithmeticException e,Model model) {
System.out.println(e);
model.addAttribute("er", e);
return "error";
}
@ExceptionHandler表示的方法的参数,必须在异常类型(Throwable或其子类),不能包含其他类型的参数
异常处理路径:最短优先
如果有方法抛出一个ArithmeticException异常,而该类中,有两个对应的异常处理。
@ExceptionHandler({ArithmeticException.class})
public String HandlerArithmeticException(Exception e,Model model) {
System.out.println(e);
System.out.println("1");
model.addAttribute("er", e);
return "error";
}
@ExceptionHandler({Exception.class})
public String HandlerArithmeticException2(Exception e,Model model) {
System.out.println(e);
System.out.println("2");
model.addAttribute("er", e);
return "error";
}
则优先级:最短优先。
@ExceptionHandler默认只能捕获当前类中的异常方法。
如果发生异常的方法和处理异常的方法,不在同一个类中:@ControllerAdvice
总结:
如果一个方法用于处理异常,并且只处理当前类中的异常:@ExceptionHandler
如果一个方法用于处理异常,并且处理所有类中的异常:类前加@ControllerAdvice、处理异常的方法前加@ExceptionHandler
b.
ResponseStatusExceptionResolver:自定义异常显示页面 @ResponseStatus
@ResponseStatus(value = HttpStatus.FORBIDDEN,reason = "数组越界222!")
public class MyArrayIndexOutOfBoundsException extends Exception{
//自定义异常
}
@ResponseStatus也可以标志在方法前:
@RequestMapping("testMyException2/{i}")
public String testMyException2(@PathVariable("i") Integer i){
if (i==3) {
return "redirect:testResponseStatus.html";
}
return "success";
}
@ResponseStatus(value = HttpStatus.ACCEPTED,reason = "测试")
@RequestMapping("testResponseStatus")
public String testResponseStatus(){
return "success";
}