JSF: вызов метода компонента с параметром

Я не могу заставить вызовы методов с параметрами работать в 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)}!


person geeehhdaa    schedule 14.04.2011    source источник


Ответы (2)


Я не могу определить метод таким образом, верно?

getSomeList(int a)

No.

А почему бы и нет?

Потому что вы используете старый 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, или заменить реализацию EL 2.1 по умолчанию в Tomcat 6 на ту, которая поддерживает вызовы параметризованных методов. Подробности см. в этом ответе. После этого вы можете использовать

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

Альтернативой является замена List на Map, что может быть пользовательской реализацией, выполняющей (ленивую) загрузку по методу get().

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

с участием

<f:selectItems value="#{bla.someMap.keyName}" ... />
person BalusC    schedule 14.04.2011
comment
Спасибо! Но это работало с #{bla.getSomeList(0)} вместо #{bla.someList(0)} - person geeehhdaa; 15.04.2011

Попробуйте использовать

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

Это работает для некоторых реализаций JSF.

person aseychell    schedule 14.04.2011
comment
Это не специфично для JSF. Это специфика EL. - person BalusC; 14.04.2011
comment
Да ты прав. Но я знал, что в некоторых случаях это возможно :) - person aseychell; 14.04.2011