在某些情况下渲染 f:viewAction

Render f:viewAction in some cases

我有一个 home 页面:

<f:metadata>
    <f:viewAction action="#{booksBean.selectBook()}"/>
</f:metadata>

<h:head>
    <title>home</title>
</h:head>
<h:body>
 ...
<h:link >
    <h:graphicImage name="images/books/s1.jpg" />
    <f:param name="isbn" value="25413652" />
</h:link>
...
</h:body>

当用户点击 link 时,isbn 值已正确发送到 booksBean.selectBook()

但问题是当用户从 login 页面导航到 home 页面时,

这里是 userBean.login() :

public String login() {
    if (loginSuccessfully) {
        return "home?faces-redirect=true"; // problem
    } else {
          //show error message
    }
}

问题出在提到的部分,当用户移动到 home.xhtml 时,booksBean.selectBook() 会自动调用,因为它还为空,所以我得到 NullPointerException.

如何在不调用 booksBean.selectBook() 的情况下从 login 页面转到 home 页面?

这是不使用 f:viewaction

的解决方案
<h:commandButton value="optional value" action="#{booksBean.selectBook()}">
    <f:param name="isbn" value="25413652"></f:param>
    <f:ajax execute="@form" render="@form"></f:ajax>
</h:commandButton>

您可以通过指定 if 条件来选择性地调用 f:viewAction。在您的情况下,您似乎只想在回发时执行操作,在这种情况下,您可以:

  <f:viewAction action="#{booksBean.selectBook()}" if="#{facesContext.postBack}"/>

相关:

  • When to use preRenderView versus viewAction?