6

简而言之,这是我的情况。

我有一个带有数据表的页面和几个由 bean 支持的按钮。Bean 应该使用一些默认属性进行初始化。该属性可以根据操作进行更改。我从 RequestScoped bean 和 @PostConstruct 注释方法开始。但似乎数据表仅适用于视图(会话)范围。现在我的设置如下所示:

@ManagedBean
@ViewScoped
public class ProductsTableBean implements Serializable {

    private LazyDataModel<Products> productsData;
    @Inject
    private ProductsFacade model;


    public void onPageLoad() {
       // here some defaults are set
       // ...
       System.err.println("onPageLoad called");
    }

    public void addRow() {
       // andhere some defaults redefined
       // ...
       System.err.println("addRow called");
    }

    ...

和来自 jsf 页面的片段:

    <p:commandButton action="#{productsTableBean.addRow()}"
                     title="save"
                     update="@form" process="@form" >
    </p:commandButton>
    ...
    <f:metadata>
        <f:event type="preRenderView" listener="#{productsTableBean.onPageLoad}"/>
    </f:metadata>

这是调用顺序中出现的主要问题,我有以下输出:

onPageLoad called
addRow called
onPageLoad called <-- :(

但我希望 addRow 成为最后一个被调用的操作,如下所示:

onPageLoad called
addRow called

这里有什么简单的解决方案吗?

4

1 回答 1

8

检查此链接: http ://www.mkyong.com/jsf2/jsf-2-prerenderviewevent-example/

您知道每个请求都会调用该事件:ajax,验证失败....您可以检查它是否是这样的新请求:

public boolean isNewRequest() {
        final FacesContext fc = FacesContext.getCurrentInstance();
        final boolean getMethod = ((HttpServletRequest) fc.getExternalContext().getRequest()).getMethod().equals("GET");
        final boolean ajaxRequest = fc.getPartialViewContext().isAjaxRequest();
        final boolean validationFailed = fc.isValidationFailed();
        return getMethod && !ajaxRequest && !validationFailed;
    }

public void onPageLoad() {
       // here some defaults are set
       // ...
if (isNewRequest()) {...}
       System.err.println("onPageLoad called");
    }
于 2012-08-06T12:05:47.633 回答