2016-04-24 15 views
3

Ich wollte die Möglichkeit der Buchung/entfernen Buchung der Produktseite machen. Reservierung ist ok, das Entfernen leider nicht ...Aufruf Methoden in 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> 

Wenn ich die rendered="#{request.remoteUser eq wardrobeDetailsBean.selectedWardrobe.reservingUserId.username}" entfernt, es funktioniert.

Wenn auf die Reservierung geklickt wird, sollte nur die Schaltfläche zum Entfernen sichtbar sein. Was ist falsch, es funktioniert nicht? Das Protokoll irgendwelche Fehler habe ich nicht.

Nach der Verwendung der Anleitung aus den Antworten funktioniert die Anwendung so. enter image description here

Ich klicke auf "Reservieren". Das Produkt wurde reserviert, der Button wird getauscht.

enter image description here

ich auf „Reservierung aufheben“ und immer noch die Methode nicht aufgerufen wird, verliere ich die Informationen über das Produkt (aktualisieren Sie die Seite Informationen über das Produkt zurückgibt, aber das Produkt ist reserviert noch)

enter image description here

+0

Ist es JSF 2 oder JSF 1? –

+0

Mojtaba. Es ist JSF 2. – user3128303

+0

Was ist, wenn Sie es String anstelle von Void-Methode zurückgeben? –

Antwort

2

Rendered Attribut Schaltfläche im Prozess der Einreichung Form vor Anforderung an die Bean-Methode erreicht ausgewertet wird,

und wie Sie 01 geprüftin der gerenderten Methode, wird es leer sein für neue Anfrage (post Anfrage der Aktion), die gerenderte Auswertung wird "falsch" sein, so dass Ihre Methode nicht aufgerufen wird.

Sie müssen also sicherstellen, dass das gerenderte Attribut Ihrer Schaltfläche und ihrer Eltern während der Formularübermittlung wahr bleibt.

Das ist die Ursache, wenn Sie gerenderte Attribute entfernen, funktioniert es gut.

Als Abhilfe können Sie einen versteckten Eingang zu Ihrem Formular hinzufügen:

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


Update: ein andere Lösung

eines andere Lösung zu verwenden, ist eine einzige Taste, sondern verwenden Sie einen bedingten Wert Attribut und eine Umschaltmethode:

<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> 

Und in Ihrer Bohne, verwenden Sie einen Schalter e-Methode:

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

Ist jenseits der Aufgabe dieser Linie noch etwas anderes zu ändern? – user3128303

+0

aktualisiert diese Zeile –

+0

edited diese Zeile, so legen Sie den neuen Code in Ihrem Formular. –

Verwandte Themen