1

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

看法:

<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);
}

但我收到以下错误:

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

这是如何引起的,我该如何解决?

4

2 回答 2

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

于 2012-11-12T13:37:40.880 回答
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());
}

无论如何,谢谢,希望它可以帮助别人......

于 2012-11-12T13:25:14.570 回答