Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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 明确要求将列表作为值。只要一个列表就足够了 <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

JSF生成HTML。HTML在Java术语中基本上是一个大的
字符串
。要在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>