SpringMVC文件上传与下载

文件上传下载||异常处理|

@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方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值