我无法使用参数进行方法调用以在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)}!
答案 0 :(得分:5)
我无法定义这样的方法,对吗?
getSomeList(int a)
没有
为什么不呢?
因为您使用的旧Tomcat 6不支持引入此功能的EL 2.2。
这就是我得到的:
java.lang.NumberFormatException: null java.lang.Integer.parseInt(Integer.java:417)
因为它是null
。 <f:param>
仅适用于链接/按钮,而不适用于普通组件。
为了使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}" ... />
带
{{1}}
答案 1 :(得分:0)
尝试使用
<f:selectItems var="item" value="#{bla.someList(0)} itemValue="#{item.value1}" itemLabel="#{item.value2}"/>
这适用于JSF的一些实现。