隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數據加載中……

          Struts1.x系列教程(23):使用Tiles模板進行布局

          本文為原創,如需轉載,請注明作者和出處,謝謝!


          上一篇:Struts1.x系列教程(22):Tiles框架簡介

              Tiles提供的模板機制可以最大限度地避免重復編寫代碼。實際上,Tiles模板就是的JSP頁面,只是在這種JSP頁面中使用Tiles標簽代替確定不了的內容(相當于占位符),也就是需要在開發人員使用模板時來確定的內容。除了這一點,Tiles模板頁面和普通的JSP頁面完全相同。

          一般的模板頁面可以有如下兩種占位符:

          1.        字符串:使用<tiles:getAsString>標簽進行占位。如<tiles:getAsString name = "title" />

          2.        Web資源(包括JSPServletHTML等):使用<tiles:insert>標簽來占位,如<tiles:insert attribute="header" />

          下面我們來看一下如何編寫一個Tiles模板。在Web根目錄中建立一個layout.jsp文件,代碼如下:

            <%@ page pageEncoding="GBK"%>
            
          <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>
            
          <html>
                
          <head>
                    
          <title><tiles:getAsString name="title" /></title>
                
          </head>
                
          <body>
                    
          <table border=<tiles:getAsString name="border" />>
                        
          <tr>
                            
          <td>
                                
          <tiles:insert attribute="header" />
                            
          </td>
                        
          </tr>
                        
          <tr>
                            
          <td>
                                
          <tiles:insert attribute="body" />
                            
          </td>
                        
          </tr>
                        
          <tr>
                            
          <td>
                                
          <tiles:insert attribute="footer" />
                            
          </td>
                        
          </tr>
                    
          </table>
                
          </body>
            
          </html>

          從上例可以看出有五處占位符,這些內容將由開發人員在使用layout.jsp模板時指定。在編寫完上述模板后,在Web根目錄中建立三個在模板中使用的JSP文件,代碼如下:

          header.jsp

          <%@ page pageEncoding="GBK"%>
          這是一個頁頭

          body.jsp

          <%@ page pageEncoding="GBK"%>
          這是一個頁體


          footer.jsp

          <%@ page pageEncoding="GBK"%>
          這是一個頁尾


              下面我們來使用這個模板。在Web根目錄中建立一個mypage.jsp文件,代碼如下:

            <%@ page contentType="text/html; charset=GBK"%>
            
          <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>
            
          <tiles:insert page="layout.jsp">
                
          <tiles:put name="title" value="我的頁面" />
                
          <tiles:put name="border" value="${param.border}"/>
                
          <tiles:put name="header" value="header.jsp"/>
                
          <tiles:put name="body" value="body.jsp"/>
                
          <tiles:put name="footer" value="footer.jsp"/>
            
          </tiles:insert>

               從mypage.jsp頁面中可以看出,在<tiles:insert>標 簽中通過page屬性插入了layout.jsp頁面(也就是Tiles模板),并且在<tiles:insert>標簽中使用了< tiles:put>子標簽為layout.jsp頁面中的占位標簽指定參數值。如果是<tiles:getAsString>標簽, 就會將<tiles:put>標簽中的value屬性值解釋為字符串;如果是<tiles:insert>標簽,就會將< tiles:put>標簽中的value屬性值解釋為Web資源。大家可以看到,如果有多個使用layout.jsp模板的JSP頁面,都可以按著 mypage.jsp頁面的方式使用這個layout.jsp模板,而無須再重復編寫象table這樣的HTML元素。
               在啟動Tomcat后,我們可以使用如下兩個URL來測試程序:

          http://localhost:8080/samples/mypage.jsp?border=1

          http://localhost:8080/samples/mypage.jsp?border=0

          注意:由于<tiles:insert><jsp:include>標簽類似,被插入或包含的Web資源都無法改面當前頁面的字符集編碼,因此,在使用Tiles模板時,即使在當前頁沒有使用中文,也應該使用page指令設置相應的字符集編碼。如果沒有設置,當模板頁面中有中文字符時,即使模板頁面使用了正確的字符集編碼,在當前頁面仍然無法正常顯示中文字符。
             
          上面曾講過,Tiles框架的目的就是最大限度地避免重復編寫代碼。而上面的例子雖然已經基本上避免了重復編碼的工作,但仍然可能會存在一些重復的代碼。如在mypage.jsp頁面中的<tiles:put>標簽。如果有很多頁面都需要插件頁頭、頁尾,那么就會有很多插入相同頁面的<tiles:put>標簽被分布在不同的JSP頁面中。因此,Tiles框架又提供了一個定義文件,來定義些重復使用的Tiles標簽。在使用定義文件之前,需要首先安裝Tiles插件(如果不使用定義文件,是不需要安裝Tiles插件的)。
              下面我們來將上面的部分代碼放到定義文件中。在WEB-INF目錄中建立一個tiles-defs.xml文件,代碼如下:

            <?xml version="1.0" encoding="GBK" ?>  
            
          <!DOCTYPE tiles-definitions PUBLIC
                   "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
                   "http://struts.apache.org/dtds/tiles-config_1_1.dtd"
          >
            
          <tiles-definitions>
                
          <definition name="myLayout" path="/layout.jsp">
                    
          <put name="title" value="我的頁面" />
                    
          <put name="header" value="header.jsp" />
                    
          <put name="body" value="body.jsp" />
                    
          <put name="footer" value="footer.jsp" />
                
          </definition>
            
          </tiles-definitions> 

           在上面的代碼中定義了一個<definition>元素。并且使用< put>元素對四個屬性:title、header、body和footer賦值。因此,如果使用這個定義文件,就可以無需使用< tiles:put>標簽再賦一遍值了。在Web根目錄中建立一個newpage.jsp文件,代碼如下:

            <%@ page contentType="text/html; charset=GBK"%>
            
          <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>
            
          <tiles:insert definition="myLayout">
                
          <tiles:put name="border" value="${param.border}"/>
            
          </tiles:insert>

               newpage.jsp頁面的功能和mypage.jsp頁面完全一樣,只是代碼要簡單 得多。由于只有border屬性需要設置,因此,在newpage.jsp頁面中只要設置這一個屬性即可。而在<tiles:insert> 標簽中使用了definition屬性指定了“myLayout”。這個值就是在tiles-defs.xml中<definition>元 素的name屬性值。
               在啟動Tomcat后,我們可以使用如下的URL來測試newpage.jsp:

          http://localhost:8080/samples/newpage.jsp?border=1


              為了更好的復用,在定義文件中的<definition>元素也可以繼承其他的<definition>,如我們可以在tiles-defs.xml文件中加一個<definition>元素,來繼承myLayout,代碼如下:

          <definition name="myLayout.newLayout" extends="myLayout">
               <put name="title" value="新的頁面" />
          </definition>

              上面的代碼覆蓋了myLayout中的title屬性,其他的屬性值都繼承了myLayout中相應的屬性值。其中name屬性的值中的“.”是為了表明這個新的<definition>元素是從myLayout繼承的,沒有特殊的含義。

          下一篇:
          Struts1.x系列教程(24):配置文件總結





          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2009-02-27 17:06 銀河使者 閱讀(3661) 評論(3)  編輯  收藏 所屬分類: javaweb 原創struts1.x

          評論

          # re: Struts1.x系列教程(23):使用Tiles模板進行布局  回復  更多評論   

          我有點疑問,就是在 mypage.jsp中的web資源中,我要是插入.xx.do時它就出現異常,如
          <tiles:insert page="layout.jsp">
          <tiles:put name="footer" value="head.do"/>
          <tiles:put name="footer" value="footer.do"/>
          </tiles:insert>

          Web資源(包括JSP、Servlet、HTML等):怎樣將多個action包含進模版呢? 希望您能給個回復,我研究了老半天也搞不出來。
          82055185@qq.com

          2009-05-17 08:11 | 龍華城

          # re: Struts1.x系列教程(23):使用Tiles模板進行布局  回復  更多評論   

          出現什么異常,請說清楚一些
          2009-05-17 09:18 | 銀河使者

          # re: Struts1.x系列教程(23):使用Tiles模板進行布局  回復  更多評論   

          我出現了一個問題,
          一個頁面中有兩個tiles標簽,其中一個tiles標簽頁面中有一個<html:form action="/index">,然后這個整體頁面使用reset(ActionMapping mapping, HttpServletRequest request)方法,頁面對后臺的訪問會出現兩次
          2009-11-30 08:32 | rhythm1988@hotmail.com
          主站蜘蛛池模板: 积石山| 陆川县| 韶山市| 章丘市| 盐源县| 金堂县| 修武县| 星子县| 乌兰察布市| 五河县| 平利县| 桐城市| 准格尔旗| 尼玛县| 望都县| 濮阳市| 梁河县| 田阳县| 伽师县| 泰兴市| 桃源县| 宣威市| 观塘区| 霍州市| 晋中市| 额济纳旗| 怀远县| 嵊泗县| 瑞丽市| 夹江县| 南乐县| 旌德县| 迁安市| 乐至县| 郓城县| 化德县| 丰都县| 佛教| 和平区| 湘阴县| 尼玛县|