第六節(jié) Hasor 裝飾器

2018-10-09 15:46 更新

裝飾器是 Hasor 的 Web 開(kāi)發(fā)框架中極具特色的一項(xiàng)功能。它的使用場(chǎng)景是這樣的,當(dāng)你很多頁(yè)面都有著共同的布局結(jié)構(gòu)時(shí),就可以使用 Hasor 的裝飾器。如果您接觸過(guò)或者了解 Sitemesh 框架,應(yīng)該對(duì) Hasor 的裝飾器不會(huì)臺(tái)陌生。它們要做的事情是一樣的,都是為了給項(xiàng)目提供 ‘母版頁(yè)’技術(shù)。只不過(guò) Hasor 的裝飾器不像 Sitemesh 把裝飾功能單獨(dú)做成了一個(gè)框架。


它的工作原理是一個(gè)典型的實(shí)踐 裝飾器模式 一個(gè)啟用了裝飾器的站點(diǎn)在渲染其頁(yè)面時(shí),會(huì)先渲染目標(biāo)頁(yè)面到一個(gè)臨時(shí)的緩沖區(qū)。然后會(huì)再次渲染布局模板文件,這個(gè)時(shí)候預(yù)先渲染的頁(yè)面就會(huì)被安插到指定的位置上。


在 Hasor 中布局模板文件只會(huì)有一個(gè)生效, Hasor 不支持嵌套的布局模板。如果您要在布局模板中再次提煉公共布局模板,您需要做的是將布局模板文件的內(nèi)容模塊化。而不是套用嵌套布局。


默認(rèn)情況下,Hasor 的裝飾器是關(guān)閉的。如果您需要啟用裝飾器,那么需要您在 hasor-config.xml 中設(shè)置環(huán)境變量以啟用它。


<!-- 啟用站點(diǎn)文件布局 -->
<HASOR_RESTFUL_LAYOUT>true</HASOR_RESTFUL_LAYOUT>


啟用了站點(diǎn)布局之后,您的整個(gè) webapp 目錄中的文件必須按照固定的目錄格式進(jìn)行編排。一個(gè)合法的站點(diǎn)目錄應(yīng)該是這個(gè)樣子的:


webapps/
    layout/     布局模板
    templates/  頁(yè)面模板
    WEB-INF/    web.xml


所有訪問(wèn)網(wǎng)站的頁(yè)面模板文件統(tǒng)一移動(dòng)到 templates 目錄下,另外 layout 目錄用于保存模板頁(yè)。


接下來(lái),我們用一個(gè)例子來(lái)說(shuō)明 Hasor 的裝飾器如何使用。我們的例子中要求所有網(wǎng)頁(yè)都統(tǒng)一加上一個(gè)頁(yè)腳。


首先創(chuàng)建我們的模版頁(yè),用來(lái)確定頁(yè)面最終的結(jié)構(gòu),同時(shí)我們把頁(yè)腳加入進(jìn)去。


<!DOCTYPE html>
<html lang="cn">
<head>
    <title>${rootData.pageTitle!}</title>
</head>
<body>

${content_placeholder!}

<div>this is foot</div>
</body>
</html>


上面這個(gè)頁(yè)面代碼使用的是 Freemarker 語(yǔ)法編寫(xiě),其中 content_placeholder 表示的是用戶實(shí)際訪問(wèn)的目標(biāo)頁(yè)面 target。在模板頁(yè)中您可以根據(jù)自己的實(shí)際需要選擇輸出在母版頁(yè)中任何一個(gè)位置上。


rootData是請(qǐng)求處理器用于保存數(shù)據(jù)的全局對(duì)象,其作用范圍是 request。我們通過(guò) Invoker 接口寫(xiě)入的所有數(shù)據(jù)在 rootData 對(duì)象中都可以找到。通過(guò)它我們可以實(shí)現(xiàn)在 子頁(yè)面中設(shè)置頁(yè)面的 title ,然后在母版頁(yè)中將 title 數(shù)據(jù)取出。下面這個(gè)就是具體的目標(biāo)頁(yè):

${rootData.put('pageTitle','首頁(yè)')}
<style>
    .rightBorder {
        border-right: thick dashed #cfcfcf;
    }
</style>

this page form user
<div>this is foot</div>


我們可以看到具體的頁(yè)面中,沒(méi)有看到 body、html 這些元素。這是因?yàn)椋?Hasor 的裝飾器在執(zhí)行時(shí)僅僅做了一次 content_placeholder 的代入。


模板的文件名默認(rèn)情況下統(tǒng)一為:default,您可以在 layout 目錄中新建子目錄來(lái)存放其它模板。


您實(shí)際訪問(wèn)的頁(yè)面在進(jìn)行模板頁(yè)面渲染時(shí)會(huì)自動(dòng)增加 templates 前綴以正確映射到站點(diǎn)布局中。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)