SpringMVC二

SpringMVC二

响应数据和结果视图

1. 返回值为字符串

  • controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
  • 如:return "success";就会在xml文件中视图解析器配置的文件夹下去找对于的文件跳转。

2. 没有返回值(void)

  • 可以使用Servlet原始API作为控制器中方法的参数,用request进行请求转发或者用response进行重定向。

3. ModelAndView

  • ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。
  • 可以创建一个ModelAndView对象,然后写入响应数据及要跳转的视图名,最后返回此对象。
  • 这种方法走的也是视图解析器。

ResponseBody 响应 json 数据

  • @ResponseBody
  • 作用:
    • 该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数据如:json,xml 等,通过 Response 响应给客户端。
  • 注意:Springmvc 默认用MappingJacksonHttpMessageConverter 对 json 数据进行转换,需要加入jackson 的包。

SpringMVC 实现文件上传

必要前提

  1. form 表单的 enctype 取值必须是:multipart/form-data(默认值是:application/x-www-form-urlencoded)
    • enctype:是表单请求正文的类型
  2. method 属性取值必须是 Post
  3. 提供一个文件选择域<input type=”file” />
  • 借助第三方组件:Commons-fileupload
    commons-io

无论使用何种方式上传都需要配置文件解析器

<!-- 配置文件解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="10485760"/>
</bean>
  • 注意:文件上传的解析器 id 是固定的,不能起别的名称,否则无法实现请求参数的绑定。

传统方式的文件上传

    public String fileUpLoad1(HttpServletRequest request) throws Exception {
    // 使用fileupload组件完成文件上传
    // 上传的位置
    String path = request.getSession().getServletContext().getRealPath("/upload/");
    // 判断,该路径是否存在
    File file = new File(path);
    if (!file.exists()) {
        // 创建该文件夹
        file.mkdirs();
    }

    // 解析request对象,获取上传文件项
    DiskFileItemFactory df = new DiskFileItemFactory();
    ServletFileUpload servletFileUpload = new ServletFileUpload(df);
    // 解析request
    List<FileItem> items = servletFileUpload.parseRequest(request);
    // 遍历
    for (FileItem item : items) {
        // 进行判断,当前item对象是否是上传文件项
        if (item.isFormField()) {
            // 说明普通表单向
        } else {
            // 说明上传文件项
            // 获取上传文件的名称
            String filename = item.getName();
            // 把文件的名称设置唯一值,uuid
            String uuid = UUID.randomUUID().toString().replace("-", "");
            filename = uuid + "_" + filename;
            // 完成文件上传
            item.write(new File(file, filename));
            // 删除临时文件
            item.delete();
        }
    }

    return "success";
}

SpringMVC方式文件上传

    public String fileUpLoad2(HttpServletRequest request, MultipartFile upload) throws Exception {
    // 使用fileupload组件完成文件上传
    // 上传的位置
    String path = request.getSession().getServletContext().getRealPath("/upload/");
    // 判断,该路径是否存在
    File file = new File(path);
    if (!file.exists()) {
        // 创建该文件夹
        file.mkdirs();
    }

    // 说明上传文件项
    // 获取上传文件的名称
    String filename = upload.getOriginalFilename();
    // 把文件的名称设置唯一值,uuid
    String uuid = UUID.randomUUID().toString().replace("-", "");
    filename = uuid + "_" + filename;
    // 完成文件上传
    upload.transferTo(new File(path, filename));

    return "success";
}
  • 原理:
    NEqFxK.md.png

SpringMVC跨服务器方式文件上传

public String fileUpLoad3(MultipartFile upload) throws Exception {

    //定义上传服务器路径
    String path = "服务器地址/上传的文件夹/";

    // 说明上传文件项
    // 获取上传文件的名称
    String filename = upload.getOriginalFilename();
    // 把文件的名称设置唯一值,uuid
    String uuid = UUID.randomUUID().toString().replace("-", "");
    filename = uuid + "_" + filename;

    //创建客户端对象
    Client client = Client.create();
    //和图片服务器进行连接
    WebResource webResource = client.resource(path + filename);
    //上传文件
    webResource.put(upload.getBytes());

    return "success";
}
  • 原理:
    NEqMGt.md.png

SpringMVC 中的异常处理

  • 系统中异常包括两类:预期异常和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。

  • 系统的 dao、service、controller 出现都通过 throws Exception 向上抛出,最后由 springmvc 前端控制器交由异常处理器进行异常处理,如下图:
    NEqzy8.md.png

  • 步骤:

    1. 定义一个自己的异常类和错误页面
    2. 自定义异常处理器
    3. 配置异常处理器
  • 自定义异常处理器时必须实现HandlerExceptionResolver接口

  • 自定义完异常处理器后需要在配置文件中注入依赖,即用一个bean注册一下


SpringMVC 中的拦截器

NEOHPA.md.png

  • Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。用户可以自己定义一些拦截器来实现特定的功能。

  • 拦截器与过滤器的不同:

    • 过滤器是 servlet 规范中的一部分,任何 java web 工程都可以使用。
    • 拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。
    • 过滤器在 url-pattern 中配置了/之后,可以*对所有要访问的资源拦截。**
    • 拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image 或者 js 是不会进行拦截的。
  • 我们要想自定义拦截器, 要求必须实现:HandlerInterceptor 接口。

  • 拦截器中的方法:

    1. preHandle,在进入具体的控制强之前执行,返回值为一个布尔值,为true则放行,为false则不放行,在此方法中可以跳转到另一个页面。
    2. postHandle,在进入具体的控制强之后执行,没有返回值,在此方法中可以跳转到另一个页面。
    3. afterCompletion,在进入控制器最后返回页面之后执行,在此方法中不可以跳转到另一个页面。
  • 自定义拦截器之后需要在配置文件中配置拦截器

    <!-- 配置拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            //配置拦截的控制强路径
            <mvc:mapping path="/user/*"/>
            //配置具体的拦截器类
            <bean class="springmvc2interceptor.interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信