h:link / h:在页面加载期间自动调用的按钮结果方法,没有任何点击

时间:2016-02-21 18:05:18

标签: jsf jsf-2 hyperlink methodexpression

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

1 个答案:

答案 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.
    }

    // ...
}

另见: