目录
案例一:文件上传
需要导入的坐标
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
编写页面
<form action="/download" method="post" enctype="multipart/form-data">
<input type="file" name="download"><br/>
<input type="submit" value="提交">
</form>
enctupe属性必须设置为multipart/form-data,将信息进行分段处理
method属性必须设置为post,因为post没有大小设置
实现方式一:传统文件上传
控制器:
@RequestMapping("/download")
public String download_1(HttpServletRequest request) throws Exception {
String path="D://Download";//上传目录
File file = new File(path);//一会向该目录 上传文件
// 创建创建磁盘文件项工厂
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
// 解析request对象
List<FileItem> fileItems = servletFileUpload.parseRequest(request);
for (FileItem fileItem : fileItems) {
if(!fileItem.isFormField()){
//当是上传文件项时
String name = fileItem.getName();
String s = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
name=s+'-'+name;
// 上传文件
fileItem.write(new File(path,name));
// 删除临时文件
fileItem.delete();
}
}
return "succes";
}
succes.jsp为返回页面
实现方式二:使用springmvc的方式
使用前提:变量名称与表单的file标签的name属性名称相同
因为框架提供了文件解析器,控制器就省去了解析request对象,直接获取上传文件项即可
控制器:
@RequestMapping("/download")
public String download_2(MultipartFile download) throws IOException {
String path="D://Download";//上传目录
File file = new File(path);
//获取文件名,并且做唯一处理
String Filename = download.getOriginalFilename();
String s = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
Filename=s+Filename;
//上传
download.transferTo(new File(file,Filename));
return "succes";
}
配置文件解析器:
<!-- 文件解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 文件最大设置为10M-->
<property name="maxUploadSize" value="5242880"/>
</bean>
案例二:异常处理
当页面出现异常,调用异常处理器跳转至指定页面
原理
自定义异常类
@Setter @Getter @AllArgsConstructor
public class MyException extends Exception{
private String message;
}
编写异常处理器 实现HandlerExceptionResolver接口
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
MyException myException=null;
// 获取异常对象
//如果是MyException异常 则直接赋值;如果不是,则创建一个新对象 传入新的信息
if(ex instanceof MyException){
myException=(MyException)ex;
}else {
myException=new MyException("新创建一个对象");
}
//创建ModelAndView对象,根据刚刚获取的message 跳转页面
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message",myException.getMessage());
modelAndView.setViewName("error");
return modelAndView;
}
}
配置异常处理器 将异常处理器放入ioc容器中即可
<!-- 配置异常处理器-->
<bean class="com.eoor.MyExceptionResolver"/>
在控制器中捕获异常
@RequestMapping("/her")
public String t_8() throws MyException {
// 制造异常
try {
int i=1/0;
} catch (Exception e) {
e.printStackTrace();
throw new MyException("您先休息一下");
}
return "succes";
}
案例三:拦截器
原理
拦截器与过滤器的区别
过滤器是servlet的一部分,任何框架都可以使用;拦截器是springmvc框架独有的
过滤器可以拦截任何资源,拦截器只会拦截控制器中的方法
示例代码
自定义拦截器 实现HandlerInterceptor接口
public class myinterceptor1 implements HandlerInterceptor {
@Override
//预处理
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器1 预处理");
return true;
}
@Override
//后处理
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器1 后处理");
}
@Override
//最终处理
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("拦截器1 最终处理");
}
}
public class myinterceptor2 implements HandlerInterceptor {
@Override
//预处理
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器2 预处理");
return true;
}
@Override
//后处理
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器2 后处理");
}
@Override
//最终处理
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("拦截器2 最终处理");
}
}
配置拦截器
<!-- 配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<bean class="com.intlterceptor.myinterceptor1"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<bean class="com.intlterceptor.myinterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
要访问的控制器的一级目录是/user/
运行结果: