【问题标题】:JSF: Bean method call with parameterJSF:带参数的 Bean 方法调用
【发布时间】:2011-04-14 16:33:59
【问题描述】:

我无法在 JSF 2.0 (MyFaces) 和 Tomcat 6 中使用带参数的方法调用。

我就是这样尝试的:

<f:selectItems var="item" value="#{bla.someList} itemValue="#{item.value1}" itemLabel="#{item.value2}"> <f:param name="param1" value="0" /> </f:selectItems>

我不能这样定义方法,对吧?为什么不呢?

getSomeList(int a)

这就是我尝试过的:

getSomeList() {
Integer a = Integer.parseInt(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("param1")); 
return doSomething(a);
}

这就是我得到的:

java.lang.NumberFormatException: null
java.lang.Integer.parseInt(Integer.java:417)

如果有人帮助我,我将不胜感激。谢谢!

更新:啊,它与 #{bla.getSomeList(0)} 一起使用!

【问题讨论】:

    标签: jsf parameters el javabeans


    【解决方案1】:

    我不能这样定义方法,对吧?

    getSomeList(int a)
    

    没有。

    为什么不呢?

    因为您使用的是旧的 Tomcat 6,它不支持引入此功能的 EL 2.2。

    这就是我得到的:

    java.lang.NumberFormatException: null
    java.lang.Integer.parseInt(Integer.java:417)
    

    因为那里是null&lt;f:param&gt; 仅适用于链接/按钮,不适用于普通组件。

    为了让 EL 中的方法调用正常工作,您需要升级到支持 Servlet 3.0 / EL 2.2 的容器,例如 Tomcat 7,或者将 Tomcat 6 的默认 EL 2.1 实现替换为支持参数化方法调用的容器。详情请参阅this answer。完成后,您可以使用

    <f:selectItems value="#{bla.getSomeList(0)}" ... />
    

    另一种方法是将List 替换为Map,它可以是在get() 方法上(延迟)加载的自定义实现。

    public Map<String, List<Something>> getSomeMap() {
        return someCustomLazyLoadingMap;
    }
    

    <f:selectItems value="#{bla.someMap.keyName}" ... />
    

    【讨论】:

    • 谢谢!但它适用于 #{bla.getSomeList(0)} 而不是 #{bla.someList(0)}
    【解决方案2】:

    尝试使用

    &lt;f:selectItems var="item" value="#{bla.someList(0)} itemValue="#{item.value1}" itemLabel="#{item.value2}"/&gt;

    这适用于 JSF 的某些实现。

    【讨论】:

    • 这不是 JSF 特定的。这是 EL 特有的。
    • 是的,你是对的。但我知道在某些情况下这是可能的:)
    猜你喜欢
    • 2012-01-27
    • 2011-12-16
    • 1970-01-01
    • 2011-11-06
    • 2013-03-18
    • 2023-03-27
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    相关资源
    最近更新 更多