読者です 読者をやめる 読者になる 読者になる

Sprng4勉強会
    脳内変換対象
        Spring4勉強会 第三回
            MemoValidator.java作成時に@override指定できずにエラーになる
            プロジェクトを選択⇒プロパティ―⇒javaコンパイラー⇒jdk準拠~直下のチェックボックスを外し、
            コンパイラー準拠レベルを1.7にする⇒適用⇒OK
            問題パースペクティブのエラーを選択⇒右クリック⇒クイックフィックスで1.7にする

        Spring4勉強会 第四回
            pom.xmlの修正
                <spring-jdbc.version>4.0.6.RELEASE</spring-jdbc.version>
                ~
                <CommonsDbcp.version>2.1</CommonsDbcp.version>
                ⇒propertiesタグの中に書くこと。

                <!-- MyBatis -->
                ~
                </dependency>
                ⇒dependenciesタグの中に書くこと

SpringTips
    Controllerメソッドの呼び出し戻り値=jspのファイル名

    Maven
        javaプロジェクト管理ツール
        今まで手作業で行っていたダウンロードや、プロジェクトのビルドをpom.xmlに記載することで自動化してくれる

    コンテキスト
        アプリケーションの配置場所や呼び出し方などの情報

    入力値検証(Validation)

    注意点
        <context:component-scan base-package="jp.co.kenshu"/>
        ⇒ページ上ではscan baseの間が空いてないからエラーになる

        form:fromのmodelAttributeに指定する値と、実際にControllerでバインドさせるFormオブジェクトは名前を一致させる
            jsp
                <form:form modelAttribute="testForm">
            controller
                TestForm form = new TestForm();
                model.addAttribute("testForm", form);

        pathに指定する値はFormオブジェクトのプロパティ名/フィールド名と合わせる
            jsp
                <form:input path="id"/>
                ※<input id="id" name="id" type="text">
            TestForm
                private int id;

    SpringMVCではFORMで送信される情報専用のFORMオブジェクトを用意し、リクエストオブジェクト
    から直接データをやり取りすることはない

    スクリプト言語
        インタープリター言語(事前コンパイル不要言語)

    Spring FormタグのTips
        <form:form>タグ
            actionパラメーターを省略すると自身に飛ぶ
            ⇒action="/SpringKenshu/show"

            methodを省略した場合はPOST扱い
            
            modelAttribute="testForm"と記載すると、id属性にtestFormが指定

        <form:checkboxes>タグ
            pathに指定するフィールドはString[]。
            ⇒中にはチェック状態にしたいチェックボックスを指定する。

    PRG (POST-REDIRECT-GET) 
        redirectする場合は、「redirect:」と書いて、その後に遷移先を書くだけです。
        return "redirect:/test/";

    Dto(Data Transfer Object)
        プロセスまたはネットワークの境界を越えて転送する必要がある
        集計データの集合に対する単純なオブジェクト

        Formクラスだと必要以上のデータを格納する為、
        Formを使用してデータを管理すると、同じJSPを何度も使用する際、不要なデータを削除する処理を
        入れなければならない。
        DTOを使えば、必要な情報だけ格納できるし、処理効率も良くなるし、ほかの人から見てもわかりやすい

        特徴:
            implements Serializableされる必要がある

    @Autowired
        DI(Dependency Injection)
            依存性の注入
            依存性:クラス間でのオブジェクトの関係している状態
            注入:「外部からの設定(Configuration)」を意味

            DIを使うと、プログラム中でnew(インスタンス化)することなく、
            インターフェースを使って実クラスをインスタンス化します
            方法:
                外部(DIコンテナ)からインスタンスを注入(生成)する。xmlにその設定を記述する。

            DIを導入する目的・メリット
                * クラス間の依存を排除する
                => オブジェクト間の疎結合にする。
                    ※ 疎結合とは、コンポーネント同士の結びつきが比較的緩やかで、独立性が強い状態のこと
                      緩やかにつなぐためにXMLなどの技術を利用する
                => そのため、変更に強い
                * 分業で開発しやすくなる
                * アプリケーションのコンポーネント(何らかの機能を持ったプログラムの部品)化を促進すること
                * モックツールを使って、単体テストがとてもやりやすくなる

Springの構成
    「src」フォルダ(開発するときはここだけ意識)
        ソースコードを配置します。Javaだけでなく、JSPやHTML,imgなども、この中にまとめられます。
        mainフォルダ
            プログラム本体
        resourseフォルダ
            xml等のリソース関係
        WEB-INF
            非公開ディレクトリ
            viewフォルダ
                MVCのViewが格納
    「target」フォルダ
        アプリケーションのデータです。自動生成されます。
    「.settings」フォルダ
        プロジェクトの設定ファイルが格納されてます。STS(Spring Tool Suite)によって作成されます。
    pom.xml
        Mavenのビルド設定ファイルです。

Springの流れ(ざっくり)
    ブラウザがURLを指定してリクエストを投げる
    例)http://localhost:8080/SpringKenshu/show
    
    @Controllerアノテーションがついたjavaファイルの中から、
    "/SpringKenshu/show"へのマッピングが指定されたファイルを見つけ、
    パッケージ名を保持
    package jp.co.kenshu;

    リクエストに該当するマッピング指定のメソッドを呼び出し
    例)@RequestMapping(value = "/show", method = RequestMethod.GET)
      public String showMessage(Model model){return "showMessage"}

    mvc-config.xmlから、先程保持したパッケージ名のノードを検索
    <context:component-scan base-package="jp.co.kenshu"/>

    Controllerの戻り値を
    mvc-config.xmlのprefix,suffixと掛け合わせてjspの場所を特定、呼び出し
    内部処理:(view.setUrl(getPrefix() + viewName + getSuffix());)
            <property name="prefix" value="/WEB-INF/view/"/>
            <property name="suffix" value=".jsp"/>
    ⇒"/WEB-INF/view/" + "showMessage" + ".jsp"

Springのページ作成方法
    Controller作成
        ・@Controllerアノテーション(メタデータ)をクラスに付与したクラスを作成
        ・メソッドに
         @RequestMapping(value = "/hogehoge", method = RequestMethod.GET)
         をアノテーションを付与したString型を返すメソッドを作成
         ※@RequestMapping valueを指定することで、住所を指定している。
          "/hogehoge"の場合、
          コンテキストルート(プロジェクト名)/hogehogeにアクセスされたときに使用する
          コントローラーであることをSpringに教えている
         ※returnする文字列は、この文字列でviewクラスを探索しにいく。
          この文字列に該当するViewファイル名をフレームワークが探しにいき、あればそのテンプレートを返却するという動きをします。

        ・Modelクラス
         ⇒Viewとの橋渡しをするためのクラス。
          addAtributeはModelインスタンスに属性を追加し、内部ではsessionに値を登録しています。
          第一引数には属性のkey値を、第二引数には値をそれぞれ指定します。
          ⇒なぜaddAtributeしたものが画面に表示されている?

        作成例)
        @Controller
        public class TestController {
            @RequestMapping(value = "/show", method = RequestMethod.GET)
            public String showMessage(Model model) {
                model.addAttribute("message", "hello world!!");
                return "showMessage";
            }
        }

    mvc-config.xmljspファイルとのマッピングルールを記載する
        作成例)
        ↓はSpringKenshuプロジェクトがどこのパッケージ下をControllerとして認識するか指定している
         <context:component-scan base-package="jp.co.kenshu"/>
          <mvc:annotation-driven />
          <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
           <!-- Example: a logical view name of 'showMessage' is mapped to '/WEB-INF/jsp/showMessage.jsp' -->
           <property name="prefix" value="/WEB-INF/view/"/>
           <property name="suffix" value=".jsp"/>
        </bean>
    
Validation作成時の注意点
    Form
        Integer型にはNotEmptyは指定できない。NotNullが正しい。
        @NotNull
        private Integer age;
    Controller
        ⇒引数の先頭に@Valid(入力値検証対象オブジェクトの明示用アノテーション)を付けること
         入力値を検証するオブジェクトのすぐ後ろにBindingResultを宣言すること
        〇public String list(@Valid @ModelAttribute EmployeeListForm form, BindingResult result, Model model) {}
        ×public String list(@Valid @ModelAttribute EmployeeListForm form, Model model, BindingResult result) {}
    JSP
        BindingResultがhasErrorsの時にのみ、値を出力させる指定
        <form:errors path="*"  />
        「path="*"」とすることで、Formクラスの全てのプロパティを参照する。

独自Validationを作成する方法
    Validation用のクラスを作成する(ここではMemoValidatorクラスとする)
        ConstraintValidator<Memo, String>を実体化し、
        isValidメソッドで具体的なチェック処理を記載する

    アノテーションを自作する
        Validation用のクラスをインポートしたアノテーションを作成
        @Constraint(validatedBy = MemoValidator.class)

    日本語エラーメッセージ定義を指定する
        Memo={0}は文字列のみを指定してください

    アノテーションを付与する。
        @Memo
        private String memo;

    ※validationの{0}にフィールド名ではなく、日本語名を当て込む方法
        日本語エラーメッセージ定義に、このプロパティ名が来たらこのように定義する、というように変換処理を書いておく
        NotEmpty={0}は必須です
        name=名前