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.xmlにjspファイルとのマッピングルールを記載する
作成例)
↓は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=名前