未指定默认命名空间时,函数[functionName]必须与前缀一起使用

时间:2012-11-12 12:32:44

标签: jsf el crud jsf-1.2

我正在使用JSF 1.2而我正在尝试删除和/或更新<h:dataTable>中的行,其中当前行作为action方法的参数传递。

查看:

<h:dataTable value="#{myBean.list}" var="categoria">
  ...
  <h:column>
    <h:commandButton value="Update" action="#{myBean.updateCat(categoria)}" />
    <h:commandLink value="Delete" action="#{myBean.deleteCat(categoria.cod)}" />
  </h:column>
</h:dataTable>

控制器:

public void deleteCat(int cod) {
  this.controller.deleteCat(cod);
}

public void updateCat(Categoria cat) {
  this.controller.updateCat(cat);
}

但我收到以下错误:

  

当a时,函数deleteCat必须与前缀一起使用   未指定默认命名空间

这是如何引起的?如何解决?

2 个答案:

答案 0 :(得分:3)

  

当未指定默认命名空间时,函数deleteCat必须与前缀一起使用

当在当前EL环境中不支持使用参数调用bean方法的新EL 2.2功能时,此错误消息是典型的。当当前的EL环境实际上不符合EL版本2.2时,就会发生这种情况。 EL 2.2是Servlet 3.0的一部分,因此需要与Servlet 3.0兼容的容器(Tomcat 7,Glassfish 3,JBoss 6等)与Servlet 3.0兼容web.xml才能工作。

在EL 2.2之前,EL表达式中的括号()默认被解释为EL函数参数。然而,期望EL函数被taglib命名空间上的冒号前缀引用,如#{fn:length(bean.list)}而不是句点。这至少解释了乍一看相当奇怪的错误信息。

鉴于您使用的是旧版JSF 1.2,您最有可能使用Servlet 2.5(Tomcat 6,Glassfish 2,JBoss 4等),因此也隐含了EL 2.1。为了模拟使用参数调用bean方法的新EL 2.2特性,最好的办法是下载并安装JBoss EL,如本答案中所述:Invoking methods with parameters by EL in JSF 1.2

答案 1 :(得分:0)

我设法通过将数据表与HtmlDataTable绑定来解决问题。

在这里找到解决方案: http://www.coderanch.com/t/497447/JSF/java/delete-row-datatable

<h:dataTable id="table" value="#{myBean.list}"
binding="#{myBean.dataTable}"
var="categoria" border="1" styleClass="tabelaFormulario"
headerClass="tabelaTituloFormulario"
rowClasses="tabelaLinhaPar, tabelaLinhaImpar">

之后在bean中:

private HtmlDataTable dataTable; // + getter & setter   

最后我可以使用

从所选行中获取数据
dataTable.getRowData();   

现在的功能如下:

public void deleteCat() {
    this.controller.deleteCat(this.list.get(this.dataTable.getRowIndex()).getCod());
}

非常感谢,希望它可以帮助别人...