<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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 閱讀(2112) 評論(9)  編輯  收藏 所屬分類: JavaJSF

    評論:
    # 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
    應該不是這個原因  回復  更多評論
      
    主站蜘蛛池模板: 亚洲日韩精品无码AV海量| 激情综合亚洲色婷婷五月| 日本高清免费中文在线看| 日韩成人在线免费视频| 亚洲av成本人无码网站| 国产免费人成在线视频| 深夜A级毛片视频免费| 亚洲国产午夜福利在线播放| 亚洲黄片手机免费观看| 亚洲自偷自偷图片| 最好免费观看高清在线| 久久国产亚洲电影天堂| 24小时免费看片| 亚洲综合激情五月色一区| 欧洲美熟女乱又伦免费视频| 免费福利在线观看| 亚洲午夜未满十八勿入网站2| 日韩电影免费在线观看| 亚洲日本视频在线观看| 女人让男人免费桶爽30分钟| 国产亚洲精品美女| 亚洲精品无码高潮喷水在线| 最近中文字幕高清免费中文字幕mv| 亚洲国产成人无码av在线播放| 免费精品人在线二线三线区别| 亚洲暴爽av人人爽日日碰| 亚洲中文字幕无码专区| 91福利免费视频| 亚洲精品国产首次亮相| 毛茸茸bbw亚洲人| 91精品免费国产高清在线| 日韩亚洲人成在线综合| 亚洲精品成人片在线观看精品字幕| 亚洲黄色免费观看| 粉色视频免费入口| 78成人精品电影在线播放日韩精品电影一区亚洲 | 一级女人18毛片免费| 亚洲AV无码片一区二区三区| 久久亚洲欧洲国产综合| 黄色片在线免费观看| 国产福利电影一区二区三区,免费久久久久久久精 |