2014-03-25 162 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的信息。”