Struts2とTiles

Struts2でTilesを使用する方法

必要なjarファイルは以下のもの

  • commons-beanutils-1.7.0.jar
  • commons-collections-3.2.jar
  • commons-digester-1.8.jar
  • struts2-tiles-plugin-2.1.6.jar
  • tiles-api-2.0.6.jar
  • tiles-core-2.0.6.jar
  • tiles-jsp-2.0.6.jar


そしてweb.xmlに以下のフィルターを記述

<listener>
    <listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
</listener>


ついでといっては何だがstruts.xmlにも以下を記述

<result-types>
    <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"/>
</result-types>


基本設定は以上で終了。
続いて使用するレイアウト用のJSPと設定ファイルのtiles.xml


tiles.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
    "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
    "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">

<tiles-definitions>
    <definition name="default.layout" template="/WEB-INF/classes/sample/tiles/layout.jsp">
        <put-attribute name="header" value="/WEB-INF/classes/sample/tiles/header.jsp"/>
        <put-attribute name="content" value="/WEB-INF/classes/sample/tiles/content.jsp"/>
        <put-attribute name="footer" value="/WEB-INF/classes/sample/tiles/footer.jsp"/>
    </definition>
</tiles-definitions>
<definition name="default.layout" template="/WEB-INF/classes/sample/tiles/layout.jsp">

でレイアウト用のJSPの指定をし、「default.layout」という名前で宣言します。

<put-attribute name="header" value="/WEB-INF/classes/sample/tiles/header.jsp"/>

でレイアウト用JSP内で使用するJSPを「header」という名前で宣言します。


layout.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
%><%@ taglib uri="/struts-tags" prefix="s"
%><%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"
%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="Content-Style-Type" content="text/css">
    <meta http-equiv="Content-Script-Type" content="text/javascript">
    <meta name="author" content="shhirose">
    <title>Insert title here</title>
</head>
<body>
<tiles:insertAttribute name="header"/>
<tiles:insertAttribute name="content"/>
<tiles:insertAttribute name="footer"/>
</body>
</html>

まずはレイアウト用のJSP

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>

Tilesのタグを使用するためにタグリブ宣言をします。

<tiles:insertAttribute name="header"/>

「header」という名前で設定してあるJSPをこれが記載されている位置に表示します。(tiles.xmlを参照)


main.jsp

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"
%><%@ taglib uri="/struts-tags" prefix="s"
%><tiles:insertDefinition name="default.layout"/>

DOCTYPEやHTMLタグはlayout.jspに記載されているので省略します。

<tiles:insertDefinition name="default.layout"/>

「default.layout」という名前で宣言されているJSPをこれが記載されている位置に表示します。(tiles.xmlを参照)


header.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
%><%@ taglib uri="/struts-tags" prefix="s"
%><div style="border-style:solid;border-color:#00FF00;border-weight:5px;">ヘッダー</div>

とりあえず簡単なものを。
main.jspと同じようにDOCTYPE等は記述しません。
この要領でcontent.jsp、footer.jspを記述していきます。


content.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
%><%@ taglib uri="/struts-tags" prefix="s"
%><div style="border-style:solid;border-color:#0000FF;border-weight:5px;">コンテンツ</div>


footer.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
%><%@ taglib uri="/struts-tags" prefix="s"
%><div style="border-style:solid;border-color:#FF0000;border-weight:5px;">フッター</div>


あとはmain.jspを呼んでください。
そうするとヘッダー、コンテンツ、フッターという文字が表示されたページが表示されると思います。



呼び出しは以下の順?

  1. main.jsp
  2. tiles.xml(default.layout)
  3. layout.jsp
  4. tiles.xml(header)
  5. header.jsp
  6. tiles.xml(content)
  7. content.jsp
  8. tiles.xml(footer)
  9. footer.jsp


直接呼び出せるのはtile.xmlで「definition」タグで指定したものしかできないらしい。
「put-attribute」タグで宣言したものは「definition」タグで指定したJPSを経由しないとエラーになってしまう。
直接layout.jspは呼べないものか・・・。