Создание подкласса UISelectMany для создания пользовательского компонента JSF - PullRequest
0 голосов
/ 06 января 2012

Мне нужно создать пользовательский Компонент с JSF 2.0 (не составной компонент), который похож на SelectManyCheckbox, но имеет другой интерфейс. Я пытаюсь сделать это, создав подкласс UISelectMany и создав новый пользовательский рендерер.

Что я не понимаю, так это как входные данные клиента передаются через Компонент в Бин. Должен быть способ собрать параметры http из POST, поместить их в список и установить список в компоненте.

изм

То, что я уже пробовал, похоже на это:

public void decode(FacesContext context, UIComponent component) {
    if ((context == null) || (component == null)) {
        throw new NullPointerException();
   }
   MapComponent map = (MapComponent) component;
   String key = getName(context, map);
   String value = (String)context.getExternalContext().
       getRequestParameterMap().get(key);
   if (value != null)
      map.setCurrent(value);
   }
}

Я вижу в отладчике, что мои http-параметры выбраны правильно. Я также вижу, что мой конвертер будет вызываться после этого. Но ценности не достигают Боба. Но я вижу неспецифическую ошибку проверки в журнале. Прочитав некоторые учебники в сети, я все еще не понимаю, как это работает. Должен быть некоторый клейкий код, который принимает преобразованное значение и передает его установщику в Бине. Кто-нибудь знает, как это работает?

Спасибо Jan

Ответы [ 2 ]

1 голос
/ 06 января 2012

Должен быть способ собрать параметры http из POST, поместить их в список и установить список в компоненте.

Этообычно выполняется в методе decode() класса Renderer.В случае Мохарра это класс com.sun.faces.renderkit.html_basic.MenuRenderer.Просто загрузите исходный код и посмотрите, как это сделать.

В основном , вы просто захватываете значения параметров запроса, связанные с идентификатором клиента компонента, в качестве имени параметра, а затем устанавливаете его как переданное значение с помощью UIInput#setSubmittedValue().

public void decode(FacesContext context, UIComponent component) {
    ((UIInput) component).setSubmittedValue(context.getExternalContext().getRequestParameterValuesMap().get(component.getClientId(context)));
}

(конечно, вам необходимо выполнить некоторую проверку заранее; снова проверьте исходный код)

0 голосов
/ 06 января 2012

Создайте свой собственный класс, который расширяет javax.faces.component.UISelectMany

class MySelectMany extends javax.faces.component.UISelectMany
{

//over-ride methods of javax.faces.component.UISelectMany


// this method is inherited from javax.faces.component.UIComponentBase. You can use this method to set the rendererType

public void setRendererType(java.lang.String rendererType)
{

// custom rendering
}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...