ITEEDU

Struts Gossip: 使用XML管理模版资源

在Tiles中,您可以使用XML或是JSP来管理版面配置的相关资源,这边先介绍使用XML定义档的方式,如之前主题所定义的,定义档是tiles-defs.xml,在当中如下撰写:
tiles-defs.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">
<tiles-definitions>

<definition name=".myLayout" path="/tiles/myLayout.jsp">
<put name="title" value="Sample Page Title" />
<put name="header" value="/tiles/header.jsp" />
<put name="menu" value="/tiles/menu.jsp" />
<put name="footer" value="/tiles/footer.jsp" />
<put name="body" value="/tiles/body.jsp" />
</definition>

</tiles-definitions>
在<definition>卷标中,我们指定了版面配置的JSP页面,也就是path属性所指定的 myLayout.jsp,name属性表明这个版面配置的名称,而在接下来的<put>标签中,我们指定了内容页面的名称与JSP页面实际 的位置。

Tiles的定义档可以支持国际化,您可以复制以上的内容,撰写在tiles-defs_zh.xml中,并将encoding改为Big5,就可以在定义档中使用中文,例如:
tiles-defs_zh.xml
<?xml version="1.0" encoding="Big5" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">
<tiles-definitions>
<definition name=".myLayout" path="/tiles/myLayout.jsp">
<put name="title" value="Tiles范例" />
<put name="header" value="/tiles/header.jsp" />
<put name="menu" value="/tiles/menu.jsp" />
<put name="footer" value="/tiles/footer.jsp" />
<put name="body" value="/tiles/body.jsp" />
</definition>
</tiles-definitions>
其中myLayout.jsp的内容如下:
myLayout.jsp
<%@taglib prefix="tiles" uri="/tags/struts-tiles"%> 
<html>
<head>
<title><tiles:getAsString name="title"/></title>
</head>
<body>

<table border="0" width="100%" cellspacing="5">
<tr>
<td colspan="2">
<tiles:insert attribute="header"/>
</td>
<tr>
<tr>
<td width="140" valign="top">
<tiles:insert attribute="menu"/>
</td>
<td valign="top" align="left">
<tiles:insert attribute="body"/>
</td>
</tr>
<tr>
<td colspan="2">
<tiles:insert attribute="footer"/>
</td>
</tr>
</table>

</body>
</html>
这个版面配置网页中主要使用表格来切割版面,Tiles卷标可以从attribute属性得知对应于XML定义档的真正JSP页面,例如header将被 实际取代为header.jsp的内容,您可以自行完成其它的JSP页面内容。

接下可以开始使用定义好的版面配置,例如在welcome.jsp中如下撰写:
welcome.jsp
<%@page contentType="text/html; charset=big5"%> 
<%@taglib prefix="tiles" uri="/tags/struts-tiles"%>
<tiles:insert definition=".myLayout" flush="true"/>
在<tiles:insert>标签中指定我们将使用.myLayout的版面配置定义,如果您连上welcome.jsp,则实际上您 会看到以下的内容:
 <html> 
 <head><title>Tiles范例</title></head> 
 <body> 

 <table border="0" width="100%" cellspacing="5"> 
 <tr> 
    <td colspan="2"> 
 <center><h1>Tiles测试范例<h1> 
    </td> 
 <tr> 
 <tr> 
    <td width="140" valign="top"> 
 选单一<br>
 选单二<br> 
 选单三<br> 
    </td> 
    <td valign="top" align="left"> 
 Tiles提供一个类似于窗口程序版面管理的机制,透过定义档,您可
以定义版面配置,以及当中所要置入的内容网页,内容与版面配置的
标签可以分离,您可以随时抽换每一个内容网页,也可以重用每一个
版面配置。 
    </td> 
 </tr> 
 <tr> 
    <td colspan="2"> 
 <center>版权所有(c)http://www.caterpillar.onlyfun.net/
    </td> 
 </tr> 
 </table> 
 
 </body> 
     </html>
  如果您将来要改变版面配置的方式,您可以直接修改tiles-defs.xml中path所指向的Layout页面,就如同您在窗口程序中改变版面管理员 一样,如果您要修改指向的内容网页,也只要更改tiles-defs.xml中相对应的设定,所有的更改集中于Tiles设定档中加以管理,达到将版面配 置与内容分离的目的。

您可以扩充某个定义,重新定义当中所管理的页面资源,一个例子如下:
tiles-defs_zh.xml
<?xml version="1.0" encoding="big5" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">

<tiles-definitions>
<definition name=".myLayout" path="/tiles/myLayout.jsp">
<put name="title" value="Tiles范例" />
<put name="header" value="/tiles/header.jsp" />
<put name="menu" value="/tiles/menu.jsp" />
<put name="footer" value="/tiles/footer.jsp" />
<put name="body" value="/tiles/body.jsp" />
</definition>
<definition name=".myLayout2" extends=".myLayout">
<put name="title" value="Tiles范例二" />
<put name="header" value="/tiles/header2.jsp" />
</definition>
</tiles-definitions>

在上面的定义中,.myLayout2扩充自.myLayout,并重新定义了title与header两个属性,其它未重新定义的属性将直接继承自. myLayout。