我正在使用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必须与前缀一起使用 未指定默认命名空间
这是如何引起的?如何解决?
答案 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());
}
非常感谢,希望它可以帮助别人...