Вы когда-нибудь видели повторяющиеся выражения 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 Олега Вараксина в блоге « Мысли о разработке программного обеспечения» . |