2014-03-25 68 views
0

在一個xhtml頁面中,我有一個包含項目列表的表格。對於每個項目都有一個按鈕,由於刪除該項目。 一切似乎正常工作,但如果我按下瀏覽器的「刷新」按鈕,將被刪除我的表的另一項,如果我再次按刷新,將消失另一個等等。 我覺得有一點像這樣的調用,再次刷新頁面時,一種事件「在按鈕上執行的操作」。 我該如何避免這個可怕的問題?JSF問題刷新頁面

-xhtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui"> 

    <h:body> 
    <h:form> 
    <p:dataTable var="c" value="#{viewContattoBean.contatto}"> 
     <p:column headerText="Nome"> 
      <h:outputText value="#{c.contattoid}" /> 
     </p:column> 

     <p:column headerText="Telefono"> 
      <h:outputText value="#{c.numero}" /> 
     </p:column> 
     <p:column headerText="Elimina"> 
      <h:commandButton action="#{viewContattoBean.removeContatto(c)}" value="Elimina" /> 
     </p:column> 
    </p:dataTable> 
    </h:form> 
    </h:body> 
</html> 

,尤其是圓形的管理bean:

@ManagedBean(name="viewContattoBean") 
@RequestScoped 
public class ViewContattoBean { 
    @EJB 
    private GestoreContattiLocal ejb; 

    private ContattoDTO[] contatto; 

    public ContattoDTO[] getContatto() { 
        System.out.println(FacesContext.getCurrentInstance().getExternalContext().getRemoteUser()); 
     return ejb.getAll(FacesContext.getCurrentInstance().getExternalContext().getRemoteUser()); 
    } 

    public void setContatto(ContattoDTO[] contatto) { 
     this.contatto = contatto; 
    } 

    public void removeContatto(ContattoDTO contatto){ 
     System.out.println("remove: " + contatto.getUtenteid() + ", " + contatto.getContattoid()); 
     ejb.removeContatto(contatto.getUtenteid(), contatto.getContattoid()); 
    } 

} 

感謝大家

回答

0

當您刷新重複最後一個服務器調用的頁面。 所以,當你按下刪除按鈕後,服務器發出一條消息,刷新按鈕重複這個動作。
此問題已通過Redirect-After-Post模式解決。 要避免此行爲,應使用get參數faces-redirect=true執行重定向。 所以如下bean的應修改:

@ManagedBean(name="viewContattoBean") 
@RequestScoped 
public class ViewContattoBean { 

    //... 

    public String removeContatto(ContattoDTO contatto){ 
     System.out.println("remove: " + contatto.getUtenteid() + ", " + contatto.getContattoid()); 
     ejb.removeContatto(contatto.getUtenteid(), contatto.getContattoid()); 
     return "pageName?faces-redirect=true" 
    } 

} 

深化閱讀這篇文章關於POST-REDIRECT-GET and JSF 2.0的問題。

+0

對不起landal79,我已經嘗試過,但它不工作。 – Samuele

0

我tryed與此代碼像你說,但恰恰是在HTML頁面之前表現一樣,具有同樣的問題...

public String removeContatto(ContattoDTO contatto){ 
     System.out.println("remove: " + contatto.getUtenteid() + ", " + contatto.getContattoid()); 
     ejb.removeContatto(contatto.getUtenteid(), contatto.getContattoid()); 
     return "user/view.hxtml?faces-redirect=true"; 
    } 

我有:

<h:commandButton action="#{viewContattoBean.removeContatto(c)}" value="Elimina" /> 

謝謝順便回答,併爲我遲到的答案感到抱歉。

Samuele

0

也許問題可能是我重定向到以前的同一頁? P.S也許我應該說,當我按下刷新按鈕將出現一條消息,詢問我:

「再次渲染網頁需要重新發送throught的webbroswer已經sended的信息。」