Применить этап запроса и параметры запроса

Рассмотрим следующий фрагмент класса HtmlBasicRenderer:

 Map<String, String> requestMap =
              context.getExternalContext().getRequestParameterMap();
        // Don't overwrite the value unless you have to!
 String newValue = requestMap.get(clientId);
 if (newValue != null) {
      setSubmittedValue(component, newValue);
      if (logger.isLoggable(Level.FINE)) {
            logger.log(Level.FINE,
                   "new value after decoding {0}",
                   newValue);
      }
 }

Фрагмент отображается в методе decode(FacesContext context, UIComponent component), который отвечает за извлечение параметров запроса и их назначение компонентам на этапе запроса запроса.

Мой вопрос о том, как генерируется этот параметр запроса? Если у нас есть простая html-форма и стандартные html input внутри нее, вот так:

<form method="POST">
    <input name="name" value="value" />
</form>

мы получим пару параметров name=value.

Таким образом, единственный способ указать параметр запроса key для компонента, который мы пишем, — указать атрибут name элемента в методе encode его средства визуализации. . Как только мы это сделали, мы можем получить доступ к соответствующему параметру из метода декодирования.

Обновление: Я пишу компонент, унаследованный от UISelectOne, но выбранный элемент может содержать больше одного поля ввода (два в конкретном случае). Его объявление будет выглядеть примерно так (детали показались неважными и были опущены):

<stcomutil:selectOne key="#{myBean.key}" value="#{myBean.value}">
    <stcomutil:selectOneItem />
    <stcomutil:selectOneItem />
    <stcomutil:selectOneItem />
</stcomutil:selectOne>

Где <stcomutil:selectOneItem /> отображается как два input type="text":

введите здесь описание изображения.

        ^                       ^
        |                       |
        |                       |
   the key field          the value field

Итак, на самом деле у меня будет 3 строки таких входов, и мне нужно обработать единственную строку, введенную пользователем. Опять же, я опускаю детали с отключением входов и так далее.

Что я хочу узнать: чтобы обработать ввод дополнительных значений (преобразование, проверка, обновление и т. д.), мне просто нужно указать атрибут имени для этого дополнительного ввода, а затем извлечь его на этапе запроса Apply, верно? Кроме того, на этапе обновления модели я должен явно извлечь объект ValueExpression для этой привязки с помощью getValueExpression и присвоить ему значение с помощью метода setValue.


person user3663882    schedule 09.08.2015    source источник
comment
Вы очень глубоко погрузились в материал рендерера, но ваш html не совместим с jsf. Я подозреваю, что вы пришли, например, из фон php и хотите обрабатывать вещи так же, как это делается там. Это не, ну, не нужно, но ваш файл xhtml должен быть в стиле jsf. Так что используйте h:form и h:input или «совместимый» с html5 способ, если хотите. Подробнее об обоих можно легко найти с помощью Google. Но вам лучше начать с базового руководства по jsf. Или я совсем не понимаю вашего вопроса?   -  person Kukeltje    schedule 09.08.2015
comment
Я не понимаю/не вижу конкретного вопроса. Вы, кажется, уже сами ответили на вопрос в последнем абзаце. Просьба уточнить.   -  person BalusC    schedule 09.08.2015
comment
@BalusC Добавлены некоторые подробности о том, чего я на самом деле пытаюсь достичь. Может быть, я на неправильном пути когда-либо ...   -  person user3663882    schedule 09.08.2015
comment
@Kukeltje На самом деле не execatly ... но я новичок в JSF, и в моем конкретном случае я решил, что мне действительно нужно написать собственный (унаследованный от UISelectOne) класс компонентов. Пользовательский рендерер или составной компонент не могут дать мне нужное поведение (с моей точки зрения)...   -  person user3663882    schedule 09.08.2015
comment
Ах... Вы, скорее всего, ищете композитный компонент. Это приемлемо как обман? stackoverflow.com/q/17235721   -  person BalusC    schedule 09.08.2015
comment
@BalusC Таким образом, нет необходимости писать собственный рендерер с нуля. Вместо этого мы можем прикрепить реализацию составного компонента к нашему классу компонентов (с атрибутом componentType). Это то, что вы имели в виду?   -  person user3663882    schedule 09.08.2015
comment
Пользовательский компонент и рендерер также могут, это лишь немного больше работы, когда функциональность уже может быть достигнута с помощью композита. См. также stackoverflow.com/q/6822000   -  person BalusC    schedule 09.08.2015