刷新页面的JSF问题

时间:2014-03-25 22:15:45

标签: jsf refresh

在xhtml页面中,我有一个包含项目列表的表格。对于每个项目,都有一个按钮,因为删除该项目。 一切似乎都能正常工作,但是如果我按下"刷新"浏览器的按钮,将删除我的表的另一项,如果我再次按下刷新,将消失另一个,依此类推。 我认为有一些想法再次称之为一种事件"在按钮上执行的操作"当我刷新页面时。 我怎样才能避免这个可怕的问题?!​​

-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());
    }

}

感谢大家

3 个答案:

答案 0 :(得分:0)

刷新页面时,将重复上次服务器调用。 因此,当您按下删除按钮时,会向服务器发送一个帖子,刷新按钮会重复此操作 使用Redirect-After-Post模式解决了此问题。 要避免此行为,您应该使用get param 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

的文章

答案 1 :(得分:0)

我尝试使用这个代码,就像你说的那样,但是它的行为和以前完全一样,同样的问题......

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";
    }

在html页面中我有:

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

谢谢你回答,顺便说一下,对不起我迟到的回答。

Samuele

答案 2 :(得分:0)

也许问题可能是我重定向到以前的同一页面?! P.s也许我应该说当我按下刷新按钮时会出现一条消息,问我:

  

&#34;要再次渲染,网页必须通过webbroswer重新发送已经发出的信息。&#34;