我无法让带有参数的方法调用在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)}!
号我不能这样定义方法,对吧?
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实现替换为支持参数化方法调用的容器。有关详细信息,请参阅此回答。完成后,可以使用
<f:selectItems value="#{bla.getSomeList(0)}" ... />
另一种选择是用Map
代替List
,这可以是一个自定义实现,在get()
方法上(惰性)加载。
public Map<String, List<Something>> getSomeMap() {
return someCustomLazyLoadingMap;
}
<f:selectItems value="#{bla.someMap.keyName}" ... />
尝试使用
<f:selectItems var="item" value="#{bla.someList(0)} itemValue="#{item.value1}" itemLabel="#{item.value2}"/>
这适用于JSF的某些实现。