Jsf 明确要求将列表作为值。只要一个列表就足够了 <h:selectOneMenu value="#{bean.selectedWarehouse}"> <f:selectItem itemLabel="Choose one .." itemValue="#{null}" /> <f:selectItems value="#{bean.availableWarehouses}" var="warehouse" itemLabel="#{warehouse.name}" itemValue="#{warehouse}" /> </h:selectOneMenu> 私人仓库选择仓库; 可供安置的私人名单; 简介
JSF生成HTML。HTML在Java术语中基本上是一个大的Jsf 明确要求将列表作为值。只要一个列表就足够了 <h:selectOneMenu value="#{bean.selectedWarehouse}"> <f:selectItem itemLabel="Choose one .." itemValue="#{null}" /> <f:selectItems value="#{bean.availableWarehouses}" var="warehouse" itemLabel="#{warehouse.name}" itemValue="#{warehouse}" /> </h:selectOneMenu> 私人仓库选择仓库; 可供安置的私人名单; 简介,jsf,jsf-2,converter,selectonemenu,Jsf,Jsf 2,Converter,Selectonemenu,JSF生成HTML。HTML在Java术语中基本上是一个大的字符串。要在HTML中表示Java对象,必须将它们转换为String。此外,当提交HTML表单时,提交的值在HTTP请求参数中被视为String。在封面下,JSF从返回字符串的 public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) { if (submittedValue == null || s
字符串
。要在HTML中表示Java对象,必须将它们转换为String
。此外,当提交HTML表单时,提交的值在HTTP请求参数中被视为String
。在封面下,JSF从返回字符串的
public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
if (submittedValue == null || submittedValue.isEmpty()) {
return null;
}
try {
return warehouseService.find(Long.valueOf(submittedValue));
} catch (NumberFormatException e) {
throw new ConverterException(new FacesMessage(submittedValue + " is not a valid Warehouse ID"), e);
}
}
要在非标准Java对象(即非字符串
、数字
或布尔值
之间进行转换,EL对其进行了内置转换,或者JSF为其提供了内置标记的日期
),您确实需要提供一个自定义代码。SelectItem
没有任何特殊用途。这只是JSF1.x的一个遗留问题,当时无法直接向
提供例如List
。它也没有特别处理标签和转换
getAsString()
您需要以这样的方式实现该方法:所需的Java对象以唯一的字符串
表示形式表示,该表示形式可用作HTTP请求参数。通常,这里使用技术ID(数据库主键)
public String getAsString(FacesContext context, UIComponent component, Object modelValue) {
if (modelValue == null) {
return ""; // Never return null here!
}
if (modelValue instanceof Warehouse) {
return String.valueOf(((Warehouse) modelValue).getId());
} else {
throw new ConverterException(new FacesMessage(modelValue + " is not a valid Warehouse"));
}
}
请注意,在模型值为空/为空的情况下返回空字符串非常重要,并且:
返回:如果值为null,则返回长度为零的字符串,否则返回转换结果
否则,生成的
将没有值
属性,默认情况下,将项目标签发送回getAsObject()
。另见
getAsObject()
您需要以这样的方式实现:精确地将getAsString()
返回的String
表示转换回精确地在getAsString()
中指定为modelValue
的相同Java对象
换句话说,从技术上讲,您必须能够将返回的对象作为getAsString()
的modelValue
参数传回,然后在无限循环中将获得的字符串作为submittedValue
参数传回getAsObject()
用法
最后,只需注释转换器
,以便钩住所讨论的对象类型,当仓库
类型出现时,JSF将自动处理转换:
@FacesConverter(forClass=Warehouse.class)
这就是“规范的”JSF方法。它毕竟不是很有效,因为它实际上也可以从
中抓取物品。但是转换器
最重要的一点是,它返回一个唯一的字符串
表示,因此Java对象可以通过一个简单的字符串
来识别,该字符串适合在HTTP和HTML中传递
基于toString()的通用转换器
JSF实用程序库有一个基于实体的toString()
结果的工具库。这样,您就不需要再处理getAsObject()
和昂贵的业务/数据库操作了。有关一些具体使用示例,请参见
要使用它,只需按以下方式注册:
<h:selectOneMenu ... converter="omnifaces.SelectItemsConverter">
或者更具可读性/可重用性:
@Override
public String toString() {
return "Warehouse[id=" + id + "]";
}
另见:
- -这样您就不需要为每个实体编写转换器
- -需要对枚举进行稍微不同的处理
与问题无关,因为JSF 2.0不再明确要求将列表作为
值。只要一个列表
就足够了
<h:selectOneMenu value="#{bean.selectedWarehouse}">
<f:selectItem itemLabel="Choose one .." itemValue="#{null}" />
<f:selectItems value="#{bean.availableWarehouses}" var="warehouse"
itemLabel="#{warehouse.name}" itemValue="#{warehouse}" />
</h:selectOneMenu>
私人仓库选择仓库;
可供安置的私人名单;
带有实体和标识符的JSF通用转换器示例:
<p:selectOneMenu id="somItems" value="#{exampleBean.selectedItem}" converter="SelectItemToEntityConverter">
<f:selectItem itemLabel="< select item >" itemValue="#{null}"/>
<f:selectItems value="#{exampleBean.availableItems}" var="item" itemLabel="${item.identifier}" itemValue="#{item}"/>
</p:selectOneMenu>
java
选择ItemToEntityConverter.java
@FacesConverter(value=“SelectItemToEntityConverter”)
公共类SelectItemToEntityConverter实现转换器{
@凌驾
公共对象getAsObject(FacesContext ctx、UIComponent comp、字符串值){
对象o=null;
if(!(value==null | | value.isEmpty()){
o=这个。GetSelectedItemAssentity(comp,value);
}
返回o;
}
@凌驾
公共字符串getAsString(FacesContext ctx、UIComponent comp、对象值){
字符串s=“”;
if(值!=null){
s=((ABaseEntity)值).getIdentifier().toString();
}
返回s;
}
私有ABaseEntity GetSelectedItemAssentity(UIComponent组件,字符串值){
a实体项=null;
List selectItems=null;
对于(uic组件uic:comp.getChildren()){
if(uic UISelectItems的uic实例){
Long itemId=Long.valueOf(值);
selectItems=(List)((UISelectItems)uic.getValue();
if(itemId!=null&&selectItems!=null&&selectItems.isEmpty()){
谓词谓词=i->i.getIdentifier().equals(itemId);
item=selectItems.stream().filter(谓词).findFirst().orElse(null);
}
}
}
退货项目;
}
}
和用法:
<p:selectOneMenu id="somItems" value="#{exampleBean.selectedItem}" converter="SelectItemToEntityConverter">
<f:selectItem itemLabel="< select item >" itemValue="#{null}"/>
<f:selectItems value="#{exampleBean.availableItems}" var="item" itemLabel="${item.identifier}" itemValue="#{item}"/>
</p:selectOneMenu>
带有实体和标识符的JSF通用转换器示例:
<p:selectOneMenu id="somItems" value="#{exampleBean.selectedItem}" converter="SelectItemToEntityConverter">
<f:selectItem itemLabel="< select item >" itemValue="#{null}"/>
<f:selectItems value="#{exampleBean.availableItems}" var="item" itemLabel="${item.identifier}" itemValue="#{item}"/>
</p:selectOneMenu>
java
选择ItemToEntityConverter.java
@FacesConverter(value=“SelectItemToEntityConverter”)
公共类SelectItemToEntityConverter实现转换器{
@凌驾
公共对象getAsObject(FacesContext ctx、UIComponent comp、字符串值){
对象o=null;
if(!(value==null | | value.isEmpty()){
o=这个。GetSelectedItemAssentity(comp,value);
}
public abstract class ABaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
public abstract Long getIdentifier();
}
@FacesConverter(value = "SelectItemToEntityConverter")
public class SelectItemToEntityConverter implements Converter {
@Override
public Object getAsObject(FacesContext ctx, UIComponent comp, String value) {
Object o = null;
if (!(value == null || value.isEmpty())) {
o = this.getSelectedItemAsEntity(comp, value);
}
return o;
}
@Override
public String getAsString(FacesContext ctx, UIComponent comp, Object value) {
String s = "";
if (value != null) {
s = ((ABaseEntity) value).getIdentifier().toString();
}
return s;
}
private ABaseEntity getSelectedItemAsEntity(UIComponent comp, String value) {
ABaseEntity item = null;
List<ABaseEntity> selectItems = null;
for (UIComponent uic : comp.getChildren()) {
if (uic instanceof UISelectItems) {
Long itemId = Long.valueOf(value);
selectItems = (List<ABaseEntity>) ((UISelectItems) uic).getValue();
if (itemId != null && selectItems != null && !selectItems.isEmpty()) {
Predicate<ABaseEntity> predicate = i -> i.getIdentifier().equals(itemId);
item = selectItems.stream().filter(predicate).findFirst().orElse(null);
}
}
}
return item;
}
}
<p:selectOneMenu id="somItems" value="#{exampleBean.selectedItem}" converter="SelectItemToEntityConverter">
<f:selectItem itemLabel="< select item >" itemValue="#{null}"/>
<f:selectItems value="#{exampleBean.availableItems}" var="item" itemLabel="${item.identifier}" itemValue="#{item}"/>
</p:selectOneMenu>