Вы когда-нибудь видели повторяющиеся выражения EL в JSF, подобные этому?
|
1
2
3
|
<h:inputText value="#{oneBean.name}" rendered="#{anotherBean.showPerson}"/><h:inputText value="#{oneBean.birthday}" rendered="#{anotherBean.showPerson}"/><h:selectOneMenu value="#{oneBean.children}" style="#{anotherBean.showPerson ? 'display:block' : 'display:none'}"/> |
usw. Другой пример:
|
1
2
3
4
5
|
<ui:include src="/include/somesnippet.xhtml"> <ui:param name="age" value="#{someBean.isMan(person) ? 63 : 60}"/> <ui:param name="money" value="#{someBean.isMan(person) and someBean.getCountry(person) eq 'de' ? 1000 : 900}"/> <ui:param name="big" value="#{someBean.getCountry(person) eq 'zh' or someBean.getCountry(person) eq 'ru' ? true : false}"/></ui:include> |
Выражения # {anotherBean.showPerson}, # {someBean.isMan (person)}, # {someBean.getCountry (person)} повторяются несколько раз. Как их оптимизировать? Ну, вы можете использовать JSTL c: set как этот фрагмент кода:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
<c:set var="showPerson" value="#{anotherBean.showPerson}"/><h:inputText value="#{oneBean.name}" rendered="#{showPerson}"/><h:inputText value="#{oneBean.birthday}" rendered="#{showPerson}"/><h:selectOneMenu value="#{oneBean.children}" style="#{showPerson ? 'display:block' : 'display:none'}"/><c:set var="man" value="#{someBean.isMan(person)}"/><c:set var="country" value="#{someBean.getCountry(person)}"/><ui:include src="/include/somesnippet.xhtml"> <ui:param name="age" value="#{man ? 63 : 60}"/> <ui:param name="money" value="#{man and country eq 'de' ? 1000 : 900}"/> <ui:param name="big" value="#{country eq 'zh' or country eq 'ru' ? true : false}"/></ui:include> |
Если вы боитесь подводных камней JSTL (потому что вы слышали, что JSTL не всегда дружит с JSF!), Есть альтернативный и простой подход — ui: param. TagHandler ui: param использует переменную JSF VariableMapper для сохранения выражений EL на карте. Эта карта отображает переменные EL на странице и выражения EL, с которыми они связаны. И здесь вы идете:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
<ui:param name="showPerson" value="#{anotherBean.showPerson}"/><h:inputText value="#{oneBean.name}" rendered="#{showPerson}"/><h:inputText value="#{oneBean.birthday}" rendered="#{showPerson}"/><h:selectOneMenu value="#{oneBean.children}" style="#{showPerson ? 'display:block' : 'display:none'}"/><ui:param name="man" value="#{someBean.isMan(person)}"/><ui:param name="country" value="#{someBean.getCountry(person)}"/><ui:include src="/include/somesnippet.xhtml"> <ui:param name="age" value="#{man ? 63 : 60}"/> <ui:param name="money" value="#{man and country eq 'de' ? 1000 : 900}"/> <ui:param name="big" value="#{country eq 'zh' or country eq 'ru' ? true : false}"/></ui:include> |
Код более читабелен, особенно если у вас очень сложные и длинные выражения. Примечание: мы говорим здесь о читаемом коде, а не об оптимизации производительности, потому что JSF TagHandlers не оценивают выражения EL.
| Ссылка: | Не повторяйте выражения в Facelets от нашего партнера JCG Олега Вараксина в блоге « Мысли о разработке программного обеспечения» . |