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)
我有 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)