Spring-MVC : 1


プロジェクトの作成

  • Spring Legacyプロジェクト
  • を選択
  • Spring MVCプロジェクト
  • を選択
  • のプロジェクトのpomを生成します.xmlのjavaとspringバージョンを変更します.
  • servletバージョンも2.5=>3.1.0バージョンに変更されます.
  • Mavenのコンパイルオプションも1.6に設定され、1.8に変更されました.
    プロジェクトのMavenメニューからUpdate Projectをクリックして更新します.
  • プロジェクトを1回実行し、TomcatのModulesメニューに入ります.
    「/」パスでPathセクションを処理することで、プロジェクトを実行できます.
  • プロジェクトのロード構造について


    web.xml:Tomcatドライバの設定
    root-context.xml, servlet-context.xml:この2つのファイルはspringに関連する設定です.
    web.xml
    context-paramにはroot-contextが含まれています.xmlのパスが設定されています.
    root-context.xmlファイルを処理した後、root-context.xmlファイルのbean(オブジェクト)設定が役立ちます.
    root-conext.xmlで定義したオブジェクトはスプリングの領域内で作成され、オブジェクト間の依存性が処理されます.
    ContextLoaderListener Springコンテナを作成します.
    Springはすべてのサーブレットとフィルタを共有する役割を果たしているそうです.
    root-context.xmlのbeans図の画像.
    ホテル、レストラン、シェフの依存性が扱われています.
    root-context.xmlの処理が完了すると、DispatcherServiceletに関する設定が有効になります.
    まずこの絵を見てから行きましょう.

    DispatcherServiceletの動作原理

  • ユーザの要求はDispatcherServiceletによって処理される.
  • Handlerマッピングは、要求の処理を担当するコントローラを探すために存在する.
    HandleMappingインタフェースを実現する複数のオブジェクトのうち,RequestMappingHandleMappingのような場合は,@RequestMapping操作を適用したことによって開発者が判断する.
    適切なコントローラが見つかった場合は、HandlerAdapterを使用して操作します.
  • コントローラは、実際のリクエストを処理するロジックを記述するために開発者が作成したクラスです.
    この場合,Viewに渡す必要があるデータは主にModelというオブジェクトに含まれる.
    コントローラは異なるタイプの結果を返し、この処理にはviewResolverを使用します.
  • ViewResolverは、コントローラが返す結果をどのビューで処理すべきかを説明します.<今すぐここまでやりましょう.>
  • ビューは、Jspなどのツールを使用して、実際に応答を送信する必要があるデータを生成することができる.
    生成された応答はDispatcherServiceletによって送信されます.
  • DispatcherServicelet*Front-Controllerモード
    すべての要求はDispatcherServiceletによって設計され、この方式はFront-Controllerモードである.
    「Front-Controller」モードを使用すると、すべてのリクエストの処理が指定された方法で割り当てられます.
    これらの特徴は厳密な構造を生み出すことができる.

    スプリングMVCを使用して作成されたコントローラの特性

  • HttpServeretRequest、HttpServeretResponseをほとんど必要としない機能を実現
  • 複数種類のパラメータ化処理、複数種類の回収可能
  • GetとPost,
  • 継承、
  • インタフェースではなく@Artimationのみに設定

    Controller


    @ControllerというSpring MVCで使用される@ArnotationをExControllerに適用します.
    作成したExControllerクラスは、自動的にスプリングのオブジェクト(bean)として登録されます.
    この部分はservlet-contextです.xmlファイルを見ればわかります.
    これはservlet-contextですこれはxmlの一部です.
    com.xml.実際には、mvcプロジェクトを作成するときにデフォルトで生成されるパッケージで、HomeControllerが含まれています.
    SpringMVC作成時com.velog.ioというパッケージがあり、そのパッケージの下にHomeControllerがあります.
    root-context.xml, servlet-context.xml
    この2つのxmlファイルはcomponent-scanを行います.
    パッケージで宣言されたクラスをスキャンするときに、スプリングでオブジェクト(bean)を設定します.
    @これらのツールを持つクラスを理解し、必要に応じてオブジェクトとして作成して管理します.
    クラスがスプリングで管理されている場合、クラスの横に図に示すように「s」シェイプのアイコンが追加されます.

    @RequestMapping


    現在のクラス内のすべてのメソッドのデフォルトURLのパスです.
    ex)TestControlクラスでは、
    @ResquestMapping(“/sample/*”).
    /sample/aaa
    /sample/bbb
    どちらのパスもACControllerで処理されます.
    @Controllerは他の属性を指定できません.
    @RequestMappingの場合は、いくつかのプロパティを追加できます.
    RequestMapping(value="/basic", method=RequestMethod.GET)
    でも今はこの方法より.
    @GetMapping("/basic")
    @PostMapping("/basic")と書きます.
    GetとPostを同時にサポートする必要がある場合は、
    @RequestMapping(value="/abc", method={RequestMethod.GET, RequestMethod.Post})

    コントローラからパラメータを収集


    サンプルのSamDTOクラスを作成します.
    @Data
    public class SamDTO{
    	private String name;
        private int age;
    }
    Lombokの@Data操作を使用してgetter/setter、equals()、toString()を作成します.
    @Controller
    @RequestMapping("/sample/*")
    @Log4j
    public class TestController{
    	@GetMapping("/ex01")
            public String ex01(SamDTO dto){
    				log.info(""+dto);               
                    return "ex01";
           }
     }
    ACControllerのメソッドがSamDTOをパラメータとして使用している場合.
    SamDTOのsetterメソッドは、自動的に操作され、パラメータが収集されます.
    ACcontrollerのパスは「/sample*」です.
    ただしex 01()メソッドではGetMappingが設定されている.
    呼び出されたパスはsample/ex 01です.
    必要なパラメータはURLの後ろにありますか?「name=AAA&age=10」という形でコールを追加すると、
    以下のログが記録されます.
    INFO : packageName.AController-SamDTO(name=AAA, age=10)

    パラメータの収集と変換


    @Controllerがパラメータを収集する方法は、パラメータタイプに応じて自動的に変換されます.
    ex>の上記の例では、intタイプとして宣言されたage(SamDTO)が自動的に数値に変わります.
    @RequestParam
    基本資料型や文字列などを使用する場合は、パラメータタイプのみを宣言する方法を使用します.
    ex 02()メソッドは、@requestParam宣言を使用してパラメータに記述されます.
    @requestParamパラメータで使用する変数名と渡されたパラメータ名が異なる場合に便利です
    @RequestParamを使用する場合.
    @GetMapping("/ex02")
    public String ex02(@RequestParam("name") String name,
    	           @RequsetParam("age") int age){
                   					log.info("name:"+name);
                                    		log.info("age:"+age);
                                       		return "ex02";
                                            }
    @RequestParamを使用すると、List、Array配列も処理できます
    @GetMapping("/ex02List")
    public String ex02List( @RequestParam("ids")ArrayList<String> ids){
    
    	log.info("ids: "+ids);
        	return "ex02List";
    スプリングは、パラメータのタイプを表示し、オブジェクトを作成します.
    パラメータのタイプは、実際のArrayListクラスとして指定され、Listクラスではありません.
    このコードに対しては、「ids」というパラメータが複数渡されても、ArrayListが生成されて自動的に収集される.
    /sample/ex02List?ids=111&ids=222&ids=333.
    INFO:パッケージ.コントローラ-ids:{111222333}
    これでログが撮れます
    次に、オブジェクト自体をリストとして作成して処理します.
    SamListDTO.Javaでオブジェクトを作成します.
    @Data
    public class SamListDTO{
      private List<SamDTO> list;
      
      public SamListDTO(){
      		list = new ArrayList<>();
      	}
      }
    Controller.java
      @GetMapping("/ex02Bean")
      public String ex02Bean(SamListDTO list){
      	log.info("list dtos: "+list);
      	return "ex02Bean";
      }
    URLプロジェクトパス/sample/ex 02 beanをテストしますか?list[0].name=aaa&list[2].name=bbb
    []Tomcatバージョンによっては、このセクションでエラーが発生する可能性があります.
    ==>/sample/ex02Bean?list%5B0%5D.name=aaaと呼ぶと
    INFO:パッケージ.コントローラ-listdtos:SamList=[SamDTO(name=aaa,age=0)
    これでログが撮られていることを確認できます.

    @DateTimeFormat


    パラメータとして使用されるインスタンス変数に@DateTimeFormatを適用してタイプ変換できます.
    @Data
    public class TodoDTO{
      private String title;
      
      @DateTimeFormat(pattern="yyyy/MM/dd")
      private Date dueDate;
    }
    Test URL : localhost:~/sample/ex03?title=testFile&dueDate=2018/01/01
    INFO : package.Controller - todo: TodoDTO(title=testFile, dueDate=Mon Jan 01 00:00:00 KST 2018
    これでログが撮られていることを確認できます.
    注意:Spring Webプロジェクトのコード学習