Struts2讲义45(转载)

10.2  sitemesh 高级应用

在之前小节中笔者简单介绍了一些 sitemesh 中特有的装饰标签。在本节中继续介绍开发中比较实用的几个 sitemesh 装饰标签,其目的是让读者能针对 Struts2 页面布局有更深刻的认识。

10.2.1   <page:applyDecorator> <decorator:getProperty> 标签的使用介绍

技术要点

运用本小节标题两个标签的目的如下:前者是允许开发者可以自行选择使用哪一个装饰器视图界面。后者是让指定的装饰器页面中定义的参数在被装饰的视图界面中显示参数值内容。

<page> 标签的介绍和相关注意点。

读取装饰器页面的参数值内容,并显示在被装饰页面的使用方式介绍。

演示代码

定义可以由开发者自行指定的装饰器视图界面的代码:

Java代码 Struts2讲义45(转载)
  1. <!--------------------文件名:decorators.xml --------------->   
  2. …………   
  3.   <!-- 定义装饰器,该装饰器没有被指定可装饰的视图界面,而是在视图界面中来制定需要它装饰的视图界面-->   
  4.   <decorator name="panel" page="panel.jsp"></decorator>   
  5. …………  
<!--------------------文件名:decorators.xml --------------->
…………
  <!-- 定义装饰器,该装饰器没有被指定可装饰的视图界面,而是在视图界面中来制定需要它装饰的视图界面-->
  <decorator name="panel" page="panel.jsp"></decorator>
…………

 

 

decorators.xml 文件定义的 panel.jsp 装饰器视图文件代码:

Java代码 Struts2讲义45(转载)
  1. <!--------------------文件名:panel.jsp --------------------->   
  2. ………   
  3.          <head>   
  4.                    <title>   
  5.                    <!-- 被装饰页面的<title>中内容在这里填充 -->   
  6.                    <decorator:title default="panel页面" />   
  7.                    </title>                     
  8.          </head>   
  9.          <body bgcolor="#f7c800" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">   
  10.                    <!-- 被装饰页面的<body>中内容在这里填充 -->   
  11.                    <decorator:body /><br>   
  12.                    <!-- 得到已定义的参数内容并使用下列标签在这里显示 -->                                       
  13.                    <decorator:getProperty property="email"></decorator:getProperty>   
  14.          </body>  
<!--------------------文件名:panel.jsp --------------------->
………
         <head>
                   <title>
                   <!-- 被装饰页面的<title>中内容在这里填充 -->
                   <decorator:title default="panel页面" />
                   </title>                  
         </head>
         <body bgcolor="#f7c800" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
                   <!-- 被装饰页面的<body>中内容在这里填充 -->
                   <decorator:body /><br>
                   <!-- 得到已定义的参数内容并使用下列标签在这里显示 -->                                    
                   <decorator:getProperty property="email"></decorator:getProperty>
         </body>

 

 

在原有装饰器视图文件中定义可以指定其他装饰器并带有具体参数值内容定义的代码:

Java代码 Struts2讲义45(转载)
  1. <!------------文件名:3PartLayoutTemplate.jsp---------------->   
  2. …………   
  3.                    <td width="217" height="48"  valign="top" align="center">   
  4.                                                <!-- 在JSP视图界面指定由panel装饰器装饰的页面 -->   
  5.                                                <page:applyDecorator page="/jsp/body/page.jsp" name="panel" >   
  6.                                                         <!-- 设置参数值内容 -->   
  7.                                                         <page:param   
  8. name="email">frank_wjs@hotmail.com</page:param>   
  9.                                                </page:applyDecorator>   
  10.                                      </td>                                        
  11.                                      <td >   
  12.                                                <decorator:body></decorator:body>   
  13.                                      </td>   
  14. …………  
<!------------文件名:3PartLayoutTemplate.jsp---------------->
…………
                   <td width="217" height="48"  valign="top" align="center">
                                               <!-- 在JSP视图界面指定由panel装饰器装饰的页面 -->
                                               <page:applyDecorator page="/jsp/body/page.jsp" name="panel" >
                                                        <!-- 设置参数值内容 -->
                                                        <page:param
name="email">[email protected]</page:param>
                                               </page:applyDecorator>
                                     </td>                                     
                                     <td >
                                               <decorator:body></decorator:body>
                                     </td>
…………

 

 

效果图如图 10.2 所示:

Struts2讲义45(转载)

 

10.2  sitemesh 自行指定装饰器的效果图

代码解释

1 )如果要使用 <page> 标签则在装饰器页面需要申明“ <%@ taglib uri="http://www.opensymphony.com/sitemesh/page" prefix="page"%> ”。这样就可以使用该标签。

注意: sitemesh 采取松耦合理念,因此被装饰的视图界面往往都是 JSP HTML 等简单的视图文件。不需要使用 <page> <decorator> 标签。这些 sitemesh 的装饰标签往往都是在装饰器视图文件中定义。

2 )在本示例中还是使用类似于上一小节的示例代码。这里只是在 decorators.xml 中又定义了一个没有特殊指定被装饰页面的装饰器 panel 。而在原来装饰器视图文件 3PartLayoutTemplate.jsp 代码中指定了需要被panel 装饰器装饰的视图界面文件page.jsp 。由代码可知笔者调用了<page:applyDecorator> 标签。page 属性指定了被装饰的page.jsp 视图文件。而且其中又嵌套了< page:param > 标签,定义了一个email 参数,该参数值是笔者的MSN 邮箱。name 属性就是参数名内容,这里是“email ”。

这样其实原来装饰器视图界面 3PartLayoutTemplate.jsp 中包含了另外一个装饰器视图界面文件panel.jsp 。因此实现多个装饰器文件同时装饰文件的功能。如果开发中根据特定需求,需要在页面布局中某一部分动态装饰视图文件,其他部分不需要装饰视图文件时候。这样的功能恰好能满足特定需求。因为只需要使用 <page:applyDecorator> 标签来指定需要装饰的那一部分调用的装饰器文件就能达到局部装饰的目的。 而且如果开发者还是想实现一个视图文件由唯一一个装饰器文件装饰,又可以将这段使用 <page:applyDecorator> 标签的代码删去或注释掉即可。实现了笔者之前曾经说过的松耦合理念。

3 )在装饰器文件 panel.jsp 代码中也显示,使用 <decorator:getProperty> 标签可以在被装饰的视图界面文件中显示指定的装饰器文件中使用的参数值。 property 属性中的内容就是在 < page:param > 标签中定义的参数name 属性。在图10.2 中左边的红框中也显示了被panel 装饰器装饰的page.jsp 显示了笔者的MSN 邮箱。达到了局部装饰的目的。