使用JSF,要使用组合框,列表框和复选框,您需要了解javax.faces.model.SelectItem类。 SelectItem表示单个可选选项。 它既包含渲染所需的信息,又包含选择该项目时应绑定的值。 在大多数情况下, SelectItems是使用标签构造的:
new SelectItem(Title.MISS, "Miss");

在JSF 2.0之前使用SelectItems通常很繁琐,因为您需要编写代码以使域对象适应SelectItems 。 JSF 2.0进行了很多改进,您现在可以使用EL表达式动态构造SelectItems 。 例如:

<h:selectOneMenu><f:selectItems value="#{customerRepository.all}" var="customer" label="#{customer.name}"/>
</h:selectOneMenu>

这无疑有助于减少样板代码的数量,但是,我仍然认为我们可以做一些事情使SelectItems更加易于使用,尤其是在使用Spring时。 考虑到这一点,我一直在开发<s:selectItems>组件,旨在代替<f:selectItems>

我们可以做的第一件事是通过消除指定var属性的需要来帮助减少样板的键入。 使用<s:selectItems>时 ,如果未指定var属性,则默认为item 。 所以上面的代码可以写成:

<h:selectOneMenu><s:selectItems value="#{customerRepository.all}" label="#{item.name}"/>
</h:selectOneMenu>

在上面的示例中,该绑定到一个存储库接口,该接口返回“ 客户”实体集合 。 与标准<f:selectItems>组件一样,您也可以绑定到ArrayDataModel 。 此外,新组件还支持任何以逗号分隔的String值。

<h:selectOneMenu><s:selectItems value="Java, Spring, JavaServer Faces"/>
</h:selectOneMenu>

<s:selectItems>可以帮助的下一件事是值。 在下拉菜单中需要一个“ Please Select”选项来表示null是很常见的。 在原始JSF中,这通常可能意味着每个组件都需要额外加价:

<h:selectOneMenu><f:selectItem label="--- Please Select ---" noSelectionOption="true" itemValue=""/><s:selectItems value="'{items}"/>
</h:selectOneMenu>

无需为每个元素添加额外的标记,只要将其链接到UISelectOne组件,我们的组件就会自动插入“请选择”选项。 您可以使用includeNoSelectionOption属性来覆盖此行为。 用于“不选择选项”的标签将默认为“-请选择-”,但是您可以通过在您的ApplicationContext中添加一个org.springframework.context.MessageSource来解析和修改代码“ spring.faces” ,从而轻松自定义和国际化此文本。 .noselectionoption”

MessageSource的主题上, <s:selectItems>组件将尽可能尝试使用org.springframework.springfaces.message.ObjectMessageSource创建SelectItem的标签。 我过去在博客中写过有关如何将对象转换为消息的内容,而该组件只是利用了这些想法。

在创建要显示的SelectItem时,新组件对我们有所帮助,但是如何处理表单提交呢? 如何将提交的String选项转换回真实对象 ? 在上面的第一个示例中,我们绑定到JPA 客户实体; 值将显示得很好,但是当您提交表单时,将显示“转换错误”,因为JSF不知道如何从提交的String返回到Customer对象。 通常的答案是开发自己的javax.faces.convert.Converter实现,但这通常是有问题的。 通常,您选择的项目值将是一些复杂的对象,很难完整地表示为String

编写将与UISelectOneUISelectMany组件一起使用的Converter时,可以使用一种有趣的技术。 实际上,您只需要编写代码就可以从Object转换为String ,则可以通过迭代SelectItem并返回单个Object值(转换为String时与您提交的值匹配)来完成从另一个方向的转换。 您可以在 Arjan Tijms的此博客文章中了解有关此想法的更多信息。 将此技术与<s:selectItems>组件一起使用非常简单,只需提供一个itemConverterStringValue属性,该属性将用于创建唯一的getAsString()值:

<h:selectOneMenu><s:selectItems value="#{customerRepository.all}" label="#{item.name}" itemConverterStringValue="#{item.id}"/>
</h:selectOneMenu>

实际上, itemConverterStringValue是可选的。 如果未指定,则将使用对象的toString()方法;对于JPA @Entity ,将自动使用@ID字段。 如果需要,您仍然可以自由编写和附加自己的Converter,在这种情况下, itemConverterStringValue将被忽略。

最后,这是<s:selectItems>可以执行的另一个技巧。 如果选择组件绑定到布尔值枚举,则可以完全省略value属性。 选择项将基于绑定支持的所有可能选项( 布尔值“是” /“否”或完整的枚举值集)构建。 这也适用于类型化的集合。 例如,以下将显示选项“ Java”,“ Spring”和“ JavaServer Faces”(假设您具有适当的ObjectMessageSource ):

public enum Technology {JAVA, SPRING, JAVASERVER_FACES
}
public class Bean implements Serializable {private Set<Technology> technologies = new HashSet<Technology>();// ... getters and setters
}
<h:selectManyCheckbox value="#{bean.technologies}"><s:selectItems/>
</h:selectManyCheckbox>
如果您想查看其中的任何代码,请查看GitHub Project中的org.springframework.springfaces.selectitems包。

参考: 集成Spring和JavaServer Faces:从Phil Webb博客博客中的JCG合作伙伴 Phillip Webb 选择项目 。

翻译自: https://www.javacodegeeks.com/2012/06/spring-jsf-integration-select-items.html

Spring和JSF集成:选择项目相关推荐

  1. 搭建Spring Boot2.X集成Hibernate5项目,并集成传统SSH老项目的安全认证组件,以Spring Boot方式开发项目并集成到老系统

    搭建Spring Boot2.X集成Hibernate5项目,并集成传统SSH老项目的安全认证组件,以Spring Boot方式开发项目并集成到老系统 场景 可行性分析 搭建Spring Boot集成 ...

  2. Spring和JSF集成:导航

    我希望这是有关我在Spring和JavaServer Faces之间提供深度集成的努力的一系列博客中的第一篇. 这里提到的所有内容都是"正在进行中的工作",因此,如果您签出代码,请 ...

  3. Spring和JSF集成:MVC螺母和螺栓

    过去,我曾尝试将JSF与Spring MVC集成在一起,尽管我的第一次尝试成功了,但这远非理想. 这次,我决定做出一些关键决定来帮助我集中精力: 向后兼容. 支持JSF 1.2涉及的工作太多,而Spr ...

  4. Spring和JSF集成:转换器

    使用任何Web框架时,都不可避免地需要将用户输入的数据从String为其他类型. 尽管Spring和JSF在设计和功能上确实有很大的不同,但它们都具有转换器策略来处理此问题. 让我们从春天开始. Sp ...

  5. Spring和JSF集成:异常处理

    大多数JSF开发人员都会熟悉"发生错误"页面,当在他们的代码某处引发意外异常时,该页面就会显示. 该页面在开发时确实很有用,但对于生产应用程序通常不是您想要的. 通常,在用库存JS ...

  6. Spring和JSF集成:分页

    处理大型数据集时,通常需要以分页格式显示数据. 分页是一个有趣的问题,因为它倾向于跨越应用程序的所有层,从视图层通过应用程序服务一直到对数据库的原始调用. 在获取分页数据时,有一些非常好的解决方案. ...

  7. Spring和JSF集成:国际化和本地化

    如果您正在开发针对多种语言的JSF应用程序,那么您可能很熟悉<f:loadBundle>标记. 即使您的应用程序不支持使用消息包的国际化仍然是一个好主意. 在<f:loadBundl ...

  8. Spring和JSF集成:动态导航

    通常,您的JSF应用程序将需要超越基本的静态导航并开始做出动态导航决策. 例如,您可能想根据用户的年龄重定向他们. 大多数JSF教程建议通过将命令的action属性绑定到支持bean来实现动态导航: ...

  9. jsf集成spring_Spring JSF集成

    jsf集成spring Welcome to Spring JSF integration tutorial. JSF is a component based framework with grea ...

最新文章

  1. 【Groovy】自定义 Xml 生成器 BuilderSupport ( 构造 Xml 节点类 | 封装节点名称、节点值、节点属性、子节点 | 将封装的节点数据转为 Xml 字符串 )
  2. MongoDB数据库索引基础知识与实战技巧
  3. python 多进程 multiprocessing 进程池 pool apply_async()函数与apply()函数的用法
  4. 4 谐波_技术文章—功率分析仪在IEC谐波的测试应用
  5. 为10号部门的员工涨工资
  6. 2-快速排序C递归实现(递增递减的简单转换)
  7. 为什么8位数据范围是-128到127,而不是-127到128?
  8. Android获取手机和系统版本等信息的代码
  9. C语言 strlcpy函数实现
  10. 某角数卡发卡网程序V1.7.1版本开源源码
  11. ajax jinja,在Flask中根据ajax response呈现Jinja模板
  12. c 语言自行实现字符串常用库函数_学习c语言的7本书——你知道吗?
  13. python学习笔记(14)参数对应
  14. PCA相关 PCL库和Matlab对比
  15. vue项目改图标_vue 项目全局修改element-ui的样式
  16. java中两个数组的并集_Java数组并集
  17. 后端工程师第一周实习笔记(实习面试必知大学课堂上却没讲的知识点)
  18. 大数据解读《旅行青蛙》崛起之谜
  19. Mac下使用Eclipse读java源码
  20. 织梦联动添加三级分类后无法添加二级分类的解决方案

热门文章

  1. POJ1321(DFS)
  2. vmware用户名和密码_VMWare vijava –“用户名或密码不正确”异常的奇怪情况
  3. oracle 容器运行_Oracle应用容器云的自由
  4. jax-rs jax-ws_信守承诺:针对JAX-RS API的基于合同的测试
  5. drools6.5_Drools 6.4.0.Final提供
  6. 字节流和字符流哪个不刷新_不喜欢节流吗?
  7. ant 路径_在Ant中显示路径
  8. java分割句子_关于Java的一些句子
  9. JDBC –模拟序列
  10. Java开发趋势:2019年展望