commandLink不会调用动作侦听器,但commandButton可以正常工作

时间:2013-03-14 10:01:32

标签: jsf-2 commandlink

我想通过Facelets的链接调用一个方法:

My Facelets代码如下:

<h:commandButton value="A" actionListener="#{customerData.searchedCustomerListA}" />

<h:commandLink value="A" actionListener="#{customerData.searchedCustomerListA}"/>

支持bean代码如下:

public void searchedCustomerListA(ActionEvent ae){
    customerName = "A";
    leftCustomerListAvailable.clear();
    if(customerDataBean.getSearchedCustomerList(customerName)!= null)
        leftCustomerListAvailable =customerDataBean.getSearchedCustomerList("A");
}

相同的代码适用于<h:commandButton>但不适用于<h:commandLink>。这是怎么造成的,我该如何解决?

4 个答案:

答案 0 :(得分:3)

<h:commandLink><h:commandButton>之间的技术差异在于该链接使用JavaScript来提交父表单。因此,如果它在语法上等效的按钮工作正常时不起作用,那么这只能意味着在浏览器中禁用了JavaScript,或者包含强制帮助函数的jsf.js文件未包含在页面中(通过在浏览器的内置开发人员工具集的JS控制台中看到JS错误,您应该很容易注意到这一点。

因此,要解决此问题,您需要验证浏览器中是否启用了JS,并且模板中是否有<h:head>组件而不是纯HTML <head>,因此JSF将是能够自动包含jsf.js文件。

或者,如果您的应用程序的业务需求要求应用程序按照JS设计的功能禁用,那么您应该坚持使用<h:commandButton>并引入一些CSS使其看起来像一个链接(例如删除背景,填充,边界,插图等)。

答案 1 :(得分:0)

试试这个,这样可行。

    <html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

<h:form>

    <h:commandLink type="button" action="#{testBean.tsetLink}"> 
          <h:outputText value="A" />
    </h:commandLink>

</h:form>
</html>

ManagedBean

@ManagedBean
@RequestScoped
public class TestBean {

    public void tsetLink(){
    System.out.println("Link clicked!!!!!!!!!!!!");
    }
} 

答案 2 :(得分:0)

我也遇到了同样的问题。我发现当commandButton在同一个表单中时,commandLink将无法工作。当我将commandLink移动到另一个表单时,它可以像往常一样调用action。另一种方法是将command =“true”属性添加到commandLink。

<h:form>
……
<div class="control-group">
    <div class="controls">
        <h:commandButton value="Login" action="#{usrCtrl.login}" class="btn btn-primary"/>
        <h:commandLink action="#{usrCtrl.register}" value="test" immediate="true"/>
   </div>
</div>
</h:form>

阅读JSF and the “immediate” Attribute – Command Components,了解其工作原理。

答案 3 :(得分:0)

我的情况是这个问题的原因是配置不当的网址重写过滤器。其中一个过滤器模式无意中匹配http://localhost:8080/mysite/javax.faces.resource/jsf.js.xhtml?ln=javax.faces,阻止了jsf.js的加载。请检查此答案:Clicking h:commandLink causes Uncaught ReferenceError: mojarra is not defined