Как атрибут 'binding' работает в JSF? Когда и как его следует использовать?



есть много материалов там дифференцируя value атрибут и binding атрибут в JSF.



меня интересует, как оба подхода отличаются друг от друга. Дано:



public class User {
private String name;
private UICommand link;

// Getters and setters omitted.
}


<h:form>
<h:commandLink binding="#{user.link}" value="#{user.name}" />
</h:form>


это довольно прямо вперед, что происходит, когда value атрибут указан. Геттер работает, чтобы вернуть name значение свойства User бобовые. Значение выводится на HTML-вывод.



но я не мог понять, как binding завод. Как сгенерированный HTML поддерживает привязку с link свойства User бин?



Ниже приведена соответствующая часть сгенерированного вывода после ручного благоустройства и комментирования (обратите внимание, что идентификатор j_id_jsp_1847466274_1 был автоматически сгенерирован и что есть два скрытых виджета ввода).
Я использую Sun's JSF RI, версия 1.2.



<form action="/TestJSF/main.jsf" enctype="application/x-www-form-urlencoded"
id="j_id_jsp_1847466274_1" method="post" name="j_id_jsp_1847466274_1">
<input name="j_id_jsp_1847466274_1" type="hidden" value="j_id_jsp_1847466274_1">
<a href="#" onclick="...">Name</a>
<input autocomplete="off" id="javax.faces.ViewState" name="javax.faces.ViewState"
type="hidden" value="-908991273579182886:-7278326187282654551">
</form>


где binding хранится здесь?

602   2  

2 ответов:

как это работает?

когда представление JSF (файл Facelets/JSP) будет построено/восстановлено, будет создано дерево компонентов JSF. В этот момент посмотреть время сборки, все binding атрибуты оцениваются (вместе с id атрибуты и taghandlers, такие как JSTL). Когда компонент для JSF должен быть создан, прежде чем будет добавлен в дерево компонентов JSF, которая будет проверять, если binding атрибут возвращает предварительно созданный компонент (т. е. не -null) и если Итак, тогда используйте его. Если он не создан заранее, то JSF автоматически создаст компонент "обычным способом" и вызовет сеттер за binding атрибут с автоматически созданным экземпляром компонента в качестве аргумента.

в эффектах он связывает ссылку экземпляра компонента в дереве компонентов с переменной области действия. Эта информация никоим образом не отображается в сгенерированном HTML-представлении самого компонента. Эта информация никоим образом не относится к сгенерированному HTML-выходу. Когда форма отправлена и представление восстановлено, дерево компонентов JSF просто перестраивается с нуля и все binding атрибуты будут просто повторно оценены, как описано в предыдущем абзаце. После повторного создания дерева компонентов JSF восстановит состояние представления JSF в дереве компонентов.

экземпляры компонентов имеют область запроса!

важно знать и понимать, что конкретные экземпляры компонентов эффективно запросу области. Они вновь созданные по каждому запросу и их свойства заполняются значениями из состояния представления JSF на этапе восстановления представления. Итак, если вы привязываете компонент к свойству бэк-Боба, то бэк-Боб должен абсолютно не быть в более широкой области, чем область запроса. Смотрите также specitication в JSF 2.0 глава 3.1.5:

3.1.5 Составных Переплетах

...

привязки компонентов часто используются в соединение с JavaBeans, которые динамически создаются через управляемый Средство создания бобов (см. раздел 5.8.1 "VariableResolver и переменная по умолчанию VariableResolver"). это сильно рекомендуется, чтобы разработчики приложений размещали управляемые компоненты, на которые указывают выражения привязки компонентов область" запрос". это потому, что размещение его в области сеанса или приложения потребует потокобезопасности, так как Экземпляры UIComponent зависят от выполнения внутри одного нитка. Существуют также потенциально негативные последствия для управление памятью при размещении привязки компонента в области "сеанс".

в противном случае экземпляры компонентов совместно используются несколькими запросами, что может привести к "дубликат идентификатора компонента" ошибки и" странное " поведение, поскольку валидаторы, преобразователи и прослушиватели, объявленные в представлении, повторно присоединяются к существующему экземпляру компонента из предыдущих запросов. Симптомы ясны: они есть выполняется несколько раз, один раз больше с каждым запросом в той же области, к которой привязан компонент.

и, при большой нагрузке (т. е. когда несколько разных HTTP-запросов (потоков) обращаются и управляют одним и тем же экземпляром компонента одновременно), вы можете рано или поздно столкнуться с сбоем приложения, например застрял поток на UIComponent.popComponentFromEL или потоки Java при 100% загрузке ЦП с использованием richfaces UIDataAdaptorBase и его внутренний HashMap, или даже какой-то" странный"IndexOutOfBoundsException или ConcurrentModificationException исходящий прямо из исходного кода реализации JSF, в то время как JSF занят сохранением или восстановлением состояния представления (т. е. трассировка стека указывает saveState() или restoreState() методы и тому подобное).

используя binding свойства фасоль является плохой практикой

независимо от того, с помощью binding таким образом, привязка всего экземпляра компонента к свойству bean, даже для компонента с областью запроса, находится в JSF 2.x довольно редкое использование бывает и вообще не самая лучшая практика. Это указывает на дизайнерский запах. Обычно вы объявляете компоненты на стороне представления и связываете их атрибуты времени выполнения, такие как value, и, возможно, другие, как styleClass,disabled,rendered, etc, к нормальным свойствам фасоли. Затем вы просто манипулируете именно тем свойством bean, которое вы хотите, вместо того, чтобы захватывать весь компонент и вызывать метод setter, связанный с атрибутом.

в случаях, когда компонент должен быть "динамически причине" на основе статической модели, лучше использовать просмотр тегов времени сборки, таких как JSTL, при необходимости в tag file, вместо createComponent(),new SomeComponent(),getChildren().add(), а что нет. Смотрите также как рефакторинг фрагмента старого JSP к некоторому эквиваленту JSF?

или, если компонент должен быть "динамически визуализирован" на основе динамической модели, то просто используйте итератор компонент (<ui:repeat>,<h:dataTable>, etc). Смотрите также как динамически добавлять компоненты JSF.

композитные компоненты-это совершенно другая история. Это полностью законно связывать компоненты внутри <cc:implementation> к компоненту поддержки (т. е. компоненту, идентифицированному <cc:interface componentType>. См. также.о'. разделить java.утиль.Дата более двух H: inputText поля, представляющие час и минуту с f: convertDateTime и как реализовать динамический список с составным компонентом JSF 2.0?

использовать только binding в локальной области

однако иногда вы хотели бы знать о состоянии другого компонента изнутри определенного компонента, чаще, чем в случаях использования, связанных с проверкой, зависящей от действия/значения. За то, что binding атрибут может быть использован, но не в сочетании со свойством bean. Вы можете просто указать в локальной области EL уникальное имя переменной в binding атрибут как так binding="#{foo}" и компонент во время рендера ответ в другом месте в том же представлении, что и UIComponent ссылка доступна на #{foo}. Вот несколько вопросов, где такое решение было использовано в ответ:

Читайте также:

каждый компонент JSF отображает себя в HTML и имеет полный контроль над тем, что HTML он производит. Есть много трюков, которые могут быть использованы JSF, и именно какой из этих трюков будет использоваться, зависит от реализации JSF, которую вы используете.

  • убедитесь, что каждый из входных данных имеет общее уникальное имя, так что когда форма возвращается в дерево компонентов, которое ее визуализирует, легко определить, где каждый компонент может прочитать его значение форма.
  • компонент JSF может генерировать javascript, который отправляет обратно в serer, сгенерированный javascript также знает, где привязан каждый компонент, потому что он был сгенерирован компонентом.
  • для таких вещей, как hlink, вы можете включить информацию о привязке в url-адрес как параметры запроса или как часть самого url-адреса или как параметры matrx. за примерами.

    http:..../somelink?componentId=123 позволит jsf посмотреть в дереве компонентов, чтобы увидеть, что ссылка 123 была нажата. или это может е htp:..../jsf;LinkId=123

Comments

    Ничего не найдено.