<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-67  評論-522  文章-0  trackbacks-0
        這是本系列的最后一篇,主要講一下FreeMarker模板引擎的基本概念與常用指令的使用方式。
        一、FreemMarker基本概念
        FreemMarker是一個用Java語言編寫的模板引擎,它是一個基于模板來生成文本輸出的一個工具。是除了JSP之外被使用得最多的頁面模板技術(shù)之一,另一個比較有名的模板則是Velocity
        用戶可以使用FreeMarker來生成所需要的內(nèi)容,通常由Java提供數(shù)據(jù)模型,FreeMarker通過模板引擎渲染數(shù)據(jù)模型,這樣最終得到我們想要的內(nèi)容。使用FreeMarker作為展示層,訪問速度會比較快,因?yàn)?/span>FreeMarker引擎渲染頁面的時候,只需要把數(shù)據(jù)填充進(jìn)去就可以了,其它的都是固定的模板內(nèi)容。另外,使用FreeMarker能夠很方便的動態(tài)生成靜態(tài)頁面,對于大訪問量的網(wǎng)站,配合nginx可以很好的提高網(wǎng)站性能。
        ssm3這個例子中,就是使用的FreeMarker模板技術(shù)來實(shí)現(xiàn)的視圖層。本文主要是對ssm3例子中所使用到的FreeMarker知識點(diǎn)進(jìn)行介紹,其它更詳細(xì)的內(nèi)容還請大家參考官方文檔。
        在本文的最后有ssm3源碼,有需要的朋友可以自行下載,例子是最基本的,方便入門的朋友學(xué)習(xí)與了解。
        二、FreemMarker配置說明
        Spring 3.0框架中,已經(jīng)集成好了FreeMarker,對它進(jìn)行了適度的封裝,我們使用起來非常方便。要使用FreemMarker模板的功能,只需要進(jìn)行下面兩項(xiàng)配置。
        aFreemMarker視圖解析器
        
        當(dāng)我們發(fā)出REST請求訪問資源時,當(dāng)Controller執(zhí)行完畢,需要返回結(jié)果給我們時,那些返回字符串指定的都是結(jié)果頁面,這時,就通過上面這個解析器,根據(jù)返回的那些字符串解析成我們設(shè)計(jì)的頁面。另外,如果要使用Spring提供的FreeMarker宏,還需要加上exposeSpringMacroHelpers這個屬性,將它設(shè)為true,你可以將這些宏理解為一種功能,或一個方法。
        bFreemMarker環(huán)境配置
        
        上面這段配置設(shè)置了FreeMarker環(huán)境屬性,templateLoaderPath指定模板文件存放的路徑,它相當(dāng)于是定義了模板的前綴,所有顯示的頁面都遵循這個路徑規(guī)則。還指定了模板文件的編碼格式,如果不顯示配置,否則會采用系統(tǒng)默認(rèn)編碼,這很容易出現(xiàn)亂碼的情況,所以一定要將編碼統(tǒng)一設(shè)置,不要再使用gb2312gbk之類的編碼方式了,采用國際統(tǒng)一的Unicode UTF-8編碼是比較好的習(xí)慣。
        除了上面我們看到的這些配置設(shè)置外,FreeMarkerConfigurer還有一個很重要的屬性是freemarkerVariables,它可以用來設(shè)置我們自己開發(fā)的自定義指令標(biāo)簽,以滿足不同的業(yè)務(wù)需求。
        三、FreemMarker指令標(biāo)記
        要想在最終結(jié)果頁面中填充數(shù)據(jù),需要用到FreeMarker標(biāo)記指令來達(dá)到這一目的。不過這些標(biāo)記指令一般不會單獨(dú)出現(xiàn),基本上是多個組合使用,為了讓大家方便理解,大象就以ssm3中的一些頁面為例子進(jìn)行說明。
        FreeMarker有兩種類型:預(yù)定義指令和用戶自定義指令。預(yù)定義指令是以#號開頭,用戶自定義的指令則使用@開頭。而SpringFreeMarker宏也是以@開頭。
        
        指令assign表示定義一個變量,它的格式是<#assign name=value>,在這里ctx是變量名namevalue可以是一個值,也可以是一個表達(dá)式。還記得FreeMarker解析器中我們設(shè)置的requestContextAttribute屬性為rc吧,我們現(xiàn)在就是用它來獲得我們應(yīng)用上下文,我們的應(yīng)用名為ssm3,所以這里就是取得這個值,將它賦給ctx,上面這些都寫在meta.html這個模板頁面中,這樣我們就可以在所有模板頁中引用這個變量。
        在表達(dá)式中,使用了一個!符號,它的作用是如果rc.getContextPath()null或不存在,就將字符串”/ssm3”作為默認(rèn)值賦給變量ctx。這樣,即使萬一因?yàn)槟承┰驘o法取得上下文值,我們的ctx變量也不會因此而出現(xiàn)空值或不正確的值,從而引起系統(tǒng)異常。
        在使用FreeMarker時,一定要注意一點(diǎn),FreeMarker絕不允許引用不存在的變量(即變量為null),除非明確地告訴它當(dāng)變量不存在(null)時如何處理。
        上面這一點(diǎn)非常重要,往往很多時候Bug就出在空值未處理上面,請大家使用FreeMarker的時候一定要多加注意。
        
        指令include載入模板頁,可以使用它在一個模板中插入另外一個FreeMarker模板文件。
        
        <#if>條件判斷指令,list??是否為空判斷,如果list不為null才會往下執(zhí)行。??一般都與if指令一起執(zhí)行。
        <#list list as entity>開始循環(huán)遍歷,listmodel里面定義的屬性名稱,aslist循環(huán)定義變量的語法,entitylist循環(huán)變量的名稱。${...}它和JSTL里的同一個表達(dá)式含義相同。FreeMarker都是在輸出時,用實(shí)際值替換。
        源碼下載:ssm3     
        本文為菠蘿大象原創(chuàng),如要轉(zhuǎn)載請注明出處。
    http://bolo.blogjava.net/
    posted on 2012-04-23 08:38 菠蘿大象 閱讀(9864) 評論(7)  編輯  收藏 所屬分類: Spring3

    評論:
    # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(五) 2012-04-24 21:55 | 菠蘿大象
    有朋友問我怎么沒有數(shù)據(jù)庫,這個和之前的SSH2例子用的是同一個數(shù)據(jù)庫,請到SSH2第五篇下載示例源碼。  回復(fù)  更多評論
      
    # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(五) 2012-06-06 21:44 | bj
    源碼確實(shí)不錯,收益匪淺!
    有幾處問題:1)角色的修改,中文無法正常保存;
    2)user表的建表語句和代碼不符;
    3)角色的新增報錯,估計(jì)源自role表的id不是自增長的;
    4)用戶的查詢不起作用。
      回復(fù)  更多評論
      
    # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(五) 2012-06-07 08:54 | 菠蘿大象
    @bj
    你提的問題我看了下。
    1,中文是沒問題的,可能是你的mysql的設(shè)置,我之前寫過一篇mysql的中文問題解決方法的文章,你可以看下。
    2,我確實(shí)加了一個password字段,這點(diǎn)我沒注意,謝謝指正。這個password我愿意是準(zhǔn)備加上攔截器功能的。
    3,SSH2里面有個主鍵管理表,所以role表沒加自增長,這里需要,也是我的錯,沒指出來,謝謝批評。
    4,查詢是可以的,你的user表里有數(shù)據(jù)么?
    我附上兩個表的sql語句

    CREATE TABLE `user` (
    `id` int(11) NOT NULL auto_increment,
    `username` varchar(20) default NULL,
    `password` varchar(20) default NULL,
    `role_id` int(11) default NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    CREATE TABLE `role` (
    `id` int(11) NOT NULL auto_increment,
    `name` varchar(50) default NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
      回復(fù)  更多評論
      
    # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(五) 2012-06-18 17:36 | 世紀(jì)末海
    話說,在本機(jī)用jetty:run跑是正常的顯示hello.html,為什么用maven install打包以后放在tomcat下的主頁是index.html...servlet-context.xml下的<mvc:view-controller path="/" view-name="forward:/hello" />
    沒起作用  回復(fù)  更多評論
      
    # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(五) 2012-06-19 09:25 | 菠蘿大象
    @世紀(jì)末海
    你說的問題我看了下,是我疏忽了,這應(yīng)該是jetty和tomcat內(nèi)部機(jī)制不同導(dǎo)致的,我測試的jetty是6.1.26,tomcat是7.0.23,我想了個折中的解決辦法,可以把index.html改成index.jsp,里面的內(nèi)容換成<%request.getRequestDispatcher("hello").forward(request,response);%>,輸入http:localhost:8080/ssm3 就可以訪問了。  回復(fù)  更多評論
      
    # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(五) 2012-08-17 23:45 | 老北
    新注冊了個帳號,就為了一句評論~
    入門經(jīng)典,值得一看,謝謝分享,繼續(xù)加油  回復(fù)  更多評論
      
    # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(五) 2012-10-08 15:31 | 伍葉春
    謝謝分享 受教了  回復(fù)  更多評論
      
    主站蜘蛛池模板: 黄床大片免费30分钟国产精品 | 亚洲国产精品综合一区在线| 亚洲免费在线视频播放| 国产AV旡码专区亚洲AV苍井空| 亚洲av中文无码乱人伦在线观看| 免费无码午夜福利片 | 亚洲精品无码久久不卡| 亚洲av日韩av无码| 99999久久久久久亚洲| 男女猛烈激情xx00免费视频| 国产一区二区免费| 老司机在线免费视频| 亚洲福利精品一区二区三区 | 亚洲av无码乱码在线观看野外| 亚洲精品无码乱码成人| 亚洲国产精品乱码在线观看97| 日本亚洲欧美色视频在线播放| 中文字幕免费在线播放| 久久经典免费视频| 亚洲午夜日韩高清一区| 亚洲男女性高爱潮网站| 黄色毛片免费网站| 18禁止看的免费污网站| 亚洲Av无码国产情品久久| 久久亚洲春色中文字幕久久久| 亚洲av无码成人影院一区| 久久国产精品免费看| 日韩精品视频免费网址| 亚洲AV无码久久精品色欲| 亚洲精品无码成人| 久久精品中文字幕免费| 国产jizzjizz视频免费看| 亚洲日韩图片专区第1页| 亚洲av纯肉无码精品动漫| 免费A级毛片在线播放| 一区二区三区亚洲视频| 亚洲无圣光一区二区| 久青草视频在线观看免费| 成人免费男女视频网站慢动作| 亚洲AV无一区二区三区久久| 另类专区另类专区亚洲|