繁体   English   中英

如何在JSF中使用参数调用方法

[英]How to call a method with a parameter in JSF

我有一个JSF页面,它显示文件夹的内容(实际上是一个保管箱的帐户内容)。

我正在使用dataTable呈现ListArray对象的内容:

<h:dataTable style="text-align: left" width="600" var="dContent" value="#{backedBean.contents}">
  <h:column>
    <f:facet name="header">
      <f:verbatim>NAME</f:verbatim>
    </f:facet>
    <h:commandButton value="#{dContent.fileName}" action="#{backedBean.updateContents(dContent)}"/>
  </h:column>
  <h:column>
    <f:facet name="header">
      <f:verbatim>SIZE</f:verbatim>
    </f:facet>
    <h:outputText value="#{dContent.size}"/>
  </h:column>
</h:dataTable>

但是,当我运行此页面时,出现以下错误:

/browse.xhtml @ 34,110 action =“#{backedBean.updateContents(dContent)}”错误分析:#{backedBean.updateContents(dContent)}
...
...
原因:org.apache.el.parser.ParseException:在第1行第28列遇到““(”“(”“”。期望以下之一:
“}” ...
“。” ...
“ [” ...
“>” ...
“ gt” ...
“ <” ...
“ lt” ...
“> =” ...
“ ge” ...
...
...

有趣的是,Netbeans能够自动完成方法名称,因此我想像我的后端bean可以。 仅当我使用参数调用方法时,才会出现问题。

有任何想法吗?

非常感谢

传递方法参数是在EL 2.2中引入的。 因此,只有在运行Servlet 3.0 / EL 2.2的容器(例如Tomcat 7,Glassfish 3,JBoss AS 6等)上运行并且已根据Servlet 3.0规范声明了web.xml ,才有可能这样做。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
>
    <!-- Config here -->
</web-app>

如果不是,请检查此答案以获取有关在数据表中获取当前行的替代方法,或有关使用支持传递方法参数的EL替代方法来替代EL实施方法的答复 ,以便可以在Servlet 2.5 / EL 2.1上使用它容器。

Jboss Seam也可以帮助获得该功能。

Seam使用JBoss EL,它提供了对标准统一表达语言(EL)的扩展。 JBoss EL提供了许多增强功能,可以增强EL表达式的表达性和功能。

例:

使用单引号传递文字字符串: <h:commandLink action="#{printer.println('Hello world!')}" value="Hello"/>

或动态值<h:commandButton action="#{hotelBooking.bookHotel(hotel)}" value="Book Hotel"/>

局限性:

JBoss EL当前无法与JSP 2.1一起使用,因为编译器会拒绝带有in参数的表达式。因此,如果要将此扩展与JSF 1.2一起使用,则需要使用Facelets。 该扩展程序可与JSP 2.0一起正常使用。

自JSF 1.0以来,实际上已经有一种“破解”方式。 您只需在支持bean上创建一个返回Map的方法,就可以使用JSF EL将想要的任何对象传递给该方法,因为JSF认为您正在将密钥传递给map。

同时,在您的支持bean方法中,您实际上返回了一个“冒名顶替”的地图实例,该实例根本不是一个真正的地图,其get()方法委托给您要调用的方法。 在.xhtml或.jsp文件中,您可以使用方括号符号来传递变量。

扩展HashMap是使冒名顶替者地图易于定义的一种方法-简洁到足以以这种方式使用匿名内部类。

这是一个hack,但过去对我来说效果很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM