2013-04-03 92 views
1

ViewScope bean允許ajax調用嗎?支持ViewScope bean的JSF ajax調用?

例如:

這裏是一個XHTML頁面:

<h:body> 
     <h:selectOneMenu value="#{test.selected}"> 
      <f:selectItem itemValue="2" itemLabel="2" /> 
      <f:selectItem itemValue="3" itemLabel="3" /> 
      <f:ajax listener="#{test.updateData()}" /> 
     </h:selectOneMenu> 
</h:body> 

這裏是ViewScoped豆:

@ViewScoped 
@Named 
public class test implements Serializable{ 
    private String selected; 


    public void updateData(){ 
     System.out.println("Ajax call successful."); 
    } 

    public String getSelected() { 
     return selected; 
    } 

    public void setTest(String test) { 
     this.selected = selected; 
    } 
} 

當我嘗試這樣做,也沒有工作。

+0

你對「沒有工作」不是很清楚。我會簡單地假設你沒有看到任何打印到stdout的東西。將來,請從開發者的角度而不是從最終用戶的角度來闡述問題。 JS/ajax函數是否被調用? (閱讀JS控制檯的錯誤)HTTP請求是否正確發送? (閱讀瀏覽器的開發人員工具集的網絡部分中的HTTP流量監視器)是否構建了bean並調用了方法? (放置斷點,運行調試器,讀取異常的服務器日誌等)返回的HTTP響應的主體包含什麼?等等.. – BalusC

回答

3

其實,你在迄今爲止發佈的代碼3個嚴重的問題:

  1. <h:form>丟失。不確定,但如果這是粗心的準備問題或實際的代碼。解決方案很明顯:將UIInputUICommand組件分組在一個獨立的<h:form>中。

  2. 在當前的JSF版本中,JSF的範圍註釋@javax.faces.bean.ViewScoped在CDI的bean管理註釋@Named上不起作用。

    基本上有3個解決方案:

    • 使用CDI的@ConversationScoped代替。有關具體示例,另請參閱How to replace @ManagedBean/@ViewScope by CDI in JSF 2.0/2.1。然而,這具有令人討厭的副作用,即它將cid請求參數附加到每個結果URL。
    • 使用MyFaces CODI將JSF @ViewScoped連接到CDI。然而,這具有令人討厭的副作用,它會將windowId請求參數附加到每個單個結果URL。
    • 等待JSF 2.2發佈,以便您可以使用與JSF視圖狀態關聯的兼容CDI的@javax.faces.view.ViewScoped註釋。


    但是,這是很難的具體問題作爲bean行動的原因應該只被調用,但豆只會像一個@RequestScoped

  3. 缺失setter方法。然而,當表單成功提交時,這應該會向服務器日誌拋出一個相當自我解釋的PropertyNotWritableException

還有第四種可能的原因,不能是肯定的基礎上迄今爲止所提供的信息予以確認:缺少<h:head>會導致<f:ajax>失敗,因爲所需的jsf.js不能自動納入。

1

你有一個錯誤的二傳手這將導致錯誤

public void setTest(String test) { 
    this.selected = selected; 
} 

這必須是

public void setSelected(String test) { 
    this.selected = test; 
} 

作爲邊沒有,此setter被調用H:selectOneMenu用於值=「#{測試.selected}「當您的組合框中選擇一個項目時會觸發它。