我有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中是否有一种在页面之间导航的方法,同时使用操作方法来实际执行某件事情,但是当我不需要调用这些方法时,却没有调用这些方法?
发布于 2016-02-21 18:38:14
<a href="#{bean.gotoMySrchie()}"> <h:link ... outcome="#{bean.gotoMySearches()}">它们被调用为值表达式,因为在JSF呈现响应阶段生成HTML输出时,需要将它们的返回值打印在其中。它们的返回值在结果的href输出中用作。右键单击webbrowser中的页面,执行View并查看href属性值。如果这些方法返回String,您将看到该字符串正在那里打印。
与您预期的相反,在JSF调用应用程序阶段,它们不是作为回发结果调用的方法表达式。这只是一个根本的误解。若要在回发期间调用操作,则需要使用<h:commandXxx action>。
<h:form>
<h:commandLink ... action="#{bean.gotoMySearches()}" />
</h:form>但是,这会触发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.
}
// ...
}另请参阅:
https://stackoverflow.com/questions/35539848
复制相似问题