文件上传下载||异常处理|
@PathVariable
//@PathVariable可以用来映射URL中的占位符到目标方法的参数中
@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id") Integer id) {
System.out.println("testPathVariable:"+id);
return SUCCESS;
}
``
@ExceptionHandler
在方法上使用,出现异常时触发被它修饰的方法
@ModelAttribute
被它修饰的方法会作为一个前置通知(在执行方法前执行)
@ControllerAdvice
被它修饰的类可以作为全局切面,在里面配置异常处理方法,可作为全局异常处理方法
1、文件上传:
表单:enctype=“multipart/form-data” method=“post”
依赖:commons-fileupload-x.jar、commons-io-x.jar包
@RequestMapping(value="/upload2")
public String upload(
MultipartFile file,
MultipartHttpServletRequest request
) throws IOException {
//保证用户没上传不报该错:exists but is a directory
if(!file.isEmpty()){
System.out.println(file.getContentType()+":"+file.getName());
//真实文件名
System.out.println(file.getOriginalFilename());
//获得真实路径 (也可采用接口ServletContextAware注入)
String path = application.getRealPath("/upload")+File.separator;
String name = path + file.getOriginalFilename();
FileUtils.copyInputStreamToFile(file.getInputStream(), new File(name));
//或者使用
//file.transferTo(new File(path, name));
}
return "success";
}
上传必须配置如下解析器,否则MultipartFile为空:
<!-- 上传解析,如最大上传值及最小上传值,必须配置multipartResolver,名字也不能改 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10000000" /> <!-- 10M -->
<property name="maxInMemorySize" value="10240"/> <!-- 最大临时内存大小 -->
<property name="defaultEncoding" value="UTF-8"/>
</bean>
多文件上传:
a、使用MultipartFile[],参数名和前台file的name相同
b、参数前加@RequestParam在新版本中可以省略(教材上版本低,所以要求必须加)
下载:
response.setContentType("application/x-msdownload;charset=UTF-8");
response.setHeader("Content-disposition", "attachment;filename="+fileName);
OutputStream os = response.getOutputStream(); 使用该流向客户端输出!
2、@RequestMapping不但支持标准的URL,还支持Ant、restful风格。以下URL都是合法的:
(Spring 3.0新增功能)
Ant风格:
?: 匹配一个字符
*: 匹配任意字符
**:匹配多层路径
a./user/*/createUser
匹配/user/aaa/createUser、/user/bbb/createUser等URL。
b./user/**/createUser
匹配/user/createUser、/user/aaa/bbb/createUser等URL。
c./user/createUser??
匹配/user/createUseraa、/user/createUserbb等URL。
Restful风格:
rest:Representational State Transfer(以资源为导向)
a./user/{userId}
匹配user/123、user/abc等URL。
b./user/**/{userId}
匹配user/aaa/bbb/123、user/aaa/456等URL。
c.company/{companyId}/??/{userId}/detail
匹配company/123/us/456/detail等的URL
d.错误格式
/user/**/{userId}/**/{username}
优点:因为隐藏了参数与路径的关系,可以提升网站的安全性,静态化页面,降低恶意攻击风险
//springmvc/path/zhangsan/33
@RequestMapping(value="/path/{name}/{age}")
public String path(@PathVariable("name") String sname,@PathVariable("age")...) {
System.out.println(sname);
return "hello";
}
@PathVariable:映射URL中的占位符到目标方法的参数中
3、SpringMVC提供的异常处理主要有
a.实现HandlerExceptionResolver接口,扩展自定义异常处理
SpringMVC本身已经对其有了一个自身的实现——DefaultExceptionResolver,该解析器只是对其中的一些比较典型的异常进行了拦截处理。
<bean id="exceptionResolver" class="com.cssl.handler.MyExceptionHandler"/>
b.使用@ExceptionHandler进行处理(局部异常)
使用@ExceptionHandler进行异常处理的方法必须与出错的方法在同一个Controller里面
一定要注明处理哪种异常类型
@ExceptionHandler(Exception.class)
public String error(Exception e){}
c.针对所有Controller异常处理(全局异常但不包括类型转换异常)
springmvc.xml配置
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">error</prop>
</props>
</property>
</bean>
d.@ControllerAdvice+@ExceptionHandler 全局处理Controller层异常
优点:将Controller层的异常和数据校验的异常进行统一处理,减少编码量,提升扩展性和可维护性
缺点:只能处理Controller层未捕获(往外抛)的异常,对于Interceptor(拦截器)层的异常,Spring框架层的异常,就无能为力了
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public String handleException(){ ...; }
/**
* 前置通知
* @return
*/
@ModelAttribute
public Users getModel() {
Users u = new Users();
u.setUsername("匿名用户");
return u;
}
}
@ControllerAdvice也可配合@InitBinder和@ModelAttribute方法,适用所有使用@RequestMapping方法