Velocity模板引擎使用筆記

題記 html

    在公司的項目中,前臺界面的展示是使用Velocity模版來實現的。如今利用一些時間,把之前的使用經驗記錄一下,不是什麼寶典祕籍,也不是什麼高深理論,純粹爲一些使用經驗記錄,開發知識備忘。 java

1.介紹 web

    Velocity是一個基於java的模板引擎(template engine)。它容許任何人僅僅簡單的使用模板語言(template language)來引用由java代碼定義的對象。理解這句話很重要,Veocity模版的做用,實質上是讓開發者在Web頁面上能夠直接使用java數據對象和命令。 spring

    「模版引擎」是一個總體的概念,Velocity只是其中的一種實現方式而已,也並不單單是java語言有模版引擎的概念,其餘PHP、Python、C#都有可用的模版引擎,具體信息可參考:http://www.oschina.net/project/tag/136/template-engine?lang=0&os=0&sort=view  apache

    理解Velocity模版,還須要區分清楚「模版」和「頁面」的概念;「模版」能夠看做是一個等待注入數據的一個框架,在將這個框架注入相應的數據之後,就可以生成一個用戶在瀏覽器中看到的「頁面」(請求的後綴名能夠爲 .html 或 .do 或 .action 或者沒有,這個根據MVC框架配置肯定)。 瀏覽器

2.如何在項目中使用? 服務器

(1)配置模版引擎: app

<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
    <property name="resourceLoaderPath" value="/WEB-INF/views/" />
    <property name="configLocation" value="classpath:velocity.properties" />
</bean>

    resourceLoaderPath 屬性指定模版文件在項目中的路徑
框架

(2)配置視圖解析器 網站

<bean id="velocityViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver">
    <property name="layoutUrl" value="layout/layout.vm" />
    <property name="suffix" value=".vm" />
    <property name="contentType" value="text/html;charset=UTF-8" />
</bean>

    suffix 屬性指定模版文件的後綴名,視圖解析器將會按照"模版邏輯名"+suffix 的格式來尋找模版文件。

    例如:return new ModelAndView("login"); 視圖的邏輯名爲 login,在解析視圖時,velocityViewResolver會在 resourceLoaderPath 路徑下尋找「login.vm」這個模版。

3."$"引用和"#"指令

    首先介紹兩個特殊符號"$"和"#":以$開頭的表示「引用」的意思,是指取得一些東東。而"指令"(Directives)則以#開頭來表示,有點「作些什麼動做」的意思。在模版頁面中,引用一個java 數據對象時,使用 $userName 的格式,這個是簡單的變量引用,還能夠直接引用對象的屬性,例如 $userInfo.userName 。"指令"以"#"開頭,能夠看做是VTL(Velocity Template Language)的流程控制語言,例如:賦值,循環,條件判斷,引入模版,解析模版,宏調用等。下面是一個循環示例:

#foreach( $user in $userList) 
     #if( $user.userRole == 1)
        <h1>登陸成功:$user.userName</h1>
    #end
#end

    下面是一個條件判斷的示例:

#if( $user.userRole == 2) 
    <h1>沒有登陸權限:$user.userName</h1>
#elseif( $user.userRole == 3)
    <h1>您不在此權限範圍:$user.userName</h1>
#end

4.頗有用的#parse()指令

    在頁面中,常常遇到有相同內容的元素,好比幾個頁面的導航欄都是同樣的,就能夠專門定義一個 header.vm 模版,在其餘須要使用到的頁面中,直接 #parse("header.vm") 就ok了,注意,#parse() 後面是不加分號的。這樣作的好處也是很明顯的,若是要修改這個 header 的話,只須要修改一處,其餘頁面就所有更新了。以下爲一個完整示例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
    <title>示例網站</title>
</head>
<body>
    #parse("/layout/header.vm")
    <div class="page_wrap">
        我是頁面中的文字,請無視~
    </div>
    #parse("/layout/footer.vm")
</body>

5.接收瀏覽器請求(SpringMVC),響應頁面

@RequestMapping(value="/login", method = RequestMethod.GET)
public ModelAndView index(HttpServletRequest request, HttpServletResponse response) {
    ModelAndView mv = new ModelAndView();
    UserInfo user = new UserInfo();
    user.setUserRole(1);
    user.setUserName("abc");
    mv.addObject("user", user);
    mv.setViewName("login");
    return mv;
}

6.擴展閱讀

Velocity官方網站:http://velocity.apache.org/

Velocity模版使用指南:http://www.cnblogs.com/firstyi/archive/2007/11/01/945745.html

使用 Velocity 實現客戶端和服務器端模板:https://www.ibm.com/developerworks/cn/java/j-velocity/index.html

 Spring MVC:使用 Web 視圖技術:http://www.ibm.com/developerworks/cn/education/opensource/os-ag-springframe6/section4.html

相關文章
相關標籤/搜索