2013-05-06 115 views
0

我有這個頁面,我有兩種形式。第二種形式是由ajax加載(呈現)。問題是,當按下下一個表單的按鈕時,頁面只是重新加載自己,而不實際調用'action'中指定的方法。jsf commandbutton操作不起作用ajax

XHTML

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets" 
       template="./../WEB-INF/employeeTemplate.xhtml" 
       xmlns:h="http://java.sun.com/jsf/html" 
       xmlns:f="http://java.sun.com/jsf/core" 
       xmlns="http://www.w3.org/1999/xhtml"> 

    <ui:define name="content"> 
     finding user ... 
     <h:form id="mainForm"> 
      <h:inputText id="userId" value="#{eFindUser.userId}" /> 
      <h:commandButton value="Render!" action="#{eFindUser.findUser}" > 
       <f:ajax event="action" execute="userId" render="@all" /> 
      </h:commandButton> 
     </h:form>   

     <h:panelGroup id="result"> 
      <h:panelGroup layout="block" rendered="#{eFindUser.notFound}" style="color:red"> 
       User not found 
      </h:panelGroup> 

      <h:form> 
       <h:panelGroup layout="block" rendered="#{eFindUser.responseRendered}" > 

        <h:inputHidden value="#{eFindUser.user}" /> 
        <table> 
         <tr> 
          <td>Name</td> <td>#{eFindUser.user.name}</td> 
         </tr> 
         <tr> 
          <td>Balance:</td> <td>#{eFindUser.user.account.balance}</td> 
         </tr> 

         <tr> 
          <td><h:commandButton value="update balance" action="#{eFindUser.process()}" /></td> 
         </tr> 
        </table> 


       </h:panelGroup> 
      </h:form>       
     </h:panelGroup> 



    </ui:define> 

</ui:composition> 

支持bean

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package backingbeans; 

import entities.User; 
import java.io.Serializable; 
import java.util.Random; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 
import javax.inject.Inject; 
import javax.validation.constraints.NotNull; 
import stateless.EmployeeFacade; 

/** 
* 
* @author Martin 
*/ 
    @ManagedBean(name="eFindUser") 
    @ViewScoped 
    public class EFindUserManagedBean implements Serializable{ 
     private static final long serialVersionUID = -7106162864352727534L; 
     private boolean responseRendered = false; 
     private boolean notFound = false; 
     @NotNull 
     private Long userId; 
     private User user; 

     @Inject 
     private EUpdateBalanceManagedBean updateBalance; 

     @Inject 
     private EmployeeFacade employeeFacade; 

     /** 
     * Creates a new instance of EFindUserManagedBean 
     */ 

     public EFindUserManagedBean() { 
     } 

     public void findUser() { 
      if(new Random().nextDouble() < 0.3) { 
       notFound = true; 
       responseRendered = false; 
      } else { 
       notFound = false; 
       responseRendered = true; 
       user = employeeFacade.getUserById(3L); 
      } 

     } 
     public boolean isResponseRendered() { 
      return responseRendered; 
     } 

     public void setResponseRendered(boolean responseRendered) { 
      this.responseRendered = responseRendered; 
     } 

    public boolean isNotFound() { 
     return notFound; 
    } 

    public void setNotFound(boolean notFound) { 
     this.notFound = notFound; 
    } 

    public Long getUserId() { 
     return userId; 
    } 

    public void setUserId(Long userId) { 
     System.out.println("blah"); 
     this.userId = userId; 
    } 

    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     System.out.println("setting user"); 
     this.user = user; 
    } 


    public String process() { 
     updateBalance.setUser(user); 
     System.out.println("process"); 
     return "/employee/updateBalance.xhtml?faces-redirect=true"; 
    } 

    } 

當我點擊第一個 '渲染!' - 標記按鈕,它就像魅力。第二種形式被加載並準備工作。當我點擊下一個「更新餘額」標籤的按鈕時,頁面會重新加載,當然,它不應該加載。它應該重定向到「/ employee/updateBalance」。或者至少應該調用處理方法。

非常感謝

編輯:@BalusC是正確的,答案是前一個問題

+0

指定形式的id不解決它 – 2013-05-06 12:29:40

回答

0

罪魁禍首可以在<h:inputHidden>標籤第二種形式的發現:

<h:form> 
    <h:panelGroup layout="block" rendered="#{eFindUser.responseRendered}" > 
     <h:inputHidden value="#{eFindUser.user}" /> 
    </h:panelGroup> 
</h:form> 

最有可能其綁定值eFindUser.user的類型爲User,並且當您提交該表單時,JSF不知道如何爲User對象指定用戶的字符串表示形式。

因此,根據JSF生命週期,存在轉換錯誤,在這種情況下,不會調用操作方法。此外,如果您在視圖中有<h:messages>,則應該知道。

什麼可以做如下:

  1. 分配轉換器到你的輸入像<h:inputHidden value="#{eFindUser.user}" converter="userConverter"/>與實施@FacesConverter。更多細節可以參見here
  2. <h:inputHidden>綁定到String,以便不需要轉換器:<h:inputHidden value="#{eFindUser.user.userNickname}">Integer以類似的方式。
+0

我刪除了'的'因爲它不是強制性的。由於輔助bean是View範圍,所以不必刷新。它沒有解決問題,儘管 – 2013-05-06 12:14:09

+0

試着將''發現是否有任何轉換/驗證錯誤。 – skuntsel 2013-05-06 12:17:25

+0

沒有任何消息 – 2013-05-06 12:30:43

0

修改 <h:commandButton value="update balance" action="#{eFindUser.process()}" /><h:commandButton value="update balance" action="#{eFindUser.process}" /> EL表達式不能包含「()」