隨筆-348  評論-598  文章-0  trackbacks-0
          在新項目中,我們要做一個這樣的功能:有一個表格,沒有記錄,當用戶點擊“添加”的時候,會生成一條行,里面包含了文本輸入框,下拉框等等,需要用戶填寫,以此類推,用戶只要需要,他可以填寫無限條信息,最后點擊一個“保存”來保存所有記錄。
           這里,我們為了提高用戶的體驗性,使用了Ajax技術,后臺生成一個HtmlInputText控件實例添加到指定的panel中,然后刷新表格那一部分顯示出來。

          一上來,我用了這個方法(添加到監聽器中):
          HtmlInputText text = new HtmlInputText();
          panel.getChildren().add(text);
          然后當填寫了值之后調用了text.getValue()方法,發現打印出來的是null,以為JSF無法捕獲Ajax生成控件的值,又嘗試設定了Action來生成控件,發現還是不行。

          最后只好使用了這個辦法:
          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方式還是表單提交的方式都可以使用這個方法獲得。所以我就在想,這個是什么原因,直接設置實例反而沒有辦法操作,還要重新獲取才可以。
          但是如果你在初始化控件的時候進行text.setValue("111");操作還是可以的,這樣輸入框就會默認出現值111。

          大家有什么看法,盡管發表,如果對這個需求有更好的解決方案,也請提出來,謝謝了。

          ---------------------------------------------------------
          專注移動開發

          Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
          posted on 2008-11-27 17:18 TiGERTiAN 閱讀(2117) 評論(9)  編輯  收藏 所屬分類: Java 、JSF

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

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

          因為ajax的context根jsf的context屬于不同進程,所以不能ajax的html 不能直接滲透到JSF中訪問component tree。

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

            回復  更多評論
            
          # re: 探討JSF Backing bean生成控件的問題 2008-11-29 00:35 | TiGERTiAN
          @David
          大概看懂了你的意思,只是不太明確代碼如何編寫,請問您有示例代碼提供給我參考下嗎?謝謝您了。  回復  更多評論
            
          # re: 探討JSF Backing bean生成控件的問題 2008-11-29 00:42 | TiGERTiAN
          @David
          還有就是,我的流程是后端生成HtmlInputText實例,把這個實例添加到panel中:
          HtmlInputText text = new HtmlInputText();
          panel.getChildren().add(text);
          然后前端調用Ajax直接渲染出來新的控件,如果后端在聲明實例之后又設置了setValue("1111"),前端是可以看到剛才設置的1111的。
          問題就在于,如果我想獲得用戶輸入的數據,直接調用剛才生成的實例text的getValue()方法是無法獲得用戶輸入的值的,只能獲得我剛才設置的1111,我在想可能JSF前端頁面綁定的實例已經不是我后端設置的這個了,是他自己生成的一個HtmlInputText,所以才只能用findComponent方法通過ID找到該控件。  回復  更多評論
            
          # re: 探討JSF Backing bean生成控件的問題 2008-11-29 01:01 | TiGERTiAN
          @huliqing
          應該不是這個原因  回復  更多評論
            
          主站蜘蛛池模板: 大名县| 乌恰县| 秭归县| 沛县| 九江市| 乌鲁木齐县| 乌恰县| 东台市| 丹巴县| 祥云县| 揭西县| 亳州市| 东台市| 林口县| 湘乡市| 基隆市| 清河县| 南平市| 客服| 华蓥市| 贵溪市| 定南县| 阿克苏市| 赤城县| 阿克| 齐河县| 雷波县| 睢宁县| 威远县| 卓资县| 项城市| 拜城县| 汤阴县| 阳曲县| 林州市| 上林县| 临江市| 黄浦区| 娄烦县| 深泽县| 凤台县|