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

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

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

    隨筆-348  評(píng)論-598  文章-0  trackbacks-0
    在新項(xiàng)目中,我們要做一個(gè)這樣的功能:有一個(gè)表格,沒(méi)有記錄,當(dāng)用戶(hù)點(diǎn)擊“添加”的時(shí)候,會(huì)生成一條行,里面包含了文本輸入框,下拉框等等,需要用戶(hù)填寫(xiě),以此類(lèi)推,用戶(hù)只要需要,他可以填寫(xiě)無(wú)限條信息,最后點(diǎn)擊一個(gè)“保存”來(lái)保存所有記錄。
     這里,我們?yōu)榱颂岣哂脩?hù)的體驗(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),謝謝了。

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

    Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
    posted on 2008-11-27 17:18 TiGERTiAN 閱讀(2111) 評(píng)論(9)  編輯  收藏 所屬分類(lèi): 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í)例獲取用戶(hù)輸入的值就不可以。。  回復(fù)  更多評(píng)論
      
    # re: 探討JSF Backing bean生成控件的問(wèn)題 2008-11-28 07:40 | Libo
    這樣應(yīng)該是在后臺(tái)得到panel組件,然后類(lèi)似于這樣的代碼:
    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(),都得不到用戶(hù)輸入的值。  回復(fù)  更多評(píng)論
      
    # re: 探討JSF Backing bean生成控件的問(wèn)題 2008-11-28 14:38 | huliqing
    不過(guò)我倒是覺(jué)得這個(gè)功能可以不需要用到ajax.
    使用js在客戶(hù)端直接生成子組件,不過(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中訪(fǎng)問(wèn)component tree。

    我的想法就是
    設(shè)置一個(gè)agent駐留在jsf application中,即每個(gè)agent實(shí)例與每一個(gè)jsf request-response在同一分配的thread中,agent可以訪(fǎng)問(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)題就在于,如果我想獲得用戶(hù)輸入的數(shù)據(jù),直接調(diào)用剛才生成的實(shí)例text的getValue()方法是無(wú)法獲得用戶(hù)輸入的值的,只能獲得我剛才設(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)論
      
    主站蜘蛛池模板: 亚洲白嫩在线观看| 手机看黄av免费网址| 中文字幕乱码系列免费| 精品一区二区三区免费毛片爱| 国产在线观看麻豆91精品免费| 国产免费午夜a无码v视频| 亚洲精品无码MV在线观看| 中文字幕无码亚洲欧洲日韩| 免费人人潮人人爽一区二区| 1a级毛片免费观看| 亚洲熟妇无码AV在线播放| 精品亚洲成A人在线观看青青| 免费无遮挡无码永久视频| 精品久久久久久久免费加勒比| 亚洲日韩欧洲无码av夜夜摸| 亚洲精品无码一区二区| 国产精品久久永久免费| 狠狠综合久久综合88亚洲| 国产成人亚洲精品蜜芽影院| 免费A级毛片无码无遮挡内射| 亚洲αv在线精品糸列| 香蕉免费在线视频| 4338×亚洲全国最大色成网站| 亚洲偷自精品三十六区| 免费AA片少妇人AA片直播| 亚洲成年人免费网站| 精品国产免费一区二区三区香蕉| 亚洲日韩中文字幕日韩在线| 偷自拍亚洲视频在线观看| 免费萌白酱国产一区二区| 噜噜综合亚洲AV中文无码| 日本高清免费网站| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 毛片a级三毛片免费播放| 激情亚洲一区国产精品| 免费观看美女裸体网站| 免费一级毛suv好看的国产网站| 国产免费观看青青草原网站| 一区免费在线观看| 亚洲午夜久久久影院伊人| 99在线免费观看视频|