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

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

          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ù)  更多評(píng)論
            
          # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(五) 2012-06-18 17:36 | 世紀(jì)末海
          話(huà)說(shuō),在本機(jī)用jetty:run跑是正常的顯示hello.html,為什么用maven install打包以后放在tomcat下的主頁(yè)是index.html...servlet-context.xml下的<mvc:view-controller path="/" view-name="forward:/hello" />
          沒(méi)起作用  回復(fù)  更多評(píng)論
            
          # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(五) 2012-06-19 09:25 | 菠蘿大象
          @世紀(jì)末海
          你說(shuō)的問(wèn)題我看了下,是我疏忽了,這應(yīng)該是jetty和tomcat內(nèi)部機(jī)制不同導(dǎo)致的,我測(cè)試的jetty是6.1.26,tomcat是7.0.23,我想了個(gè)折中的解決辦法,可以把index.html改成index.jsp,里面的內(nèi)容換成<%request.getRequestDispatcher("hello").forward(request,response);%>,輸入http:localhost:8080/ssm3 就可以訪問(wèn)了。  回復(fù)  更多評(píng)論
            
          # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(五) 2012-08-17 23:45 | 老北
          新注冊(cè)了個(gè)帳號(hào),就為了一句評(píng)論~
          入門(mén)經(jīng)典,值得一看,謝謝分享,繼續(xù)加油  回復(fù)  更多評(píng)論
            
          # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實(shí)例詳解(五) 2012-10-08 15:31 | 伍葉春
          謝謝分享 受教了  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 榆中县| 府谷县| 葫芦岛市| 二连浩特市| 贺兰县| 冷水江市| 肇源县| 塔城市| 青岛市| 璧山县| 宜州市| 忻州市| 台东县| 广河县| 盐池县| 禄丰县| 广东省| 莱阳市| 保德县| 镇坪县| 东阳市| 丰台区| 广东省| 德惠市| 揭东县| 宝坻区| 泸州市| 鸡东县| 始兴县| 宕昌县| 厦门市| 得荣县| 博客| 阿荣旗| 禹城市| 嘉禾县| 潜江市| 贵定县| 易门县| 巴塘县| 邵东县|