我想通过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>
。这是怎么造成的,我该如何解决?
答案 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
@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。