二、Spring MVC進級

10884 ワード

2.1、Spring MVC基本構成
Spring MVCのカスタム構成では、WebMvcConfigurerAdapterクラスを継承し、@EnableWebMvc注記を使用してSpring MVCの構成サポートを開始する必要があります.
2.1.1、静的資源マッピング
プログラムの静的ファイル(js、css、image)などに直接アクセスする必要がある場合、addResourceHandlersを構成に書き換える必要はありません.例:
/**
*          (    )
* @param registry
*/
 @Override
 public  void  addResourceHandlers(ResourceHandlerRegistry registry){
   registry.addResourceHandler("/assets/**").
   addResourceLocations("classpath:/assets/");
    }

2.1.2、遮断器の配置
インターセプタ(interceptor)は、サーブレットのFilterと同様に、各リクエスト処理の前後に関連するトラフィック処理を実現する.実装方式としては,通常のBeanにHandlerInterceptorインタフェースを実装させるか,あるいは継承クラスHandlerInterceptorAdapterクラスにカスタムブロッキングを実装させることができる.例:カスタムブロッキングDemoInterceptorは、HandlerIntercepterAdapterを継承します.
package com.dy.springmvc.interceptor;

import org.springframework.lang.Nullable;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Author:dy_bom
 * Description:      Bean
 * Date:Created in   1:10 2018/4/12
 * Copyright (c)  [email protected] All Rights Reserved.
 */

public class DemoInterceptor extends HandlerInterceptorAdapter{
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        long startTime = System.currentTimeMillis();
        request.setAttribute("startTime",startTime);
        return super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        long startTime =(Long) request.getAttribute("startTime");
        request.removeAttribute("startTime");
        long endTime = System.currentTimeMillis();
        System.out.println("         :"+new Long(endTime-startTime) +"ms");
        request.setAttribute("handlingTime",endTime-startTime);
    }
}

構成を追加し、Beanを注入します.
    /**
     *      
     * @return
     */
    @Bean
    public DemoInterceptor demoInterceptor(){
        return new DemoInterceptor();
    }

    /**
     *      
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(demoInterceptor());
    }

2.1.3、@ControllerAdvice
この注記により、コントローラのグローバル構成を同じ場所に置くことができ、@Controllerのクラスを注記する方法は@ExceptionHandler、@InitBinder、@ModelAttributeを使用してメソッドに注記できます.@ExceptionHandler:コントローラ内の例外をグローバルに処理します.@InitBinder:WebDataBinderを設定し、フロント要求パラメータをModelに自動的にバインドします.@ModelAttribute:キー値のペアをModelにバインドします.例:ControllerAdviceのカスタマイズ
package com.dy.springmvc.advice;

import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.ModelAndView;

/**
 * Author:dy_bom
 * Description:            @ControllerAdvice   @Component,     Bean
 * Date:Created in   1:22 2018/4/12
 * Copyright (c)  [email protected] All Rights Reserved.
 */
@ControllerAdvice
public class ExceptionHandlerAdvice {

    /**
     *       ,       
     *
     * @param exception
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    public ModelAndView exception(Exception exception) {
        //error  
        ModelAndView modelAndView = new ModelAndView("error");
        modelAndView.addObject("errorMessage", exception.getMessage());
        return modelAndView;
    }

    /**
     *          
     *            ,
     *     @RequestMapping           
     * @param model
     */
    @ModelAttribute
    public void addAttributes(Model model) {
        model.addAttribute("msg", "    ");
    }

    /**
     *   webDataBinder
     *   request   id
     * @param webDataBinder
     */
    @InitBinder
    public void initBinder(WebDataBinder webDataBinder) {
        webDataBinder.setDisallowedFields("id");
    }
}


2.1.4、その他の構成
1、ショートカットのViewController一部のコントローラでは、以下のような簡単なページジャンプコードがあります.
@Controller
public class HelloController {
    @GetMapping({"/index", "/"})
    public String hello() {
        return "index";
    }
}

以下のようにaddView Controlメソッドを構成で書き換えることができます.
/**
 *         
 *
 * @param registry
 */
 @Override
 public void addViewControllers(ViewControllerRegistry registry) {
     registry.addViewController("/index").
     setViewName("/index");
 }

2.1.5、Spring MVCの高級配置
1、ファイルアップロードプロファイルアップロード機能、Spring MVCはMultipartResolverを構成してファイルをアップロードすることができる.コントローラでMultipartFile fileでファイルを受け取ります.例:MultipartResolverの構成
/**
*     
* @return
*/
 @Bean
public MultipartResolver multipartResolver() {
    CommonsMultipartResolver multipartResolver =
     new CommonsMultipartResolver();
    multipartResolver.setMaxUploadSize(1000000);
    return multipartResolver;
 }

コントローラ:
@Controller
public class UploadController {

    /**
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public @ResponseBody
    String upload(MultipartFile file) {
        try {
            FileUtils.writeByteArrayToFile(new File("/tmp/logs/" + file.getOriginalFilename()), file.getBytes());
            return "OK";
        } catch (Exception e) {
            e.printStackTrace();
            return "wrong";
        }

    }
}

コード:点我下一篇:Spring MVC基礎