nighty

          折騰的年華
          posts - 37, comments - 143, trackbacks - 0, articles - 0
                  項(xiàng)目中使用了FreeMarker做為視圖技術(shù),相對(duì)來(lái)說(shuō)因?yàn)閒reemarker在視圖上有一些邏輯處理功能,某些地方就顯得比較方便,特別是macro的使用,當(dāng)然也不是說(shuō)JSP就沒(méi)有這個(gè)功能,只是以前用JSP寫起來(lái)沒(méi)有這么順手。
                 那么遵從前臺(tái)開發(fā)的一些基本原則,F(xiàn)TL(指freemarker模板文件)、CSS、JS都可以分得比較清晰。按照以前的技巧,在做Ajax請(qǐng)求的時(shí)候,都是前臺(tái)用JS框架(例如jquery)發(fā)送請(qǐng)求,Server端處理后用JSON結(jié)果返回。用struts2,到現(xiàn)在已經(jīng)是2.2.1版本了,都覺得很方便!一般都是加上struts-json的Plugin來(lái)響應(yīng)JSON的結(jié)果。
                 老是覺得麻煩的地方在于:JSON是純數(shù)據(jù)的組織形式,在Server處理完后,要響應(yīng)頁(yè)面,得先組織成json,到了頁(yè)面,響應(yīng)得到了json,又得取出來(lái),動(dòng)態(tài)添加到DOM中的某個(gè)地方;數(shù)據(jù)添加的同時(shí),還有可能得使用js對(duì)樣式進(jìn)行一些效果渲染。總體來(lái)說(shuō),這就使得前臺(tái)的js有點(diǎn)羅嗦,比如常見的就要append(html),這些html是用js字符串生成的,看著感覺很不舒服。
                 發(fā)現(xiàn)struts2有一個(gè)特殊的類型叫:plainText,可以把type類型定義為它,這樣頁(yè)面響應(yīng)獲取得到的就是源代碼樣式的內(nèi)容。這個(gè)功能大概就是為了給那些需要返回源代碼的頁(yè)面使用的。那么換個(gè)思路就是說(shuō),這返回的type就可以針對(duì)上面提出問(wèn)題中,解決了已經(jīng)組織好數(shù)據(jù)和樣式的內(nèi)容。返回的內(nèi)容不僅包含了數(shù)據(jù),也包含了樣式,和你直接返回一個(gè)HTML是一樣,不過(guò)一般我們都需要?jiǎng)討B(tài)生成html。把結(jié)果直接嵌入在HTML中,就可以顯示出來(lái),不再需要用js進(jìn)行組織。利用這個(gè)特點(diǎn),做了個(gè)測(cè)試。發(fā)現(xiàn)行得通!
                 1. 首先,配置struts.xml文件,添加如下代碼:
          <package name="pt" extends="struts-default">
                  
          <action name="test" class="test.TestAction">
                      
          <result type="plainText">
                          
          <param name="location">/test.ftl</param>
                          
          <param name="charSet">GBK</param>
                      
          </result>
                  
          </action>
              
          </package>
                  注意到了2.2.1版本,原來(lái)的plaintext寫法不知道從哪個(gè)版本開始已經(jīng)不支持了,要有大寫T開頭,plainText,一個(gè)小細(xì)節(jié),免得啟動(dòng)時(shí)老是報(bào)錯(cuò)。
                 2. Action的代碼
          public class TestAction extends ActionSupport {
              
          private String msg;
              
          public String getMsg() {
                  
          return msg;
              }

              
          public void setMsg(String msg) {
                  
          this.msg = msg;
              }

              @Override
              
          public String execute() throws Exception {
                  setMsg(
          "我是Test");
                  Configuration cfg 
          = new Configuration();
                  cfg.setServletContextForTemplateLoading(ServletContextUtil.getContext(), 
          "/template");
                  Template t 
          = cfg.getTemplate("test.ftl");
                  ServletContextUtil.getResponse().setContentType(
          "text/html;charaset=" + t.getEncoding());
                  Writer out 
          = ServletContextUtil.getResponse().getWriter();
                  Map root 
          = new HashMap();
                  root.put(
          "msg", getMsg());
                  t.process(root, out);
                  
          return null;
              }

          }
                 這是臨時(shí)隨便寫的,變量大概在正式項(xiàng)目中不會(huì)這樣定義,這只是一個(gè)測(cè)試而已。這里要注意,不要返回SUCCES,因?yàn)槟菢臃祷氐氖窃次募瑳](méi)有填充入數(shù)據(jù)的ftl文件,到了前臺(tái)也沒(méi)用。所以這里有點(diǎn)小麻煩,必須用Freemarker的API,把固定的模板,用數(shù)據(jù)填充后,用out寫出,最后return null即可!
                3. 下面是ftl文件
          <div style="color:red;">This is a plainText: ${msg}</div>
                 這樣前臺(tái)接收到的,就是這個(gè)經(jīng)過(guò)填充和渲染后的ftl頁(yè)面,和正常的html一樣。你可以把這個(gè)頁(yè)面做得足夠復(fù)雜。在需要嵌入的頁(yè)面上,用jquery之類的調(diào)用后放入DOM中即可以。
                 比如下面這樣的,把獲取得到的內(nèi)容,填充入id為myDiv的DOM節(jié)點(diǎn)中。 
          $("#myDiv").load("test.action");
                 話說(shuō)回來(lái),也不是所有地方都建議這樣,有些地方,比如ajax填充一個(gè)下拉列表,或是僅僅列出一些簡(jiǎn)單的數(shù)據(jù),就不建議這么大費(fèi)周章。直接用JSON處理更來(lái)得簡(jiǎn)單。這個(gè)技巧適用的場(chǎng)景是那些沒(méi)有iframe架構(gòu)的頁(yè)面,又需要ajax響應(yīng)局部的具有一些組織形式的內(nèi)容。如果你頁(yè)面都是include方式來(lái)進(jìn)行劃分,又想可以Aajx引入一個(gè)比較復(fù)雜的頁(yè)面,也許這種思路可以省掉很多麻煩。具體的應(yīng)用還需要進(jìn)一步的實(shí)踐!  

          剛進(jìn)場(chǎng)的時(shí)候戲就落幕

          Feedback

          # re: Struts2+FreeMarker中利用plainText處理Ajax的一個(gè)技巧  回復(fù)  更多評(píng)論   

          2010-11-10 23:55 by wenlin
          struts2 中可以用 return Action.NONE 來(lái)代替 return null

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 肇源县| 郸城县| 泽普县| 建阳市| 托克逊县| 黄浦区| 徐闻县| 宝鸡市| 榆中县| 咸阳市| 镇巴县| 勐海县| 新丰县| 罗定市| 内乡县| 龙口市| 彩票| 彰化县| 缙云县| 当涂县| 两当县| 镇平县| 石首市| 唐山市| 祁连县| 扬州市| 贵阳市| 平泉县| 蚌埠市| 萨迦县| 太仆寺旗| 古交市| 威远县| 福贡县| 丰镇市| 龙岩市| 六安市| 阿拉善右旗| 广灵县| 泌阳县| 成武县|