京山游俠

          專注技術(shù),拒絕扯淡
          posts - 50, comments - 868, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          在Web開發(fā)中,網(wǎng)頁代碼的重復(fù)是一個不可避免的問題。我們做的網(wǎng)站,所有的頁面都會有一個比較統(tǒng)一的頁面布局,只有和數(shù)據(jù)有關(guān)的部分會不同。如果每一個頁面都包含完整的HTML代碼,那么就會造成很多的重復(fù)代碼,而且在修改那些公共部分(如頁頭和頁尾)的時候,要對多個頁面進(jìn)行修改,非常的麻煩。

          當(dāng)然,解決這個問題的辦法有很多,在ASP.NET中,有一種叫做母板頁的機(jī)制可以做到,在Java開發(fā)中,也有很多的辦法,最簡單的就是使用在jsp文件中使用include指令,也可以使用其它很多的第三方模板庫。

          我這里選用的是Tiles模板引擎,Tiles是Struts的組成部分,因此在SpringSide2.0中使用的時候,不需要下載第三方的組件,也不需要額外配置,直接使用就行了。

          比如,在我的網(wǎng)站中,我的welcome.jsp布局圖如下:
          01.png

          而我的用戶注冊頁面RegUserStep1.jsp的布局圖如下:
          02.png

          它們之間的區(qū)別,也就是只有左邊的邊欄和右邊的內(nèi)容區(qū)不同,而頁頭頁腳和菜單欄都是一樣的。如果每一個頁面都包含完整的HTML代碼,則會造成相當(dāng)大的代碼重復(fù)。因此,我使用了Tiles模板引擎。我把我的頁面分成了以下幾個部分:頁頭、菜單、邊欄、內(nèi)容欄、頁尾,其次,網(wǎng)頁中還有一些其它不可見的部分也是每個網(wǎng)頁之間都有區(qū)別的,那就是網(wǎng)頁標(biāo)題、CSS代碼和Javascript代碼,我也把它們抽取了出來。

          首先,寫一個layout.jsp文件,如下:
          <%@page?contentType="text/html;?charset=UTF-8"?%>
          <%@taglib?uri="http://struts.apache.org/tags-tiles"?prefix="tiles"%>
          <!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
          <html>
          <head>
          <meta?http-equiv="Content-Type"?content="text/html;?charset=UTF-8"/>
          <title>
          <tiles:insert?attribute="title"/>
          </title>
          <tiles:insert?attribute="style"/>
          <tiles:insert?attribute="script"/>
          </head>
          <body>
          <tiles:insert?attribute="header"/>
          <tiles:insert?attribute="menu"/>
          <tiles:insert?attribute="content"/>
          <tiles:insert?attribute="sidebar"/>
          <tiles:insert?attribute="footer"/>
          </body>
          </html>

          這就是我的布局頁面,這里的每一個<tiles:insert>標(biāo)簽都代表的是頁面的一個部分,在具體的頁面中,我們可以給這些部分指定相應(yīng)的jsp文件。我在項目中,為這每一個部分都建立了一個文件夾,每一個文件夾中,都有一個default.jsp文件,這就是這個部分最常用的內(nèi)容,比如頁頭和頁腳,有可能只需要一個default.jsp就夠了,因為所有頁面的頁頭和頁腳都是一樣的。對于有特殊內(nèi)容需要顯示的頁面,它比較特殊的那一部分就放到相應(yīng)的文件夾中。

          不知道我的意思表達(dá)清楚了沒有,我的項目的文件結(jié)構(gòu)如下:
          03.png

          我的welcome.jsp的代碼如下:
          <%@page?pageEncoding="UTF-8"?contentType="text/html;?charset=UTF-8"?%>
          <%@taglib?uri="http://struts.apache.org/tags-tiles"?prefix="tiles"%>
          <tiles:insert?page="layout.jsp"?flush="true">
          ????
          <tiles:put?name="title"?value="titles/default.jsp"/>
          ????
          <tiles:put?name="style"?value="styles/default.jsp"/>
          ????
          <tiles:put?name="scripts"?value="scripts/default.jsp"/>
          ????
          <tiles:put?name="header"?value="headers/default.jsp"/>
          ????
          <tiles:put?name="menu"?value="menus/default.jsp"/>
          ????
          <tiles:put?name="sidebar"?value="sidebars/default.jsp"/>
          ????
          <tiles:put?name="content"?value="contents/default.jsp"/>
          ????
          <tiles:put?name="footer"?value="footers/default.jsp"/>
          </tiles:insert>

          可以看到,所有的部分都是使用的default.jsp,而我的RegUserStep1.jsp的代碼如下:
          <%@page?pageEncoding="UTF-8"?contentType="text/html;?charset=UTF-8"?%>
          <%@taglib?uri="http://struts.apache.org/tags-tiles"?prefix="tiles"%>
          <tiles:insert?page="layout.jsp"?flush="true">
          ????
          <tiles:put?name="title"?value="titles/default.jsp"/>
          ????
          <tiles:put?name="style"?value="styles/default.jsp"/>
          ????
          <tiles:put?name="script"?value="scripts/default.jsp"/>
          ????
          <tiles:put?name="header"?value="headers/default.jsp"/>
          ????
          <tiles:put?name="menu"?value="menus/default.jsp"/>
          ????
          <tiles:put?name="sidebar"?value="sidebars/RegUserStep1.jsp"/>
          ????
          <tiles:put?name="content"?value="contents/RegUserStep1.jsp"/>
          ????
          <tiles:put?name="footer"?value="footers/default.jsp"/>
          </tiles:insert>

          可以看到,只有sidebar和content的部分不同,其它的都是一樣的。

          titles/default.jsp的內(nèi)容如下:
          <%@page?pageEncoding="UTF-8"?contentType="text/html;?charset=UTF-8"?%>
          曳影網(wǎng)絡(luò)圖文社區(qū)

          styles/default.jsp的內(nèi)容如下:
          <%@page?pageEncoding="UTF-8"?contentType="text/html;?charset=UTF-8"?%>
          <link?href="styles/default.css"?rel="stylesheet"?type="text/css"?/>

          scripts/default.jsp的內(nèi)容如下:
          <%@page?pageEncoding="UTF-8"?contentType="text/html;?charset=UTF-8"?%>
          <script?src="scripts/prototype.js"></script>

          sidebars/default.jsp的內(nèi)容如下:
          <%@page?pageEncoding="UTF-8"?contentType="text/html;?charset=UTF-8"?%>
          <%@?page?import="com.yumdays.model.Catalog"%>
          <%@?page?import="java.util.List"?%>
          <%@taglib?prefix="c"?uri="http://java.sun.com/jsp/jstl/core"?%>
          <div?id="loginView">
          ????
          <h3>用戶登錄</h3>
          ????
          <form?name="userForm"?id="userForm">
          ??????
          <ul>
          ??????
          <li?class="vlist">
          ??????用戶名:
          ??????????
          <input?class="textInput"?name="name"?type="text"?id="name"?onMouseOut="this.style.backgroundColor='#ffffff'"?onmouseover="this.style.backgroundColor?=?'#E5F0FF'"?/>
          ??????
          </li>
          ??????
          <li?class="vlist">
          ??????密 碼:?
          ????????
          <input?class="textInput"?name="password"?type="password"?id="password"?onMouseOut="this.style.backgroundColor='#ffffff'"?onmouseover="this.style.backgroundColor?=?'#E5F0FF'"?/>
          ??????
          </li>
          ??????
          </ul>
          ??????
          <ul>
          ??????
          <li?class="hlist">
          ??????????
          <input?type="checkbox"?name="checkbox"?value="checkbox"?/>記住我
          ??????
          </li>
          ??????
          <li?class="hlist">
          ??????????
          <input?type="button"?name="Submit"?value="登 錄"?onclick="onSubmit();"/>
          ??????
          </li>
          ??????
          </ul>
          ??????
          <p></p>
          ??????
          <ul>
          ??????????
          <li?class="hlist">忘記密碼?</li>
          ??????????
          <li?class="hlist"><a?href="http://${statistic.currentWebServer}.yumdays.com/RegUserStep1.jsp"?target="_self">新用戶注冊</a></li>
          ??????????
          ??????
          </ul>
          ??????
          <br>
          ????
          </form>
          </div>

          <div?id="catalog">
          <h3>網(wǎng)站分類</h3>
          <ul>
          ????
          <c:forEach?var="catalog"?items="${catalogs}">
          ????
          <li>${catalog.name}</li>
          ????
          </c:forEach>
          </ul>
          </div>

          <div?id="statistics">
          <h3>統(tǒng)計數(shù)據(jù)</h3>
          <ul>
          ????
          <li>用戶:${statistic.userCount}</li>
          ????
          <li>文章:${statistic.topicCount}</li>
          ????
          <li>評論:${statistic.replyCount}</li>
          </ul>
          </div>
          <div?id="search">
          <h3>Google站內(nèi)搜索</h3>
          </div>
          <div?id="hotTopics">
          <h3>熱點(diǎn)圖文</h3>
          </div>
          <div?id="hotUsers">
          <h3>用戶排行[前100名]</h3>
          </div>

          而sidebars/RegUserStep1.jsp的內(nèi)容如下:
          <%@page?pageEncoding="UTF-8"?contentType="text/html;?charset=UTF-8"?%>
          <div?id="sidebar">
          <h3>注冊步驟</h3>
          <p>
          一、閱讀并同意協(xié)議
          <br>
          二、填寫注冊資料
          <br>
          三、完成注冊
          </p>
          </div>

          其它的頁面我就不一一列舉了。由此可見,使用Tiles模板引擎,可以把代碼重復(fù)降低到最低限度。

          我頁面中元素的顯示,都是使用CSS來控制的,有興趣的朋友,可以看看我的這一篇隨筆:

          漫談CSS和頁面布局
          http://www.aygfsteel.com/youxia/archive/2006/12/26/90112.html

          評論

          # re: 在SpringSide2.0中使用Tiles模板以減少網(wǎng)頁代碼的重復(fù)  回復(fù)  更多評論   

          2008-02-21 17:35 by d34
          訪問公司屏蔽網(wǎng)站的方法
          可以使用代理,推薦兩個代理網(wǎng)站
          http://www.tgod.com.cn 代理解決方案
          http://www.proxy163.com 代理163
          進(jìn)入后點(diǎn)擊在線web代理

          # re: 在SpringSide2.0中使用Tiles模板以減少網(wǎng)頁代碼的重復(fù)  回復(fù)  更多評論   

          2008-02-21 18:40 by leekiang
          直接用jsp的include,不是一樣的方便嗎,而且不用額外學(xué)東西

          # re: 在SpringSide2.0中使用Tiles模板以減少網(wǎng)頁代碼的重復(fù)  回復(fù)  更多評論   

          2008-02-21 18:50 by zhangv
          還是覺得sitemesh比較好,比較透明,不需要維護(hù)一大堆的模板定義
          而且可以動態(tài)切換

          # re: 在SpringSide2.0中使用Tiles模板以減少網(wǎng)頁代碼的重復(fù)  回復(fù)  更多評論   

          2008-02-21 22:25 by Javaer
          這個可能有用:
          http://www.goyer.cn/cf.asp?user_name=andyandy

          # re: 在SpringSide2.0中使用Tiles模板以減少網(wǎng)頁代碼的重復(fù)  回復(fù)  更多評論   

          2008-02-22 11:43 by 海邊沫沫
          昏,怎么這么多在我的博客中做廣告的?

          # re: 在SpringSide2.0中使用Tiles模板以減少網(wǎng)頁代碼的重復(fù)  回復(fù)  更多評論   

          2008-02-22 11:45 by 海邊沫沫
          @leekiang
          你覺得學(xué)習(xí)成本很高嗎?像我這么使用,學(xué)習(xí)一個小時就綽綽有余了。

          # re: 在SpringSide2.0中使用Tiles模板以減少網(wǎng)頁代碼的重復(fù)  回復(fù)  更多評論   

          2008-03-29 23:10 by flyfan
          海邊沫沫,請問能不能把你的代碼發(fā)一份給我,我也很想學(xué)習(xí)一下tiles,謝謝。
          flyfanc@qq.com

          # re: 在SpringSide2.0中使用Tiles模板以減少網(wǎng)頁代碼的重復(fù)  回復(fù)  更多評論   

          2010-02-02 16:09 by donjon
          老大tiles2.*的怎么搞?
          主站蜘蛛池模板: 西吉县| 孝昌县| 灵武市| 怀远县| 广德县| 炉霍县| 于田县| 西林县| 磐安县| 津市市| 疏附县| 宣城市| 肥西县| 含山县| 赣榆县| 香港 | 靖边县| 柞水县| 德令哈市| 从化市| 乐陵市| 东辽县| 涞源县| 镇坪县| 鄢陵县| 宁津县| 永济市| 贞丰县| 涡阳县| 图片| 武城县| 安多县| 孝义市| 雅安市| 高雄市| 百色市| 安塞县| 大城县| 盱眙县| 渑池县| 昌邑市|