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

          評論:
          # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實例詳解(五) 2012-04-24 21:55 | 菠蘿大象
          有朋友問我怎么沒有數據庫,這個和之前的SSH2例子用的是同一個數據庫,請到SSH2第五篇下載示例源碼。  回復  更多評論
            
          # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實例詳解(五) 2012-06-06 21:44 | bj
          源碼確實不錯,收益匪淺!
          有幾處問題:1)角色的修改,中文無法正常保存;
          2)user表的建表語句和代碼不符;
          3)角色的新增報錯,估計源自role表的id不是自增長的;
          4)用戶的查詢不起作用。
            回復  更多評論
            
          # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實例詳解(五) 2012-06-07 08:54 | 菠蘿大象
          @bj
          你提的問題我看了下。
          1,中文是沒問題的,可能是你的mysql的設置,我之前寫過一篇mysql的中文問題解決方法的文章,你可以看下。
          2,我確實加了一個password字段,這點我沒注意,謝謝指正。這個password我愿意是準備加上攔截器功能的。
          3,SSH2里面有個主鍵管理表,所以role表沒加自增長,這里需要,也是我的錯,沒指出來,謝謝批評。
          4,查詢是可以的,你的user表里有數據么?
          我附上兩個表的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
            回復  更多評論
            
          # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實例詳解(五) 2012-06-18 17:36 | 世紀末海
          話說,在本機用jetty:run跑是正常的顯示hello.html,為什么用maven install打包以后放在tomcat下的主頁是index.html...servlet-context.xml下的<mvc:view-controller path="/" view-name="forward:/hello" />
          沒起作用  回復  更多評論
            
          # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實例詳解(五) 2012-06-19 09:25 | 菠蘿大象
          @世紀末海
          你說的問題我看了下,是我疏忽了,這應該是jetty和tomcat內部機制不同導致的,我測試的jetty是6.1.26,tomcat是7.0.23,我想了個折中的解決辦法,可以把index.html改成index.jsp,里面的內容換成<%request.getRequestDispatcher("hello").forward(request,response);%>,輸入http:localhost:8080/ssm3 就可以訪問了。  回復  更多評論
            
          # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實例詳解(五) 2012-08-17 23:45 | 老北
          新注冊了個帳號,就為了一句評論~
          入門經典,值得一看,謝謝分享,繼續加油  回復  更多評論
            
          # re: Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解實例詳解(五) 2012-10-08 15:31 | 伍葉春
          謝謝分享 受教了  回復  更多評論
            
          主站蜘蛛池模板: 淅川县| 政和县| 台中市| 伊金霍洛旗| 桦川县| 乳源| 青岛市| 元阳县| 温州市| 肃南| 清水河县| 泗洪县| 弋阳县| 龙泉市| 瑞昌市| 山西省| 云龙县| 田东县| 怀集县| 漳浦县| 视频| 黔西县| 临颍县| 余姚市| 宽城| 枣庄市| 马公市| 松溪县| 三江| 金山区| 板桥市| 商河县| 龙里县| 乐亭县| 海伦市| 响水县| 田东县| 都江堰市| 新乐市| 岳普湖县| 蒙城县|