2016-04-24 64 views
3

我想提出預訂/刪除預訂產品頁面的可能性。 預訂是好的,消除可惜不是......jsf中的調用方法

@ManagedBean(name = "wardrobeDetailsBean") 
@SessionScoped 
//@RequestScoped 
public class WardrobeDetailsBean implements Serializable { 

    @Inject 
    WardrobeService wardrobeService; 
    @Inject 
    AuthBean authBean; 

    // other fields + setters, getters 

    @ManagedProperty("#{param.id}") 
    private Long id; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getUsernameReserving() { 
     this.selectedWardrobe = wardrobeService.getWardrobeById(id); 
     String usernameById = selectedWardrobe.getReservingUserId().getUsername(); 
     StringBuilder sb = new StringBuilder(); 
     sb.append(usernameById.substring(0, 2)); 
     sb.append("..."); 
     sb.append(usernameById.substring(usernameById.length() - 2, usernameById.length())); 
     return sb.toString(); 
    } 

    @PostConstruct 
    public void init() { 
     if (FacesContext.getCurrentInstance().getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) { 
      dbImage1 = new DefaultStreamedContent(); 
     } else if (id != null) { 
      this.selectedWardrobe = wardrobeService.getWardrobeById(id); 
      } 
     } 
    } 

    public String reserve() { 
     this.selectedWardrobe = wardrobeService.getWardrobeById(id); 
     if (authBean.getUser() != null && authBean.getUser().getId() != null) { 
      selectedWardrobe.setReservingUserId(authBean.getUser()); 
      wardrobeService.reserveProduct(selectedWardrobe); 
      return null; 
     } else { 
      return "/login.xhtml?faces-redirect=true"; 
     } 
    } 

    public void unreserve() { 
     this.selectedWardrobe = wardrobeService.getWardrobeById(id); 
     selectedWardrobe.setReservingUserId(null); 
     wardrobeService.reserveProduct(selectedWardrobe); 
    } 
} 

productView.xhtml

<h:commandButton id="reserve" styleClass="btn-u btn-u-sea-shop btn-u-lg" rendered="#{wardrobeDetailsBean.selectedWardrobe.reservingUserId eq null}" 
    value="Reserve" action="#{wardrobeDetailsBean.reserve()}"> 
     <f:ajax execute="@form" render="reservePanel"/> 
</h:commandButton> 

<h:outputText value="This product has been reserved by #{wardrobeDetailsBean.usernameReserving}" rendered="#{wardrobeDetailsBean.selectedWardrobe.reservingUserId ne null}"/> 
<br /> 
<input type="hidden" name="remoteUser" value="#{request.remoteUser}"/> 
// added using guidance from the answers 
<h:commandButton id="unreserve" styleClass="btn-u btn-u-red btn-u-lg" rendered="#{request.remoteUser eq wardrobeDetailsBean.selectedWardrobe.reservingUserId.username}" 
    value="Unreserve" action="#{wardrobeDetailsBean.unreserve()}"> 
     <f:ajax execute="@form" render="reservePanel"/> 
</h:commandButton> 

當我刪除了rendered="#{request.remoteUser eq wardrobeDetailsBean.selectedWardrobe.reservingUserId.username}",它的工作原理。

當預訂被點擊時,它應該只是可見的按鈕來刪除。 有什麼不對,它不起作用?日誌任何錯誤我沒有。

使用答案的指導後,應用程序就像這樣工作。 enter image description here

我點擊「保留」。該產品已被保留,該按鈕將被交換。

enter image description here

我點擊「取消保留」,目前仍是法不叫,我失去了關於產品的信息(刷新頁面返回有關產品的信息,但產品仍保留)

enter image description here

+0

它是JSF 2還是JSF 1? –

+0

Mojtaba。它是JSF 2. – user3128303

+0

如果你讓它返回String而不是void方法呢? –

回答

2

渲染按鈕的屬性,在提交申請前形式的過程評估達到你的bean方法,

,併爲你檢查request.remoteUser在呈現的方法中,對於新的請求(發佈操作請求)它將爲空,呈現的評估將爲「false」,因此您的方法未被調用。

因此,您必須確保您的按鈕及其父母的呈現屬性在表單提交期間保持爲true。

這是您刪除呈現屬性時的原因,它工作正常。

作爲一種變通方法,您可以隱藏的輸入添加到您的形式:

<input type="hidden" name="remoteUser" value="#{request.remoteUser}"/> 
<input type="hidden" name="id" value="#{param.id}"/> 


更新:另一種解決方案

另一種解決方案是使用一個單獨的按鈕,但使用條件值屬性和切換方法:

<h:commandButton id="toggle" 
    styleClass="btn-u btn-u-#{(wardrobeDetailsBean.selectedWardrobe.reservingUserId eq null) ? 'sea-shop' : 'red' } btn-u-lg" 
    value="#{(wardrobeDetailsBean.selectedWardrobe.reservingUserId eq null) ? 'Reserve' : 'Unreserve'}" 
    action="#{wardrobeDetailsBean.toggle()}"> 
     <f:ajax execute="@form" render="reservePanel"/> 
</h:commandButton> 

而在你的bean中,使用一個toggl e方法:

public String toggle() { 
     this.selectedWardrobe = wardrobeService.getWardrobeById(id); 
     if(selectedWardrobe.getReservingUserId() == null){ 
      if (authBean.getUser() != null && authBean.getUser().getId() != null) { 
       selectedWardrobe.setReservingUserId(authBean.getUser()); 
       wardrobeService.reserveProduct(selectedWardrobe); 
       return null; 
      } else { 
       return "/login.xhtml?faces-redirect=true"; 
      } 
     }else{ 
      this.selectedWardrobe = wardrobeService.getWardrobeById(id); 
      selectedWardrobe.setReservingUserId(null); 
      wardrobeService.reserveProduct(selectedWardrobe); 
     } 

    } 
+0

超出了這一行的任務,還有什麼我應該改變? – user3128303

+0

已更新該行 –

+0

已編輯該行,因此請將新代碼放入您的表單中。 –