說明freemarker,實現模板的繼承


現說明freemarker 中三個指令: @extends,@block,@override

一.目的

  • 父模板頁面定義好佈局,子模板可以重定義佈局中的部分內容
  • 使模板可以實現類似"類"的繼承關係,並不限繼承層次

二.繼承概欖

父模板: base.ftl
<html>  
    
<head>  
        
<@block name="head">base_head_content</@block>  
    
</head>  
    
<body>  
        
<@block name="body">base_body_content</@block>  
    
</body>  
</html>  
子模板child.ftl
<@override name="body">  
    
<div class='content'>  
        Powered By rapid-framework  
    
</div>  
</@override>  
<@extends name="base.flt"/> 

子模板child.ftl輸出
<html>  
    
<head>  
        base_head_content  
    
</head>  
    
<body>  
        
<div class='content'>  
            Powered By rapid-framework  
        
</div>  
    
</body>  
</html> 
可以看到,body部分被重定義了,而head部分則還是顯示父模板的內容。

三.指令介紹

  • @block : 定義塊,可以被子模板用@override指令覆蓋顯示
  • @override :  覆蓋@block指令顯示的內容
  • @extends : 繼承其它模板,必須放在模板的最後面(注:該指令完全等價於#include指令,只是爲了提供統一的語義,即extends比include更好理解)

四.使用說明

要使用如上三個自定義指令,必須在freeemarker的Configuration中註冊。使用如下代碼:
configuration.setSharedVariable("block"new BlockDirective());  
configuration.setSharedVariable(
"override"new OverrideDirective());  
configuration.setSharedVariable(
"extends"new ExtendsDirective()); 


PS :項目中的配置,如:springmvc-servlet.xml

<!-- freemarker config for FreeMarkerViewResolver -->
    <bean id="freemarkerConfig"
        class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath" value="/freemarker/" />
        <property name="defaultEncoding" value="GBK" />
        <property name="freemarkerVariables">
            <map>
                <entry key="extends" value-ref="extendsDirective"></entry>
                <entry key="override" value-ref="overrideDirective"></entry>
                <entry key="block" value-ref="blockDirective"></entry>
                <entry key="super" value-ref="superDirective"></entry>
            </map>
        </property>
    </bean>




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章