1.スプリングMVCを深く理解する(MVCモードへのサポート)


1.SpringMVCコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラのサポート
SpringMVCコントローラの核心はDispactch Servletです.
Displatch Servletの役割:
  • Model処理ロジックの検索(HandlerMapping)
  • Model処理ロジックの実行(Handler)
  • Viewのレンダリング
  • 1.1プロセッサコントローラの検索
    1.1.1直接URLマッピングHandler
    このマッピング方式は、springにSimpleUrlhandlerMappingタイプを登録するBeanによって実現される.
    @Configuration
    public class HandlerMappingConfig {
    
        @Bean
        public SimpleUrlHandlerMapping simpleUrlHandlerMapping(){
            SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
            //   url handler     ,    map
            mapping.setUrlMap(Collections.singletonMap("/url1",Handler));
            return mapping;
        }
    }
    
    1.1.2 beanName(Handler)によるURLマッピング
    このマッピング方式は、ビーンのnameまたは別名が/で始まると、このビーンは自動的にHandlerのマッピングパスとして、URLはビーンのnameまたは別名であり、Handlerはこのビーン自体である.この自動登録のロジックはBeanNameUrlHanlerMappingで発生します.
    //   
    public class BeanNameUrlHandlerMapping extends AbstractDetectingUrlHandlerMapping {
        public BeanNameUrlHandlerMapping() {
        }
    
        protected String[] determineUrlsForHandler(String beanName) {
            List<String> urls = new ArrayList();
            //   beanName   /  
            if (beanName.startsWith("/")) {
                urls.add(beanName);
            }
    
            String[] aliases = this.getApplicationContext().getAliases(beanName);
            String[] var4 = aliases;
            int var5 = aliases.length;
    
            for(int var6 = 0; var6 < var5; ++var6) {
                String alias = var4[var6];
                if (alias.startsWith("/")) {
                    urls.add(alias);
                }
            }
    
            return StringUtils.toStringArray(urls);
        }
    }
    
    登録方式は以下の2種類があります.(1)configration注釈類にbeanを入れます.
     	@Bean(name={"/url1","url2"})
        public HttpRequestHandler beanNameHandler(){
        	//      handler
            return new BeanNameUrlRequestHandler();
        }
    
    (2)Component注解を使ってbeanを取得する
    @Component()
    public class BeanNameUrlRequestHandler{
    	...
    }
    
    1.1.3 Request Mappingマッピング
    これは最も一般的なマッピングの使用方法であり、そのHandler検索戦略はRequest MappingHandlerMappingによって実現される.
    1.2プロセッサ実行
    Handlerの検索と実行は分離されています.いくつかの一般的なHandlerを紹介します.
    1.2.1 HttpRequest Handler
    これは最も簡単なHandlerであり、一つの方法しかないHandleRequestは、HttpServletRequestとHttpServletResonseの2つのパラメータが入ってきています.しかも、リターン値がないので、reponseオブジェクトを通じて内容を返します.
    インターフェース:
    public interface HttpRequestHandler {
        void handleRequest(HttpServletRequest request, HttpServletResponse response);
    }
    
    使用:(1)まずHttpRequest Handlerの実装クラスを作成します.
    public class MyRequestHandler implements HttpRequestHandler {
        @Override
        public void handleRequest(HttpServletRequest request, HttpServletResponse response){
            response.getWriter().write("hello httpRequestHandler");
        }
    }
    
    (2)関連mappingを使用して、このhandlerを検索できるようにする:
    @Configuration
    public class HandlerMappingConfig {
    
        @Bean
        public SimpleUrlHandlerMapping simpleUrlHandlerMapping(){
            SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
            //   url handler     ,    map
            mapping.setUrlMap(Collections.singletonMap("/url1",new MyRequestHandler()));
            return mapping;
        }
    }
    
    このHandlerはビュールックアップ解析などの流れはないが、解析を必要としない静的リソースのいくつかに対しては、このhandlerを使用して実現することができる.
    1.2.2 ControllerインターフェースのHandler
    このHandlerはMVCで定義されたControllerにより近いです.同じようにhandleRequest法と同じパラメータしかありませんが、その戻り値はModelAndViewオブジェクトで、ModelとViewが封入されています.
    @Component("/myController")
    public class MyController implements Controller {
    
    
        @Override
        public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
            Map<String,Object> model = new HashMap<>();
            model.put("name","123");
            return new ModelAndView("defaultView",model);
        }
    }
    
    1.2.3 Request Mapping定義のHandlerMethod
    このタイプのhandlerは、まずRequest MappinghandlerMappingで条件を満たす@Request Mappingを検索し、それを表示する方法をHandlerMethodオブジェクトHandlerMethodオブジェクトにパッケージします.SimpleUrlandlerMappingで組み合わせて使用することもできますが、一般的にはRequest Mappleppingと組み合わせて使用されます.
    1.3インターセプター
    Handlerを検索するとき、HandlerMappingはHandler自体に戻るのではなく、Handlerの実行チェーンHandler Execution Charinに戻ります.この実装チェーンは、このHandler上のすべてのブロックに適用する必要があります.
    実行プロセス:
  • は、プロセッサhandlerを実行する前に、Handler IntercepterのpreHandle方法を実行します.この方法がfalseに戻ると、処理の流れが中断される.
  • はプロセッサHandlerを実行し、Handlerを実行した後、2つの結果があります.
  • 正常にHandlerを実行したら、ブロックのpostHandleの方法を実行します.例外を出すと、この方法はスキップされます.
  • 異常が発生しているかどうかにかかわらず、最終的にはafterCompration方法を実行します.
  • 2.Spring MVCモデル(Model)へのサポート
    2.1 Modelモデルの関連タイプ
  • Mapインターフェース
  • Modelインターフェース:属性の追加、マージ属性などの機能を提供しています.このインターフェースはMapを実現していませんが、asMap方法を使用してmap
  • に変換することができます.
  • ModelMapインターフェース:LinkdHashMapクラスを継承し、このインターフェースのすべての方法は、Mapのput方法によって、属性追加動作
  • を実現する.
  • RedirectAttributesインターフェース:Modelインターフェースから継承され、このインターフェースはリダイレクトパラメータに特別な方法を提供し、addFlash Attributeを介してリダイレクトが使用できるModelパラメータを追加します.
  • 2.2モデルの使用
    1.Mapのタイプパラメータを宣言する
      	@RequestMapping("/testUrl")
        public String mapParams(Map<String,Object> map){
    
            map.put("name",123);
            return "defaultView";
        }
    
    2.Modelのタイプパラメータを宣言する
    	@RequestMapping("/testUrl")
        public String modelParams(Model model){
            model.addAttribute("name",123);
            return "defaultView";
        }
    
    3.ModelMapタイプのパラメータModelMap自体はMapタイプと宣言していますが、Modelオープンインターフェース方法を使ってデータを操作することもできます.
    	@RequestMapping("/testUrl")
        public String modelMapParams(ModelMap modelMap){
            modelMap.put("name",123);
            modelMap.addAttribute("name",123);
            return "defaultView";
        }
    
    4.自分でModelを作成して戻る
    	@RequestMapping("/defaultView")
        public Map createModel(){
            Map<String,Object> model = new HashMap<>();
            model.put("name",123);
            return model;
        }
    
    ここではビデオではなくmodelオブジェクトを返しますので、ビューの名前はルートurlから来ています.ここのurlはdefault Viewです.だから、ビューの名前はdefault Viewです.
    5.@ ModelAttribute方式この方式は同様に戻り値を取ってmodelに入れます.属性名は@ModelAttributeコメントの名称で、値は方法の戻り値です.
    6.直接ModelAndViewに戻る
     	@RequestMapping("/testUrl")
        public ModelAndView createMV(){
            ModelAndView mv = new ModelAndView();
            mv.setViewName("/defaultView");
            mv.addObject("name",123);
            return mv;
        }
    
    3.SpringMVCのビューへのサポート
    3.1ビュータイプ
    (1)内部リソースビューInternal Resource View:このビューは内部リソースを表しています.このビューを作成するには、内部リソースの経路を示すためにURLが必要です.一般的なリソースのタイプは、静的リソース、JSPビュー、転送ビューの3つのビュー遷移が、対応する経路Request Displatchを取得することによって達成される.
    転送ビューの例:
     	@RequestMapping("/testUrl")
        public String forwardView(Model model){
        	//     ,springmvc  request.setAttribute model       request 
            model.addAttribute("name",123);
            return "forward:forwardTargetView";
        }
    
    	@RequestMapping("/forwardTargetView")
        public String targetView(HttpServletRequest request,Model model){
        	//     request,  model    
            String name = (String)request.getAttribute("name");
            model.addAttribute("name",name + 123);
            return "defaultView"
        }
    
    (2)リダイレクトビュー
    	@RequestMapping("/testRedirect")
        public String redirectView(RedirectAttributes model){
            model.addAttribute("name",123);
            return "redirect:redirectTargetView";
        }
    
    3.2ビューの検索解析
    SpringMVCはView Resoloverインターフェースを提供して、ビュー名を検索して解析するためのビューを提供しています.このインターフェースは、resoveView Name方法があり、Viewビューに戻ります.
    public interface ViewResolver {
    	/**
    	* params: 
    	* 	viewName:     
    	* 	locale:    ,   
    	*/
        View resolveViewName(String viewName, Locale locale throws Exception;
    }
    
    3.2.1 BenNameを通じてビューを検索する
    このようにviewビューを検索するにはspring容器のbeanとして宣言する必要があり、この解析方式はBenNameView Resolaverを通じて実行され、この方式は声明のbeanにviewインターフェースを実現するように要求される.
    //    /testUrl ViewName
    @Component("testUrl")
    public class CustomerView implements View {
        @Override
        public String getContentType() {
            return MediaType.TEXT_HTML_VALUE;
        }
    
        @Override
        public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
            Object name = model.get("name");
            response.getWriter().write("name is " + name);
        }
    }
    
    3.2.2テンプレートエンジン解析ビュー(Thymeleafを例にして)
    各テンプレートエンジンには自分のビュー解像器があり、spring-boot-starter-freemarrを導入した後、自動的にThymeleafViewResoloverをSprigMVCに生成します.デフォルトではこの解像度はクラスパス:/templates/をプレフィックスとして使います.
    spring.thymeleaf.prefix =     
    spring.thymeleaf.suffix =     
    
    3.2.3内部リソースビューの解析
    3.2.4直接指定ビュー
     	@RequestMapping("/testUrl")
        public View returnView(Model model){
            model.addAttribute("name",123);
            return new CustomerView();--->   View       
        }