Отображение динамических видов с использованием Facelets / JSF - PullRequest
2 голосов
/ 30 октября 2011

Я собираюсь начать работу над проектом с использованием JSF / Facelets, который должен интегрироваться со сторонней библиотекой.

Эта сторонняя библиотека содержит определение экрана и имеет следующий API:

/** This method gets the screen information**/
public Screen getScreen(int screenId);

/** This method gets the first screen id **/
public int getFirstScreenId();

/** This method submits the screen with the user supplied 
    values and gets the next   screen id **/
public int submitScreen(int screenId, Map<String,Sring> keyValuePair) 
  throws ScreenValidationException;

Объект «Экран» содержит список элементов управления. «Элемент управления» - это интерфейс, имеющий около 25 реализаций. - а именно LabelControl, TextBoxControl, TextAreaControl, DropDownListControl и т. д ....

Вот пример того, как API будет использоваться для сбора данных от пользователя:

Шаг 1: вызовите getFirstScreenId () ==> Это вернет идентификатор первого экрана для отображения пользователю.

Шаг 2: вызовите getScreen (), используя идентификатор экрана

Шаг 3: Объект Screen, возвращаемый на шаге 2, имеет список элементов управления. Отображение HTML-представления экрана со всеми элементами управления (в виде HTML-формы) для пользователя.

Шаг 4: пользователь отправил HTML-форму. Используйте submitScreen () для отправки значений. Сторонняя библиотека вернет следующий идентификатор экрана или -1, если больше нет экранов для показа.

Шаг 5: Повторяйте шаги 2-4, пока submitScreen () не вернет -1. Если -1 возвращается, это означает, что шаг сбора данных завершен, откройте страницу с благодарностью для пользователя.

submitScreen () может вызвать исключение ScreenValidationException - в этом случае повторно отобразить текущий экран с помощью сообщения проверки, присутствующие в объекте ScreenValidationException.


Итак, мой вопрос: как я могу использовать JSF / Facelets для отображения интерфейса пользователя в этом сценарии?

Я могу представить, что мне нужно следующее

  1. управляемый компонент, у которого есть метод действия, который выполняет взаимодействие со сторонней библиотекой. Хотя я думаю, что сервлет лучше всего подходит для этого?

  2. Шаблоны интерфейса Facelets для 25 нечетных элементов управления (textboxControl, dropdownlistControl и т.д ....)

  3. Код, который проходит по элементам управления в объекте «Экран» и выполняет что-то вроде

    // render the "html form start tag" , i.e, 

    for (Control control : screen.getControls()) {
        if (control instanceof LabelControl)
        {
           // render the LabelControl using the "label template"
        }
        else if (control instanceof DropDownListControl)
        {
           // render the DropDownListControl using the "dropdownlist template"
        }
        ....... }

    // render the "html form end template" , i.e, 

Я не могу представить, как я могу сложить эти три. Кто-нибудь может мне помочь?

...