6

これが私の状況です。

私はデータテーブルとBeanに裏打ちされたいくつかのボタンを備えたページを持っています。Beanは、いくつかのデフォルトのプロパティで初期化する必要があります。そのプロパティは、アクションに応じて変更できます。RequestScopedBeanと@PostConstruct注釈付きメソッドから始めました。しかし、datatableはView(Session)scopedでのみうまく機能するようです。これで、私のセットアップは次のようになります。

@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, validation fail .... 次のように新しいリクエストかどうかを確認できます:

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 に答える