Как атрибут '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
хранится здесь?
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 2 dataTable индекс строки без dataModel
- Primefaces зависимый selectOneMenu и required= "true"
- Проверьте группу полей по мере необходимости, когда хотя бы одно из них заполнено
- как изменить класс css для поля ввода и метки при сбое проверки?
- получение JSF-определенного компонента с Javascript
используйте выражение EL для передачи идентификатор компонента для составного компонента в JSF
(и это только с прошлого месяца...)
Читайте также:
- как использовать привязку компонентов в JSF правильно ? (компонент с областью запроса в компоненте с областью сеанса)
- область просмотра: java.io.NotSerializableException: javax.сталкиваться.деталь.формат html.HtmlInputText
- атрибут обязательный вызывает дублирование идентификатора компонента, найденного в представлении
каждый компонент JSF отображает себя в HTML и имеет полный контроль над тем, что HTML он производит. Есть много трюков, которые могут быть использованы JSF, и именно какой из этих трюков будет использоваться, зависит от реализации JSF, которую вы используете.
- убедитесь, что каждый из входных данных имеет общее уникальное имя, так что когда форма возвращается в дерево компонентов, которое ее визуализирует, легко определить, где каждый компонент может прочитать его значение форма.
- компонент JSF может генерировать javascript, который отправляет обратно в serer, сгенерированный javascript также знает, где привязан каждый компонент, потому что он был сгенерирован компонентом.
для таких вещей, как hlink, вы можете включить информацию о привязке в url-адрес как параметры запроса или как часть самого url-адреса или как параметры matrx. за примерами.
http:..../somelink?componentId=123
позволит jsf посмотреть в дереве компонентов, чтобы увидеть, что ссылка 123 была нажата. или это может еhtp:..../jsf;LinkId=123
Comments