javaserver

随着2.0版的发布,Facelet模板成为JSF规范的核心部分。 使用<ui:composition><ui:decorate>标记,可以轻松构建复杂的页面,同时仍保持标记的整洁。 模板在创建HTML表单时特别有用,但是不幸的是,模板的确会导致xhtml文件中的重复,从而破坏了良好软件设计的DRY(不要自己重复)原理 。 作为在JSF和Spring之间提供更深层集成的项目的一部分,我开发了两个新组件,旨在简化模板。 在探究新组件之前,让我们看一下如何使用标准JSF模板构建典型表单。

表单模板的初始起点通常是为每个输入添加一些模板。 通常,您需要额外的<div>或<span>标记以供CSS使用。 这是一个典型的例子:

<!-- /WEB-INF/pages/entername.xhtml -->
<ui:decoreate template="/WEB-INF/layout/form.xhtml"><h:inputText id="firstName" label="First Name" value="#{bean.firstName}"/><ui:param name="label" value="First Name"/><ui:param name="for" value="firstName"/>
</ui:decorate>
<ui:decoreate template="/WEB-INF/layout/form.xhtml"><h:inputText id="lastName" label="Last Name" value="#{bean.lastName}"/><ui:param name="label" value="Last Name"/><ui:param name="for" value="lastName"/>
</ui:decorate>
<!-- Many additional form elements -->
<!-- /WEB-INF/layout/form.xhtml -->
<ui:composition><div class="formElement"><span class="formLabel"><h:outputLabel for="#{for}" label="#{label}"></span><ui:insert/></div>
</ui:composition>

在这里,我们可以看到表单上的每个项目都包含在<div>中,并且表单标签被包裹在其他<span>中 。 标记中已经存在一些重复,“ for”参数反映了组件ID。 我还给每个<h:inputText>元素一个标签属性
为了获得更好的验证错误消息,请在“标签” <ui:param>中重复此操作。 如果我们想用星号标记必填字段,情况会变得越来越糟:

<!-- /WEB-INF/pages/entername.xhtml -->
<ui:decoreate template="/WEB-INF/layout/form.xhtml"><h:inputText id="firstName" label="First Name" value="#{bean.firstName}" required="false"/><ui:param name="label" value="First Name"/><ui:param name="for" value="firstName"/><ui:param name="showAsterisk" value="false"/>
</ui:decorate>
<ui:decoreate template="/WEB-INF/layout/form.xhtml"><h:inputText id="lastName" label="Last Name" value="#{bean.lastName}" required="true"/><ui:param name="label" value="Last Name"/><ui:param name="for" value="lastName"/><ui:param name="showAsterisk" value="true"/>
</ui:decorate>
<!-- Many additional form elements -->
<!-- /WEB-INF/layout/form.xhtml -->
<ui:composition><div class="formElement"><span class="formLabel"><h:outputLabel for="#{for}" label="#{label}#{showAsterisk ? ' *' : ''}"></span><ui:insert/></div>
</ui:composition>

非常令人沮丧的是,我们需要传递<ui:param>项,这些项与<h:inputText>上已经指定的属性重复。 很容易看出,即使是相对较小的表单,我们也将最终在标记中重复很多。 我们需要的是一种获取有关模板中插入的组件的信息的方法,即使我们不知道组件将是哪种类型。 我们需要的是<s:componentInfo>

<s:componentInfo>组件公开一个变量,该变量包含有关所插入组件的信息。 此信息包括标签 ,组件clientID以及是否需要该组件。 通过检查插入的项目,我们可以删除很多重复项:

<!-- /WEB-INF/pages/entername.xhtml -->
<ui:decoreate template="/WEB-INF/layout/form.xhtml"><h:inputText id="firstName" label="First Name" value="#{bean.firstName}" required="false"/>
</ui:decorate>
<ui:decoreate template="/WEB-INF/layout/form.xhtml"><h:inputText id="lastName" label="Last Name" value="#{bean.lastName}" required="true"/>
</ui:decorate>
<!-- Many additional form elements -->
<!-- /WEB-INF/layout/form.xhtml -->
<ui:composition><s:componentInfo var="info"><div class="formElement"><span class="#{info.valid ? 'formLabel' : 'formErrorLabel'}"><h:outputLabel for="#{info.for}" label="#{info.label}#{info.required ? ' *' : ''}"></span><ui:insert/></div></s:componentInfo>
</ui:composition>

我们现在可以做的其他事情就是判断插入的组件是否通过了验证。 请注意,上面的示例将为无效的组件选择“ formErrorLabel ” CSS类。

拥有新的<s:componentInfo>组件的一个有趣的功能是,所有<ui:decorate>标签都变得相同。 我们已经删除了标签内的所有重复,但是标签本身仍然重复了很多次。 在这里,我们还有另外一个技巧,可以通过引入新的<s:decorateAll>标记来提供帮助。 使用<s:decorateAll>允许对每个子组件应用一次模板。 这是更新的表单标记:

<!-- /WEB-INF/pages/entername.xhtml -->
<s:decoreateAll template="/WEB-INF/layout/form.xhtml"><h:inputText id="firstName" label="First Name" value="#{bean.firstName}" required="false"/><h:inputText id="lastName" label="Last Name" value="#{bean.lastName}" required="true"/><!-- Many additional form elements -->
</s:decorateAll>
<!-- /WEB-INF/layout/form.xhtml -->
<ui:composition><s:componentInfo var="info"><div class="formElement"><span class="#{info.valid ? 'formLabel' : 'formErrorLabel'}"><h:outputLabel for="#{info.for}" label="#{info.label}#{info.required ? ' *' : ''}"></span><ui:insert/></div></s:componentInfo>
</ui:composition>

如果您想查看这些组件的源代码,请查看springfaces GitHub项目上的org.springframework.springfaces.template.ui软件包。

参考: 集成Spring和JavaServer Faces:在Phil Webb博客上,我们JCG合作伙伴 Phillip Webb 改进了模板 。

翻译自: https://www.javacodegeeks.com/2012/04/integrating-spring-javaserver-faces.html

javaserver

javaserver_集成Spring和JavaServer Faces:改进的模板相关推荐

  1. 集成Spring和JavaServer Faces:改进的模板

    随着2.0版的发布,Facelet模板成为JSF规范的核心部分. 使用<ui:composition>和<ui:decorate>标记,可以轻松构建复杂的页面,同时仍保持标记清 ...

  2. javaserver_什么是JavaServer Faces(JSF)–(第2部分)

    javaserver Facelets声明语言 在第1部分中,我介绍了JavaServer Pages(JSF)背后的基本思想 . 在本文中,我想介绍Facelets声明语言 . HTML标签 我们遇 ...

  3. Spring MVC集成Spring Data Reids和Spring Session实现Session共享

    说明:Spring MVC中集成Spring Data Redis和Spring Session时版本是一个坑点,比如最新版本的Spring Data Redis已经不包含Jedis了,需要自行引入. ...

  4. 解决JavaServer Faces 2.2 requires Dynamic Web Module 2.5 or newer问题

    解决JavaServer Faces 2.2 requires Dynamic Web Module 2.5 or newer问题 参考文章: (1)解决JavaServer Faces 2.2 re ...

  5. activiti集成spring

    1.集成Spring配置 添加依赖pom activiti-spring 基于Spring的默认配置activiti-context.xml Activiti核心服务需要注入Spring容器的 2.基 ...

  6. SpringBoot集成Spring Security —— 第二章自动登录

    文章目录 一.修改login.html 二.两种实现方式 2.1 Cookie 存储 2.2 数据库存储 2.2.1 基本原理 2.2.2 代码实现 三.运行程序 在上一章:SpringBoot集成S ...

  7. Spring Security——集成Spring Session、Redis和JSON序列化解决方案

    官方文档 https://docs.spring.io/spring-session/docs/2.4.2/reference/html5/#spring-security Maven 主要 < ...

  8. 如何集成Spring和Struts(实例说明)

    2019独角兽企业重金招聘Python工程师标准>>> 1.Struts和Spring Struts 代表了MVC第二类架构的实现,在Struts中最重要的组件是ActionServ ...

  9. 集成spring mvc_向Spring MVC Web应用程序添加社交登录:集成测试

    集成spring mvc 我已经写了关于为使用Spring Social 1.1.0的应用程序编写单元测试的挑战,并为此提供了一种解决方案 . 尽管单元测试很有价值,但它并不能真正告诉我们我们的应用程 ...

最新文章

  1. python类和对象课件_简单解释Python的类和对象
  2. UVA 11983 Weird Advertisement
  3. 7个相同小球4个不同盒子_如何用天平称三次找出12个外观相同小球中仅有的一个次品?次品质量与正品不同。...
  4. access开发精要(4)-参考与查阅
  5. Java黑皮书课后题第7章:*7.29(游戏:挑选四张牌)编写一个程序,从一副52张牌中选出4张,然后计算它们的和。Ace King Quee Jack分别表示1、13、12和11,显示得到和24的次
  6. yii 提交表单报400错误,提示 “您提交的数据无法验证”,问题处理。
  7. 机器学习基础-线性代数学习
  8. Python strftime()
  9. Ubuntu安装jdk10
  10. 国内docker镜像网站
  11. Eclipse语言包在官网下载不了-解决方案
  12. leapftp注册码,不同版本的leapftp注册码
  13. 小波变换原理及傅里叶变换(极好的文章)
  14. 第二周练习 委派任务
  15. python热搜排行功能_手把手教你用Python+Pyecharts让微博热搜榜动起来
  16. 电话号码的字母组合(Java)
  17. 识海日志——时间都去哪了(20140311)
  18. 盘点国内外十类垂直型社交网站
  19. eclipse如何修改字体
  20. [ZZ] SAP 标准教材和自学方法

热门文章

  1. 消息中间件ActiveMQ、RabbitMQ、RocketMQ、ZeroMQ、Kafka如何选型
  2. 若依部署上线之后验证码不显示的解决方法之一
  3. C#基础知识详解之【字段与属性】
  4. HTML5表格简单应用案例之[招聘需求表]
  5. mvc.net分页查询案例——PagedList
  6. oracle基本笔记整理及案例分析1
  7. Android之ZXing扫描二维码以及生成二维码
  8. arm linux串口控制led,通信程序设计 - Linux下ARM和单片机的串口通信设计
  9. eclipse发布web项目到tomcat服务器
  10. thinking-in-java(11) 持有对象