更多的配置

配置DispatcherServlet

@Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
        registration.setMultipartConfig(
                new MultipartConfigElement("./")
        );

    }

配置Servlet与Filter

@Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);

        var a=servletContext.addServlet("my-servlet",MyServlet.class);
        a.addMapping("/my");

        var b= servletContext.addFilter("my-fliter",MyFliter.class);

        b.addMappingForUrlPatterns(null,false,"/*");

    }

处理multipart 数据

必要前提

  • form表单的enctype取值必须是:multipart/form-data
  • method属性取值必须是Post
  • 提供一个文件选择域 < input type = ”file” />

使用

  • 配置multipart解析器
    • StandardServletMultipartResolver
    • CommonsMultipartResolver
@Bean
    public MultipartResolver multipartResolver(){
        return new StandardServletMultipartResolver();
    }
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
  • 处理multipart 请求
@RequestMapping("/upload")
    @ResponseBody
    public String upload(@RequestPart("file")MultipartFile file) throws IOException {
        FileUtils.writeByteArrayToFile(new File("d:/"+file.getOriginalFilename()),file.getBytes());
        return "上传完成";
    }
<form action="./upload" enctype="multipart/form-data" method="post">
    <input type="file" name="file">
    <input type="submit">
</form>

处理异常

  • 自定义异常
@ResponseStatus(value = HttpStatus.NOT_FOUND,reason = "未找到")
public class MyException extends RuntimeException{ }
@RequestMapping("/home")
    public String hello(Model model){

        model.addAttribute("time", LocalDate.now());
        if (true)
        throw new MyException();
        return "home.html";
    }

定义异常处理

public class MyExceptionHandler implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        try {
            response.getWriter().println(ex.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
<bean id="handlerExceptionResolver" class="MyExceptionHandler"/>
  • 异常处理器
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Object handler(Exception e){
      return e.getMessage();
    }
    

控制器通知

本质:对Controller进行AOP

// 所有的controller发生异常都会通过这个类进行处理
@ControllerAdvice
public class MyControllerAdvice {

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Object handler(Exception e){
        return e.getMessage();
    }
}

请求重定向转发数据

forward(服务器转发)与redirect(客户端重定向)

重定向传递数据的方法

  • url传递
  • flash属性传递

拦截器

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("进入controller前执行");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("完成controller方法后执行");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("请求完成执行");
    }
}
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="wang.ismy.spring.mvc.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

results matching " "

No results matching " "

results matching " "

No results matching " "