` : version 3
- web.xml
.. code-block:: xml
*.jsp
false
UTF-8
false
/WEB-INF/views/common/include.jsp
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- | web.xmlの設定で、jspファイル(~.jsp)を読み込む場合、事前にinclude.jspを読み込ませることができる。
.. note::
カスタムタグはtemplate.jspに設定しても問題は無いが、カスタムタグの定義はインクルード用の共通jspファイルに作成することを推奨する。
詳細は :ref:`view_jsp_include-label` を参照されたい。
**レイアウト作成**
レイアウトの枠となるjsp(template)と、レイアウトに埋め込むjspを作成する。
- template.jsp
.. code-block:: xml
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- | 共通的に記述する必要のある内容を(1)より上に記述する。
* - | (2)
- | tiles-definitions.xmlの(6)で指定した ``title`` の値を取得し、 ``titleKey`` に設定する。
* - | (3)
- | タイトルを設定する。
| ``titleKey`` が取得できなかった際は、text属性で定義したタイトルを表示する。
* - | (4)
- | tiles-definitions.xmlで定義した"header"を読み込む。
* - | (5)
- | tiles-definitions.xmlで定義した"body"を読み込む。
* - | (6)
- | tiles-definitions.xmlで定義した"footer"を読み込む。
- header.jsp
.. code-block:: jsp
- createForm.jsp(body部分の例)
開発者は、headerやfooterの余分なソースを記述せずに、body部分のみに集中して記述できる。
.. code-block:: jsp
Create Staff Information
- footer.jsp
.. code-block:: jsp
Copyright © 20XX CompanyName
.. note::
フッターに記載する著作権に関しては :ref:`CreateWebApplicationProjectCustomizeCopyrightOnScreenFooter` を参照すること。
**Controller作成**
ControllerからView名として"staff/createForm"を返却する。
- StaffCreateController.java
.. code-block:: java
@RequestMapping(value = "create", method = RequestMethod.GET, params = "form")
public String createForm() {
return "staff/createForm"; // (1)
}
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- | staffが{1}、createFormが{2}となり、propertiesからタイトル名を取得し、JSPを特定する。
**画面描画**
View名に"staff/createForm"が指定されると、
以下のようにTilesがレイアウトを構築して画面描画を行う。
.. code-block:: xml
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- | 該当するView名が指定された時、親レイアウトである layouts が呼ばれ、テンプレートが /WEB-INF/views/layout/template.jspに設定される。
* - | (2)
- | テンプレート /WEB-INF/views/layout/template.jsp内に存在する ``header`` に WEB-INF/views/layout/header.jspが設定される。
* - | (3)
- | テンプレート /WEB-INF/views/layout/template.jsp内に存在する ``footer`` に /WEB-INF/views/layout/footer.jspが設定される。
* - | (4)
- | staffが{1}、createFormが{2}となり、spring-mvcに取り込まれているpropertiesから ``title.staff.createForm`` をkeyにvalueを取得する。
* - | (5)
- | staffが{1}、createFormが{2}となり、テンプレート/WEB-INF/views/layout/template.jsp内に存在する ``body`` に/WEB-INF/views/staff/createForm.jspが設定される。
結果として上記のtemplate.jspに、header.jsp、createForm.jsp、footer.jspが組み合わされた方法でブラウザに出力される。
.. figure:: ./images/tiles_result.png
:alt: tiles result
:width: 100%
:align: center
|
How to extend
--------------------------------------------------------------------------------
複数レイアウトを設定する場合
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| 実際に業務アプリケーションを作成する場合、業務内容によって表示レイアウトを分けたい場合がある。
| 今回は、スタッフ検索機能の場合、メニューを画面の左側に出す要望があると想定する。
| その設定方法について、 :ref:`TilesLayoutHowToUse` をベースに以下に示す。
**Tilesの定義**
- tiles-definitions.xml
.. code-block:: xml
:emphasize-lines: 7-20
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- | 今回追加するレイアウト構成の親定義。
| 別のレイアウトを使用する場合、difinitionタグのname属性について、既存のレイアウト定義"layouts"と重複しないようにする。
* - | (2)
- | 今回追加するレイアウトについて、描画の際にControllerから返却されたView名がnameのパターンと同じ場合に呼ばれるレイアウト定義。
| View名が"\*/search\*"に該当する場合、このレイアウト定義が読み込まれる。
| extendsしている レイアウト定義"layoutsOfSearch"も適用される。
* - | (3)
- | 今回追加するレイアウトで使用するタイトルを指定する。
| valueはspring-mvcに取り込まれているpropertiesの中から取得する。(以下の説明では application-messages.propertiesに設定する。)
| {1}はControllerから返却されるView名の"\*/search\*"の「\*」の1つ目、"search{2}"はView名の"\*/search\*"の"search\*"に該当する為、先頭が"search"で始まる必要がある。
* - | (4)
- | bodyを定義しているjspファイルの置き場所について、{1}にControllerから返却されるView名の"\*/search\*"の「\*」の1つ目、"search{2}"はView名の"\*/search\*"の"search\*"であるため、先頭に"search"を含んだJSPファイル名が一致するように設計する。
| JSPファイルの置き場所の構成によってvalue属性の値を変更する必要がある。
.. note::
Controllerから返却されるView名がdefinitionタグのname属性のパターンに複数該当する場合、上から順に確認し、1番最初に該当するパターンが採用される。
上記の場合、スタッフ検索画面のView名が、definitionタグのname属性のパターンに複数該当するため、1番上にレイアウト定義している。
- `application-messages.properties`
.. code-block:: properties
:emphasize-lines: 2
title.staff.createForm = Create Staff Information
title.staff.searchStaff = Search Staff Information # (1)
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- | 今回追加するメッセージ。
| "staff"はControllerから返却されたView名の"\*/search\*"の「*」の1つ目。
| "searchStaff"はControllerから返却されたView名の"\*/search\*"の"search\*"に該当する為、先頭が"search"で始まる必要がある。
**レイアウト作成**
レイアウトの枠となるjsp(template)と、レイアウトに埋め込むjspを作成する。
- templateSearch.jsp
.. code-block:: xml
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- | tiles-definitions.xmlで定義した"menu"を読み込む。
| それ以外は :ref:`TilesLayoutHowToUse` と同じ
- styles.css
.. code-block:: css
div#menu { /* (1) */
float: left;
width: 20%;
}
div#searchBody { /* (2) */
float: right;
width: 80%;
}
div#footer { /* (3) */
clear: both;
}
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- | menu部分のstyleを設定する。
| ここでは、float:leftでメニュー画面を左側に寄せて、width:20%として横幅2割で表示をするようにしている。
* - | (2)
- | body部分のstyleを設定する。
| ここでは、float:rightで業務画面を右側に寄せて、width:80%として横幅8割で表示をするようにしている。
| 名前をsearchBodyにしているのは、既存のレイアウトと名前が重複することにより、既存のレイアウトのstyleに影響を与えないためである。
* - | (3)
- | footer部分のstyleを設定する。
| 上記menu部分とbody部分のfloatの効果を初期化している。これにより、menu部分とbody部分の下に表示するようにしている。
- header.jsp
:ref:`TilesLayoutHowToUse` と同じ
- menu.jsp
.. code-block:: jsp
- searchStaff.jsp(body部分の例)
.. code-block:: jsp
Search Staff Information
- footer.jsp
:ref:`TilesLayoutHowToUse` と同じ
**Controller作成**
ControllerからView名として"staff/searchStaff"を返却する。
- StaffSearchController.java
.. code-block:: java
@RequestMapping(value = "search", method = RequestMethod.GET)
public String createForm() {
return "staff/searchStaff"; // (1)
}
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- | staffが{1}、searchStaffが{2}となり、propertiesからタイトル名を取得し、JSPを特定する。
**画面描画**
View名に"staff/searchStaff"が指定されると、
以下のように別のレイアウトを構築して画面描画を行う。
.. code-block:: xml
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- | 該当するView名が指定された時、親レイアウトであるlayoutsOfSearchが呼ばれ、テンプレートが /WEB-INF/views/layout/templateSearch.jspに設定される。
* - | (2)
- | テンプレート /WEB-INF/views/layout/templateSearch.jsp内に存在する ``header`` に WEB-INF/views/layout/header.jspが設定される。
* - | (3)
- | テンプレート /WEB-INF/views/layout/templateSearch.jsp内に存在する ``menu`` に /WEB-INF/views/layout/menu.jspが設定される。
* - | (4)
- | テンプレート /WEB-INF/views/layout/templateSearch.jsp内に存在する ``footer`` に /WEB-INF/views/layout/footer.jspが設定される。
* - | (5)
- | Controllerから返却されたView名が"\*/search\*"に該当する場合、このレイアウト定義が読み込まれる。
| その時、親レイアウトである"layoutsOfSearch"も読み込まれる。
* - | (6)
- | staffが{1}、searchStaffが"search{2}"となり、spring-mvcに取り込まれているpropertiesから ``title.staff.searchStaff`` をkeyにvalueを取得する。
* - | (7)
- | staffが{1}、searchStaffが"search{2}"となり、テンプレート/WEB-INF/views/layout/templateSearch.jsp内に存在する ``body`` に/WEB-INF/views/staff/searchStaff.jspが設定される。
結果として上記のtemplateSearch.jspに、header.jsp、menu.jsp、searchStaff.jsp、footer.jspが組み合わされた方法でブラウザに出力される。
.. figure:: ./images/tiles_result2.png
:alt: tiles result another template
:width: 100%
:align: center
.. raw:: latex
\newpage