` : 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