Spring MVC day02 文件上传、异常处理、拦截器

一、响应数据和结果视图

1-1 返回值分类

  • 字符串
@RequestMapping("/testReturnString")
public String testReturnString() {
    
    
	System.out.println("AccountController 的 testReturnString 方法执行了。。。。");
	return "success"; 
}
  • void
    可以使用response进行跳转,也可以直接输出
  • ModelAndView
@RequestMapping("/testReturnModelAndView")
public ModelAndView testReturnModelAndView() {
    
    
	ModelAndView mv = new ModelAndView();
	mv.addObject("username", "张三");
	mv.setViewName("success");
	return mv; 
	}

1-2 转发和重定向

  • forward 转发
    直接写在return语句中即可
return "forward:/WEB-INF/pages/success.jsp";
  • Redirect 重定向
return "redirect:testReturnModelAndView";

1-3 设置不过滤静态资源

在springmvc.xml下加入以下代码

<mvc:resources location="/css/" mapping="/css/**"/> <!-- 样式 --> 
<mvc:resources location="/images/" mapping="/images/**"/> <!-- 图片 --> 
<mvc:resources location="/js/" mapping="/js/**"/> <!-- javascript -->

1-4 ResponseBody 响应 json 数据

  • 导入jar包,此jar包会将json格式的字符串封装到对应的实体中
     <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.9.0</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>2.9.0</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>2.9.0</version>
            </dependency>
  • 使用@RequestBody注解把json的字符串转换成JavaBean的对象,使用@ResponseBody注解把JavaBean对象转换成json字符串,直接响应
    要求方法需要返回JavaBean的对象
    @RequestMapping("/testJson")
    public @ResponseBody
    Address testJson(@RequestBody Address address) {
        System.out.println(address);
        address.setAddressName("上海");
        return address;
    }

二、SpringMVC实现文件上传

2-1 文件上传的回顾

  • 导入jar包
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
  • 编写java类
    /*** 文件上传 * @throws Exception */
    @RequestMapping(value = "/fileupload")
    public String fileupload(HttpServletRequest request) throws Exception {
    
    
        // 先获取到要上传的文件目录
        String path = request.getSession().getServletContext().getRealPath("/uploads");
        // 创建File对象,一会向该路径下上传文件
        File file = new File(path);
        // 判断路径是否存在,如果不存在,创建该路径
        if (!file.exists()) {
    
    
            file.mkdirs();
        }
        // 创建磁盘文件项工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload fileUpload = new ServletFileUpload(factory);
        // 解析request对象
        List<FileItem> list = fileUpload.parseRequest(request);
        // 遍历
        for (FileItem fileItem : list) {
    
    
            // 判断文件项是普通字段,还是上传的文件
            if (fileItem.isFormField()) {
    
    
            } else {
    
    
                // 上传文件项
                // 获取到上传文件的名称 
                String filename = fileItem.getName();
                // 上传文件 
                fileItem.write(new File(file, filename));
                // 删除临时文件 
                fileItem.delete();
            }
        }
        return "success";
    }

2-2 SpringMVC传统方式文件上传

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ec31QduQ-1581522223491)(https://raw.githubusercontent.com/1519059197/img_note/master/小书匠/03-原理.bmp)]

  • 配置文件解析器对象
 <!-- 配置文件解析器对象,要求id名称必须是multipartResolver -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"/>
    </bean>
  • 编写controller类
/*** SpringMVC方式的文件上传 
     ** @param request 
     * @return 
     * @throws Exception */
    @RequestMapping(value = "/fileupload2")
    public String fileupload2(HttpServletRequest request, MultipartFile upload) throws Exception {
    
    
        System.out.println("SpringMVC方式的文件上传...");
        // 先获取到要上传的文件目录 
        String path = request.getSession().getServletContext().getRealPath("/uploads");
        // 创建File对象,一会向该路径下上传文件 
        File file = new File(path);
        // 判断路径是否存在,如果不存在,创建该路径 
        if (!file.exists()) {
    
    
            file.mkdirs();
        }
        // 获取到上传文件的名称 
        String filename = upload.getOriginalFilename();
        String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
        // 把文件的名称唯一化 
        filename = uuid + "_" + filename;
        // 上传文件 
        upload.transferTo(new File(file, filename));
        return "success";
    }

2-3 SpringMVC跨服务器方式文件上传

  • 导入依赖
<dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-core</artifactId>
            <version>1.18.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
            <version>1.18.1</version>
        </dependency>
  • 编写控制器
@RequestMapping(value = "/fileupload3")
    public String fileupload3(MultipartFile upload) throws Exception {
    
    
        System.out.println("SpringMVC跨服务器方式的文件上传...");
        // 定义图片服务器的请求路径
        String path = "http://localhost:9090/day02_springmvc5_02image/uploads/";
        // 获取到上传文件的名称 
        String filename = upload.getOriginalFilename();
        String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
        // 把文件的名称唯一化 
        filename = uuid + "_" + filename;
        // 向图片服务器上传文件 
        // 创建客户端对象 
        Client client = Client.create();
        // 连接图片服务器 
        WebResource webResource = client.resource(path + filename);
        // 上传文件 
        webResource.put(upload.getBytes());
        return "success";
    }

三、SpringMVC的异常处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nR33MOpr-1581522223492)(https://raw.githubusercontent.com/1519059197/img_note/master/小书匠/1581520561274.png)]

  • 自定义异常类
public class SysException extends Exception {
    
    
    // 异常提示信息 
    private String message;

    public String getMessage() {
    
    
        return message;
    }

    public void setMessage(String message) {
    
    
        this.message = message;
    }

    public SysException(String message) {
    
    
        this.message = message;
    }
}
  • 自定义异常处理器

需要实现HandlerExceptionResolver接口

public class SysExceptionResolver implements HandlerExceptionResolver {
    
    
    /*** 跳转到具体的错误页面的方法 */
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    
    
        ex.printStackTrace();
        SysException e = null;
        // 获取到异常对象 
        if (ex instanceof SysException) {
    
    
            e = (SysException) ex;
        } else {
    
    
            e = new SysException("请联系管理员");
        }
        ModelAndView mv = new ModelAndView();
        // 存入错误的提示信息 
        mv.addObject("message", e.getMessage());
        // 跳转的Jsp页面 
        mv.setViewName("error");
        return mv;
    }
  • 配置异常处理器
<!-- 配置异常处理器 --> <bean id="sysExceptionResolver" class="cn.itcast.exception.SysExceptionResolver"/>

四、拦截器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VSlkoJWU-1581522223494)(https://raw.githubusercontent.com/1519059197/img_note/master/小书匠/1581522210700.png)]

4-1 自定义拦截器

  • 创建类,实现HandlerInterceptor接口,重写需要的方法
/*** 自定义拦截器1 * @author rt */
public class MyInterceptor1 implements HandlerInterceptor {
    
    
    /*** 
     * controller方法执行前,进行拦截的方法 
     * return true放行 
     * return false拦截 
     * 可以使用转发或者重定向直接跳转到指定的页面。 */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        System.out.println("拦截器执行了...");
        return true;
    }
}
  • 在springmvc.xml中配置拦截器类
    <!-- 配置拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor> <!-- 哪些方法进行拦截 -->
            <mvc:mapping path="/user/*"/> <!-- 哪些方法不进行拦截 <mvc:exclude-mapping path=""/> --> <!-- 注册拦截器对象 -->
            <bean class="cn.itcast.demo1.MyInterceptor1"/>
        </mvc:interceptor>
    </mvc:interceptors>

4-2 HandlerInterceptor接口中的方法

preHandle方法是controller方法执行前拦截的方法
 可以使用request或者response跳转到指定的页面
 return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
 return false不放行,不会执行controller中的方法。
postHandle是controller方法执行后执行的方法,在JSP视图执行前。
 可以使用request或者response跳转到指定的页面
 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
postHandle方法是在JSP执行后执行
 request或者response不能再跳转页面了

猜你喜欢

转载自blog.csdn.net/m_awdawdw/article/details/104289076