2016-04-24 46 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

已编辑该行,因此请将新代码放入您的表单中。 –

相关问题