【问题标题】:a href / h:link outcome / h:button outcome methods automatically called during page load without any clicksa href / h:link 结果 / h:button 结果方法在页面加载期间自动调用,无需任何点击
【发布时间】:2016-06-03 01:33:53
【问题描述】:

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

【问题讨论】:

    标签: jsf hyperlink methodexpression


    【解决方案1】:
    <a href="#{bean.gotoMySrchie()}">           
    
    <h:link ... outcome="#{bean.gotoMySearches()}">
    

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

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

    <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.
        }
    
        // ...
    }
    

    另见:

    【讨论】:

    • 感谢@BalusC,使用 commandLinks 确实可以防止页面加载调用。从我的角度来看,我不明白为什么 POST 会伤害我。有什么特定于 JSF 的吗? (在这种情况下,我不想使用 PostConstract 注释,并且不想使用 preRenderView 调用。在这种特殊情况下,它会使代码变得复杂。)
    • 点击“好东西”链接。导航链接是幂等的。强迫他们 POST 是完全错误的。
    猜你喜欢
    • 2011-07-08
    • 2014-05-15
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多