隨筆-348  評(píng)論-598  文章-0  trackbacks-0
          在新項(xiàng)目中,我們要做一個(gè)這樣的功能:有一個(gè)表格,沒(méi)有記錄,當(dāng)用戶點(diǎn)擊“添加”的時(shí)候,會(huì)生成一條行,里面包含了文本輸入框,下拉框等等,需要用戶填寫(xiě),以此類推,用戶只要需要,他可以填寫(xiě)無(wú)限條信息,最后點(diǎn)擊一個(gè)“保存”來(lái)保存所有記錄。
           這里,我們?yōu)榱颂岣哂脩舻捏w驗(yàn)性,使用了Ajax技術(shù),后臺(tái)生成一個(gè)HtmlInputText控件實(shí)例添加到指定的panel中,然后刷新表格那一部分顯示出來(lái)。

          一上來(lái),我用了這個(gè)方法(添加到監(jiān)聽(tīng)器中):
          HtmlInputText text = new HtmlInputText();
          panel.getChildren().add(text);
          然后當(dāng)填寫(xiě)了值之后調(diào)用了text.getValue()方法,發(fā)現(xiàn)打印出來(lái)的是null,以為JSF無(wú)法捕獲Ajax生成控件的值,又嘗試設(shè)定了Action來(lái)生成控件,發(fā)現(xiàn)還是不行。

          最后只好使用了這個(gè)辦法:
          HtmlInputText text = new HtmlInputText();
          text.setId(
          "text_1");
          panel.getChildren().add(text);
          獲取方法使用了:
          public void sendMessage(ActionEvent e)
          {
          FacesContext context 
          = FacesContext.getCurrentInstance();
          UIViewRoot view 
          = context.getViewRoot();
          HtmlInputText output 
          =
          (HtmlInputText)view.findComponent(
          "messageForm:text_1");
          System.out.println(output.getValue());
          }
          不管是用Ajax方式還是表單提交的方式都可以使用這個(gè)方法獲得。所以我就在想,這個(gè)是什么原因,直接設(shè)置實(shí)例反而沒(méi)有辦法操作,還要重新獲取才可以。
          但是如果你在初始化控件的時(shí)候進(jìn)行text.setValue("111");操作還是可以的,這樣輸入框就會(huì)默認(rèn)出現(xiàn)值111。

          大家有什么看法,盡管發(fā)表,如果對(duì)這個(gè)需求有更好的解決方案,也請(qǐng)?zhí)岢鰜?lái),謝謝了。

          ---------------------------------------------------------
          專注移動(dòng)開(kāi)發(fā)

          Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
          posted on 2008-11-27 17:18 TiGERTiAN 閱讀(2116) 評(píng)論(9)  編輯  收藏 所屬分類: JavaJSF

          評(píng)論:
          # re: 探討JSF Backing bean生成控件的問(wèn)題 2008-11-27 19:22 | Libo
          是否使用binding?如果不使用應(yīng)該是不能得到值的.  回復(fù)  更多評(píng)論
            
          # re: 探討JSF Backing bean生成控件的問(wèn)題 2008-11-27 23:51 | TiGERTiAN
          @Libo
          頁(yè)面上面的panel控件使用了binding,綁定到了后臺(tái)的一個(gè)實(shí)例,在后臺(tái)我也是對(duì)這個(gè)實(shí)例進(jìn)行添加子控件的操作,也就是說(shuō)子控件原來(lái)在前臺(tái)頁(yè)面是什么痕跡都沒(méi)有的,完全即時(shí)生成,然后我想操作后臺(tái)子控件的實(shí)例獲取用戶輸入的值就不可以。。  回復(fù)  更多評(píng)論
            
          # re: 探討JSF Backing bean生成控件的問(wèn)題 2008-11-28 07:40 | Libo
          這樣應(yīng)該是在后臺(tái)得到panel組件,然后類似于這樣的代碼:
          List l =panel.getValue();
          或是
          panel.getChildren(); 這要根據(jù)panel綁定的是什么組件.
          之后對(duì)list 遍歷,得出的是每個(gè)組件,然后對(duì)組件取值.  回復(fù)  更多評(píng)論
            
          # re: 探討JSF Backing bean生成控件的問(wèn)題 2008-11-28 10:45 | TiGERTiAN
          @Libo
          我也嘗試過(guò)了你說(shuō)的兩種方法,每個(gè)控件的實(shí)例都得到了,但是調(diào)用每個(gè)控件的getValue(),都得不到用戶輸入的值。  回復(fù)  更多評(píng)論
            
          # re: 探討JSF Backing bean生成控件的問(wèn)題 2008-11-28 14:38 | huliqing
          不過(guò)我倒是覺(jué)得這個(gè)功能可以不需要用到ajax.
          使用js在客戶端直接生成子組件,不過(guò)這不會(huì)直接反映到JSF的組件樹(shù)中.可能需要作一些特殊處理,比如擴(kuò)展一下inputText組件.
          使用action進(jìn)行生成子組件應(yīng)該會(huì)刷新頁(yè)面,不過(guò)這應(yīng)該是JSF正常的方式,但是你的例子看起來(lái)很正常.
          不過(guò)我估計(jì)可能的問(wèn)題應(yīng)該是出現(xiàn)了這樣的流程:
          點(diǎn)擊action - 后臺(tái)生成子組件(無(wú)默認(rèn)值) - 重新渲染頁(yè)面(這時(shí)頁(yè)面viewState中panel的子組件仍沒(méi)有值) - 使用ajax調(diào)用(把無(wú)值的viewState帶到了后臺(tái)) - 出現(xiàn)以上錯(cuò)誤!
          呵呵,以上是我對(duì)你的錯(cuò)誤原因的流程猜測(cè).
          不知道你的整個(gè)操作過(guò)程是怎么樣的.  回復(fù)  更多評(píng)論
            
          # re: 探討JSF Backing bean生成控件的問(wèn)題[未登錄](méi) 2008-11-29 00:08 | David
          很久以前分析過(guò)JSF源代碼:)

          JSF每一次Request-Response包含六個(gè)階段,其中在response render之前JSF server端有一個(gè)component tree,而render就是把這個(gè)component tree 生成對(duì)應(yīng)的html,這個(gè)生成的html(包含form)被提交的時(shí)候(另一個(gè)request-response),server段重新恢復(fù)一個(gè)view。而你的這個(gè)sendMessage(apply application values吧,不記得了)發(fā)生在restore之后,所以能夠取到值。

          因?yàn)閍jax的context根jsf的context屬于不同進(jìn)程,所以不能ajax的html 不能直接滲透到JSF中訪問(wèn)component tree。

          我的想法就是
          設(shè)置一個(gè)agent駐留在jsf application中,即每個(gè)agent實(shí)例與每一個(gè)jsf request-response在同一分配的thread中,agent可以訪問(wèn)jsf數(shù)據(jù)。而這個(gè)agent有一個(gè)http方法,以ajax提供的jsf sessionid為主要參數(shù),用來(lái)更新jsf component tree,然后局部遞歸render,把rendered的html代碼加在html中
          。這樣,不管server,還是client都有同結(jié)構(gòu)的tree.

            回復(fù)  更多評(píng)論
            
          # re: 探討JSF Backing bean生成控件的問(wèn)題 2008-11-29 00:35 | TiGERTiAN
          @David
          大概看懂了你的意思,只是不太明確代碼如何編寫(xiě),請(qǐng)問(wèn)您有示例代碼提供給我參考下嗎?謝謝您了。  回復(fù)  更多評(píng)論
            
          # re: 探討JSF Backing bean生成控件的問(wèn)題 2008-11-29 00:42 | TiGERTiAN
          @David
          還有就是,我的流程是后端生成HtmlInputText實(shí)例,把這個(gè)實(shí)例添加到panel中:
          HtmlInputText text = new HtmlInputText();
          panel.getChildren().add(text);
          然后前端調(diào)用Ajax直接渲染出來(lái)新的控件,如果后端在聲明實(shí)例之后又設(shè)置了setValue("1111"),前端是可以看到剛才設(shè)置的1111的。
          問(wèn)題就在于,如果我想獲得用戶輸入的數(shù)據(jù),直接調(diào)用剛才生成的實(shí)例text的getValue()方法是無(wú)法獲得用戶輸入的值的,只能獲得我剛才設(shè)置的1111,我在想可能JSF前端頁(yè)面綁定的實(shí)例已經(jīng)不是我后端設(shè)置的這個(gè)了,是他自己生成的一個(gè)HtmlInputText,所以才只能用findComponent方法通過(guò)ID找到該控件。  回復(fù)  更多評(píng)論
            
          # re: 探討JSF Backing bean生成控件的問(wèn)題 2008-11-29 01:01 | TiGERTiAN
          @huliqing
          應(yīng)該不是這個(gè)原因  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 永修县| 科技| 义马市| 滦南县| 望谟县| 长沙县| 肥乡县| 泗水县| 麻栗坡县| 南投市| 四平市| 祁门县| 临泉县| 清丰县| 南乐县| 寿光市| 安化县| 永城市| 南安市| 多伦县| 唐海县| 江津市| 淅川县| 台北县| 遂宁市| 宁安市| 周至县| 淮阳县| 砀山县| 赤水市| 峡江县| 石渠县| 南城县| 罗甸县| 察哈| 安吉县| 许昌县| 九寨沟县| 荃湾区| 克拉玛依市| 景德镇市|