5

我在 ViewScope 模式下有一个托管 Bean。因此,当我从此托管 Bean 调用某些操作时,我的页面不会更新。我看到我的操作被很好地调用并返回 null(viewscope 工作流程正常)。

那么,我做错了什么?

如果我使用 Ajax 重新呈现页面,它可以正常工作。

编辑:

我的版本是:

JSF 2.1.14 和 Primefaces 3.4.1

我的代码:

@ManagedBean(name = "test")
@ViewScoped
public class TestMB implements Serializable {
   private String status;

   public String getStatus() { return this.status; }
   public void setStatus(String status) { this.status = status; } 

   public String changeStatus() {
      this.status = "ViewScope Works!";
      return null;
   }

}

我的页面:

<!DOCTYPE HTML>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:p="http://primefaces.org/ui"
                template="/template/ui.xhtml">
    <ui:define name="head">
    </ui:define>
    <ui:define id="teste" name="content">
        <h:form id="form">  
            <h:outputText id="status" value="OK?: #{test.status}" />
            <p:commandButton id="myAction" value="Do it!" action="#{test.changeStatus}"  />
        </h:form>  
    </ui:define>
</ui:composition>

在我的屏幕上,状态变量不会改变。而且,是的..这个动作被称为OK。一些小费?

4

1 回答 1

10

<p:commandButton>用于提交表单。它默认发送一个 ajax 请求。默认情况下它不会更新任何内容。因此,您正在观察的行为是完全可以预料的。有几种方法可以解决这个“问题”(引用,因为它实际上不是问题,而只是概念上的误解):

  1. 告诉它不要使用ajax。

    <p:commandButton ... ajax="false" />
    
  2. 告诉它更新表格。

    <p:commandButton ... update="@form" />
    
  3. 替换为默认不使用 ajax 的标准 JSF 组件。

    <h:commandButton ... />
    

请注意,这个具体问题与视图范围本身无关。使用另一个范围(包括请求范围)时,您会遇到完全相同的问题(使用完全相同的解决方案)。

于 2012-12-17T16:00:53.373 回答