带有 SelectItems 的 JSF 2.0 selctOneMenu

标签 jsf jsf-2

我是 JSF 技术的新手,目前在我们的项目中,我们正在使用带有 spring 和 hibernate 集成的 JSF 2.0。我对 h:selectOneMenu 和 f:selectItems 有一个疑问。
从数据库中,我得到了一个 UserBeans 列表。我正在使用类似

<h:selectOneMenu id="users" value="#{MyBean.user}">
<f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}"    itemValue="#{user.userId}" />
</h:selectOneMenu>

这里的 user 是 UserBean 类型,而 userList 是 UserBeans 的列表。
在 View 页面中它显示正确,但是当我选择一个项目并单击提交按钮时,它在支持 bean 中显示所选用户为 NULL。

我的疑问是我只能为 f:selectItems 或任何其他 bean 列表传递 SelectItem 对象列表 ..??

除了 SelectItem 之外,还有其他方法可以填充 UserBeans 列表。

谢谢你们,
阿尼尔

最佳答案

您已将用户 ID 设置为选择项的值,但您似乎正在尝试绑定(bind) value一个完全值得的User bean 中的属性。您需要将其绑定(bind)为用户 ID。

<h:selectOneMenu id="users" value="#{MyBean.userId}">
   <f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}" itemValue="#{user.userId}" />
</h:selectOneMenu>

如果您的唯一目的是能够选择和设置 User而不仅仅是 ID,那么您需要一个 Converter User 之间进行转换和 String .那是因为 HTTP/HTML 不理解 Java 对象。它只理解字符串。这是一个启动示例:
<h:selectOneMenu id="users" value="#{MyBean.user}">
   <f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}" itemValue="#{user}" />
</h:selectOneMenu>


@FacesConverter(forClass=User.class)
public class UserConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        try {
            return userService.findById(Long.valueOf(value));
        } catch (SomeException e) {
            throw new ConverterException(new FacesMessage(String.format("Cannot convert %s to User", value)), e);
        }
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return String.valueOf(((User) value).getId());
    }

}

然而,这是一项相当昂贵的工作。我建议坚持传递 ID 并在 bean 的操作方法中获取真正的用户一次,而不是让转换器为每个项目执行此操作。

关于带有 SelectItems 的 JSF 2.0 selctOneMenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6137421/

相关文章:

java - 如何使用 h :selectManyCheckbox 绑定(bind)对象

java - JSF2 AJAX h :selectOneMenu listener doesn't call

JSF 支持组件 - 复合组件 - Stackoverflow 异常

jsf-2 -/WEB-INF/lib 外部共享库 JAR 中的常见 Facelets 文件

java - 我想在每个浏览器关闭浏览器后注销我的应用程序?

jsf - 在p :datatable中找不到PrimeFaces/JSF组件ID

ajax - 错误: <f:ajax> contains an unknown id when used with composite:insertChildren

java - 如何在 JSF2.0 中使用 ExternalContext.redirect()?

java - Glassfish 中的错误 "Exception while loading the app"

LocalDate 的 JSF 转换不断让我出现异常