SpringMVC-03 文件上传&拦截器&统一异常处理

1. 文件上传

使用springMVC自带的组件做文件上传功能, 后面会使用更好的第三方组件做文件上传功能的应用, 这里做一下了解

2. 文件上传关键代码配置

2.1 springmvc.xml配置

配置文件上传的解析器, 设置上传的最大文件限制


    
    

2.2 文件上传的前端配置

前端配置如下:


  <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>

2.3 加载依赖文件到pom.xml中


    
    
        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 /

2.4 配置controller类

@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";
}
}

3 统一异常处理

两条: 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;
    }
}

4 拦截器

关键:
(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;
    }
}

}

你可能感兴趣的:(Java入门)