使用springMVC自带的组件做文件上传功能, 后面会使用更好的第三方组件做文件上传功能的应用, 这里做一下了解
配置文件上传的解析器, 设置上传的最大文件限制
前端配置如下:
<fieldset>
<h4>本服务内 文件上传</h4>
<form action="${pageContext.request.contextPath}/update.do" method="post" enctype="multipart/form-data">
<input type="file" placeholder="请选择要上传的文件" name="uploadFile">
<input type="text" placeholder="请输入上传文件的执行者名称" name="name"/>
<input type="submit" value="上传文件">
</form>
</fieldset>
com.sun.jersey
jersey-core
1.18.1
com.sun.jersey
jersey-client
1.18.1
commons-fileupload
commons-fileupload
1.3.1
org.springframework
spring-context
5.1.9.RELEASE
org.springframework
spring-webmvc
5.1.9.RELEASE
javax.servlet
servlet-api
2.5
provided
javax.servlet.jsp
jsp-api
2.2
provided
org.apache.tomcat.maven tomcat7-maven-plugin 2.2 9037 /
@Controller
public class DefaultController {
/**
* 本服务器 文件上传
* @param uploadFile 页面表单所上传的文件
*/
@RequestMapping("update")
public String upload(MultipartFile uploadFile, HttpServletRequest request){
//获取32位的随机字符串
String uuid = UUID.randomUUID().toString().replace("-","");
System.out.println("uuid = " + uuid);
//上传文件的名称
String filename = uploadFile.getOriginalFilename();
System.out.println("filename = " + filename);
//获取到 上传文件存储的upload文件夹路径
String realPath = request.getSession().getServletContext().getRealPath("update");
System.out.println("realPath = " + realPath);
///组装要上传文件的完整路径
File path = new File(realPath, uuid+"_"+filename);
System.out.println("path = " + path);
//上传文件
try {
uploadFile.transferTo(path);
} catch (IOException e) {
e.printStackTrace();
}
return "result";
}
}
两条: 1 . 实现接口HandlerExceptionResolver, 2. 在spring-mvc.xml中配置异常处理器
SpringMVC中有一个接口HandlerExceptionResolver , 一旦有异常发生,都会走到这个接口来,所以设置一个异常实现类 去实现这个接口 ,然后重写方法, 就实现了统一异常处理.
e.printStackTrace(); 主要是给程序员看的;
ModelAndView 用来给客户响应客户看到的异常页面和信息;
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
/**
* 异常解析方法
* @param request 请求对象
* @param response 响应对象
* @param handler 异常所在的方法 Handler
* @param e 具体抛出的异常信息
* @return
*/
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) {
//给开发者看的异常信息
e.printStackTrace();
//给浏览器用户看的信息
ModelAndView modelAndView = new ModelAndView();
//设置给用户看的错误提示信息
modelAndView.addObject("message", "亲, 服务器服务中,请2小时后再试~~");
//设置给用户看的错误提示页面
modelAndView.setViewName("error");
return modelAndView;
}
}
关键:
(1) 创建实现类实现HandlerInterceptor接口, 返回false拦截, 返回true放行;
(2)在spring-mvc.xml文件中配置拦截器, class是自定义拦截器实现类的全限定名称.
//意思是拦截所有请求路径含子路径
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//拦截用户请求, 判断当前请求是否为 登录请求, 是,放行
String requestURI = request.getRequestURI();
System.out.println("requestURI = " + requestURI);
//判断当前请求是否为 登录请求, 是,放行
if("/user/login.do".equals(requestURI)){
return true;
}
//其他请求, 判断用户是否已经在Session域存在
Object username = request.getSession().getAttribute("username");
if(username != null){
//在Session域存在 用户信息, 放行
return true;
} else {
//在Session域不存在 用户信息, 拦截, 跳转页面到 用户登录页面
response.sendRedirect("/index.jsp");
return false;
}
}
}