zoukankan      html  css  js  c++  java
  • SpringMVC简单总结-day03

    一、
    SpringMVC实现文件上传:
    和Servlet方式的本质一样,都是通过commons-fileupload.jar和commons-io.jar
    SpringMVC可以简化文件上传的代码,但是必须满足条件:实现MultipartResolver接口;而该接口的实现类SpringMVC也已经提供了。

    具体步骤:(直接使用CommonsMultipartResolver实现上传)
    a.jar包
    commons-fileupload.jar、commons-io.jar
    b.配置CommonsMultipartResolver,实现文件上传,将其加入SpringIOC容器

    <!-- 配置CommonsMultipartResolver,实现文件上传,将其加入SpringIOC容器
    -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="defaultEncoding" value="UTF-8"></property>
    <property name="maxUploadSize" value="102400"></property>
    </bean>

    c.
    @RequestMapping("testUpload")
    public String testUpload(@RequestParam("desc") String desc,@RequestParam("file") MultipartFile file) {
    System.out.println("文件描述信息:"+desc);
    // 将file上传到服务器的某一个硬盘文件中
    // 生成保存后的文件名UUID 32位随机字母+数字
    String fname = UUID.randomUUID().toString().replaceAll("-", "");
    // 获取上传的文件名
    String fileName = file.getOriginalFilename();
    // 获取源文件的后缀名
    String exName = fileName.substring(fileName.lastIndexOf("."));
    // 新文件名
    String newFname = fname+exName;
    try {
    file.transferTo(new File("E:\图片\test\"+newFname));
    } catch (IllegalStateException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    return "success";
    }
    }


    二、
    拦截器
    拦截器的原理和过滤器相同。
    SpringMVC:要想实现拦截器,必须实现一个接口HandlerInterceptor

    快捷键:
    ctrl+shift+r:自己编写的代码 .java .jsp .html
    ctrl+shift+t:jar中的代码

    a.编写拦截器 implements HandlerInterceptor
    b.配置:将自己写的拦截器配置到SpringMVC中,默认拦截全部请求
    <mvc:interceptors>
    <!-- 配置具体的拦截路径 -->
    <mvc:interceptor>
    <!-- 指定拦截的路径,基于ant风格 -->
    <mvc:mapping path="/userHeadler/testUpload.html"/>
    <!-- 指定不拦截的路径 -->
    <!-- <mvc:exclude-mapping path=""/> -->
    <bean class="com.jh.interceptor.MyInterceptor"></bean>
    </mvc:interceptor>
    </mvc:interceptors>

    三、
    异常处理
    SpringMVC:handlerExceptionResolver接口
    该接口的每个实现类,都是异常的一种处理方式:
    ExceptionHandlerExceptionResolver:主要提供了@ExceptionHandler注解,并通过该注解处理异常

    //该方法可以捕获本类中,抛出的ArithmeticException异常
    @ExceptionHandler({ArithmeticException.class})
    public String HandlerArithmeticException(ArithmeticException e,Model model) {
    System.out.println(e);
    model.addAttribute("er", e);
    return "error";
    }

    @ExceptionHandler表示的方法的参数,必须在异常类型(Throwable或其子类),不能包含其他类型的参数


    异常处理路径:最短优先
    如果有方法抛出一个ArithmeticException异常,而该类中,有两个对应的异常处理。

    @ExceptionHandler({ArithmeticException.class})
    public String HandlerArithmeticException(Exception e,Model model) {
    System.out.println(e);
    System.out.println("1");
    model.addAttribute("er", e);
    return "error";
    }
    @ExceptionHandler({Exception.class})
    public String HandlerArithmeticException2(Exception e,Model model) {
    System.out.println(e);
    System.out.println("2");
    model.addAttribute("er", e);
    return "error";
    }
    则优先级:最短优先。


    @ExceptionHandler默认只能捕获当前类中的异常方法。
    如果发生异常的方法和处理异常的方法,不在同一个类中:@ControllerAdvice

    总结:
    如果一个方法用于处理异常,并且只处理当前类中的异常:@ExceptionHandler
    如果一个方法用于处理异常,并且处理所有类中的异常:类前加@ControllerAdvice、处理异常的方法前加@ExceptionHandler


    b.
    ResponseStatusExceptionResolver:自定义异常显示页面 @ResponseStatus

    @ResponseStatus(value = HttpStatus.FORBIDDEN,reason = "数组越界222!")
    public class MyArrayIndexOutOfBoundsException extends Exception{
    //自定义异常

    }

    @ResponseStatus也可以标志在方法前:

    @RequestMapping("testMyException2/{i}")
    public String testMyException2(@PathVariable("i") Integer i){
    if (i==3) {
    return "redirect:testResponseStatus.html";
    }
    return "success";
    }
    @ResponseStatus(value = HttpStatus.ACCEPTED,reason = "测试")
    @RequestMapping("testResponseStatus")
    public String testResponseStatus(){
    return "success";
    }

  • 相关阅读:
    lerna管理前端packages的最佳实践
    理解Python闭包,这应该是最好的例子
    Maven 初学+http://mvnrepository.com/
    逆向工程,调试Hello World !程序(更新中)
    github设置仓库可见性 私人仓库设置他人协作/可见
    flink 1.9.0 编译:flink-fs-hadoop-shaded 找不到
    中通消息平台 Kafka 顺序消费线程模型的实践与优化
    以友盟+U-Push为例,深度解读消息推送的筛选架构解决方案应用与实践
    idea新建spring boot项目使用maven引入依赖失败,pom.xml文件中project标签报错
    RabbitMQ (十二) 消息确认机制
  • 原文地址:https://www.cnblogs.com/LEPENGYANG/p/14759649.html
Copyright © 2011-2022 走看看