【问题标题】:jsf Invoking Arbitrary Methods via ELjsf 通过 EL 调用任意方法
【发布时间】:2011-05-31 22:56:06
【问题描述】:

我是 JSF 的初学者,但在通过 EL 调用任意方法时遇到问题。
根据我阅读的内容,Java EE 6 中包含的统一表达式语言 2.1 版支持调用任意方法并将参数传递给它们。
我正在使用 MyFaces2.0.3、JRE6Up21、Tomcat 6.0.29 和 Eclipse。
我在 facelet 中有以下 sn-p:

<h:form>
<p>
<h:link outcome="NextPage" value="Link for Next Page">
<f:param name="word1" value="hello" />
<f:param name="word2" value="world" />
</h:link>
</p>
</h:form>

在facelet NextPage.xhtml

<h:form>
<p>
This is the method invocation #{model.printArgs(param.word1,param.word2)}
</p>
</h:form>  

Model 是一个托管 bean(请求范围),它具有此方法 printArgs,它返回 word1 和 word2 的字符串连接。

@ManagedBean
@SessionScoped
public class Model {

public String printArgs(String word1, String word2) {
        String result = "No arguments??????";

        if (null != word1 && !word1.isEmpty() && null != word2 && !word2.isEmpty()) {
            result = word1+" "+word2;
        }
        return result;

    }

}

当我点击链接时,网址是http://localhost:8080/RegJSF/faces/NextPage.xhtml?word1=hello&word2=world
但我得到了错误

org.apache.el.parser.ParseException: 在第1行遇到“”(“”(“”, 第 25 列。期待以下之一:“}” ……“。” ... "[" ... >" ... "gt" ... "=" ... "ge" ... "

如果我删除 #{model.printArgs(param.word1,param.word2)},则加载 NextPage,所以问题出在方法调用上。
这里有什么问题?是配置问题吗?
注意如果我使用 Mojarra2.0.3 也会出现同样的问题
有人可以帮忙吗?

谢谢!

【问题讨论】:

  • 我不确定您要做什么,您是不是要在页面加载时调用方法,是吗?
  • @org.life.java:我点击链接,url正如我提到的,我通过URL传递参数,在NextPage.xhtml中,应该调用传递参数的方法页面将呈现:"This is the method invocation hello world!"

标签: java jsf jsf-2 el


【解决方案1】:

This is the method invocation <h:outputText value="#{model.printArgs(param.word1,param.word2)}"/>

这里需要双引号。另外,请尝试使用 outputText。

【讨论】:

  • @Vladimir Ivanov:双引号也有同样的问题。哑题:EL2.1是默认开启的吗?
  • 更新了答案。试试这个 h:outputText 标签。您使用什么 JSF 版本?
  • @Vladimir:我复制粘贴了它。Eclipse 在 EL 中警告语法错误,橙色为 (param.word1,param.word2),我仍然运行该应用程序,但仍然出现相同的错误 javax.faces.view.facelets.TagAttributeException: /NextPage.xhtml at line 12 and column 153 value="#model.printArgs(param.word1,param.word2)}" Error Parsing: #{model.printArgs(param.word1,param.word2)}。我正在使用 MyFaces2.0.3
  • 我问的不是 MyFaces 版本,而是 JSF 版本。是2.0吗?
  • @Vladimir:我如何检查那个版本?
【解决方案2】:

根据我阅读的内容,Java EE 6 中包含的统一表达式语言 2.1 版支持调用任意方法并将参数传递给它们。

我认为你错了。这种支持是在 JSP 2.2 中引入的(这是满足 JEE6 规范所必需的)。

来自JSP 2.2 spec

维护 1 和维护版本 2 之间的变化

此版本的主要变化是 添加方法调用 EL中的参数,例如 #{trader.buy(“JAVA”)}.

由于 Tomcat 6 是 JSP 2.1 容器,您可以考虑升级到 Tomcat 7。

【讨论】:

  • 用 Tomcat 7 测试过,它可以工作。看来你是对的。所以对于参数调用,我应该使用 Tomcat 7,尽管它处于测试阶段?
  • @user384706 - 最新的 Servlet 和 JSP 规范的实现仍然有点薄弱。除了 Glassfish 3 和 JBoss 6(完整的 JEE 服务器)之外,我不知道有任何 GA。我相信您可以使用 JBoss EL/Seam 2.2 获得等效的功能,但我不确定这个堆栈的兼容性故事。
猜你喜欢
  • 2012-01-09
  • 2014-07-18
  • 2013-07-03
  • 2012-01-06
  • 2016-11-28
  • 2014-03-30
  • 2013-05-04
  • 1970-01-01
相关资源
最近更新 更多