【问题标题】:JSF Issue with Refreshing a page刷新页面的 JSF 问题
【发布时间】:2014-03-25 22:15:44
【问题描述】:

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

}

谢谢大家

【问题讨论】:

    标签: jsf refresh


    【解决方案1】:

    当您刷新页面时,会重复最后一次服务器调用。 因此,当您按下删除按钮时,会向服务器发布帖子,刷新按钮会重复此操作。
    使用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 的文章。

    【讨论】:

      【解决方案2】:

      我按照你说的那样尝试了这段代码,但行为与以前完全相同,但问题相同......

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

      顺便说一句,感谢您的回答,对于我迟到的回答感到抱歉。

      萨缪尔

      【讨论】:

        【解决方案3】:

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

        “重新渲染网页需要通过网络浏览器重新发送已经发送的信息。”

        【讨论】:

          猜你喜欢
          • 2012-08-13
          • 1970-01-01
          • 2021-12-31
          • 1970-01-01
          • 2011-05-13
          • 2017-04-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多