2

我有 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 中是否有一种方法可以在页面之间导航,同时使用操作方法来实际做某事,但是当我不需要它们被调用时没有调用这些方法?

4

1 回答 1

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

它们被称为值表达式,因为它们的返回值需要在 JSF 呈现响应阶段生成 HTML 输出期间打印在其中。它们的返回值href在生成的 HTML 输出中使用。右键单击 webbrowser 中的页面,查看源代码并查看href属性值。如果这些方法返回String,您将看到该字符串正在那里打印。

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

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

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

默认情况下单击普通链接会发送 GET 请求而不是 POST 请求。如果您想继续使用 GET,这在这种特定情况下是一件好事,那么您应该在@PostConstruct与目标页面关联的支持 bean 的方法中执行数据库作业,而不是像您在加载包含这些链接的页面时那样做.

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

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

    // ...
}

也可以看看:

于 2016-02-21T18:38:14.157 回答