我有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中是否有一种方法可以在页面之间导航,同时使用动作方法实际执行某些操作,但是当我不需要调用它们时,没有这些方法被调用?
答案 0 :(得分:4)
<a href="#{bean.gotoMySrchie()}">
<h:link ... outcome="#{bean.gotoMySearches()}">
它们被称为值表达式,因为在JSF渲染响应阶段生成HTML输出期间,需要在其中打印返回值。它们的返回值在生成的HTML输出中用作href
。在webbrowser中右键单击页面,执行查看源并查看href
属性的值。如果这些方法返回String
,您就会看到那个字符串正好在那里打印。
与您的预期相反,它们在JSF调用应用程序阶段时不会被称为方法表达式作为回发的结果。这只是一个根本的误解。要在回发期间调用操作,您需要<h:commandXxx action>
。然而,这会触发POST请求,而不是GET请求,因此可能会产生许多其他后果。
默认情况下单击普通链接会发送GET请求而不是POST请求。如果你想继续使用GET which is a good thing in this specific case,那么你应该在与目标页面相关联的支持bean的@PostConstruct
方法中执行数据库作业,而不是在加载包含这些链接的页面时那里。
<h:link ... outcome="/searches">
<h:graphicImage ... />
</h:link>
@Named
@RequestScoped // Or @ViewScoped
public class SearchesBean {
@PostConstruct
public void init() {
// Here.
}
// ...
}