href / h:link outcome / h:button outcome 方法在页面加载期间自动调用,无需任何点击

a href / h:link outcome / h:button outcome methods automatically called during page load without any clicks

我有 3 个页面和 3 个链接,我尝试使用 h:link 或只是一个 <a> 标签实现。但是在这两种情况下,每当我导航到页面时,都会调用连接到这些链接的方法。

下面是 <a> 标记实现:

<a href="#{bean.gotoMySrchie()}">           
    <h:graphicImage library="images" name='vo2/FavPlus.png' />
</a>

<a href="#{bean.gotoMySearches()}">         
    <h:graphicImage library="images" name='vo2/SearchesPlus.png' />
</a>

<a href="#{bean.gotoMyBids()}">         
    <h:graphicImage library="images" name='vo2/BidsPlus.png' />
</a> 

h:link 实现如下所示:

<h:link title="Searches" id="searchesLogo" value="" outcome="#{bean.gotoMySearches()}">
    <h:graphicImage library="images" name='vo2/SearchesPlus.png' />
</h:link>

问题是这些操作方法中的每一个都在调用我的数据库,这完全是调用的浪费。那么在 JSF2 中有没有一种方法可以在页面之间导航,同时使用操作方法来实际做某事,但是当我不需要调用它们时却没有调用这些方法?

<a href="#{bean.gotoMySrchie()}">           
<h:link ... outcome="#{bean.gotoMySearches()}">

它们被称为值表达式,因为它们的 return 值需要在 JSF 呈现响应阶段生成 HTML 输出期间打印在那里。它们的 return 值在结果 HTML 输出中用作 href。在 webbrowser 中右键单击该页面,执行 View Source 并查看 href 属性的值。如果这些方法 returned String,你会看到那里打印的字符串。

与您的预期相反,它们在 JSF 调用应用程序阶段作为回发的结果未作为方法表达式调用。这只是根本性的误解。要在回发期间调用操作,您需要 <h:commandXxx action>

<h:form>
    <h:commandLink ... action="#{bean.gotoMySearches()}" />
</h:form>

然而,这会触发 POST 请求,而不是 GET 请求,因此可能会产生许多其他后果。

默认情况下单击普通 link 会发送 GET 请求而不是 POST 请求。如果您想继续使用 GET,which is a good thing in this specific case,那么您应该在与目标页面关联的支持 bean 的 @PostConstruct 方法中执行数据库作业,而不是在加载包含那些 link 的页面期间]就像你在那里所做的那样。

<h:link ... outcome="/searches">
    <h:graphicImage ... />
</h:link>
@Named
@RequestScoped // Or @ViewScoped
public class SearchesBean {

    @PostConstruct
    public void init() {
        // Here.
    }

    // ...
}

另请参阅:

  • Invoke JSF managed bean action on page load
  • When should I use h:outputLink instead of h:commandLink?
  • Differences between action and actionListener
  • How to navigate in JSF? How to make URL reflect current page (and not previous one)