如何使用 JSF 和 PrimeFaces 在控制器 class 变量中存储 selectOneMenu 的值

How to store value of selectOneMenu in controller class variable using JSF and PrimeFaces

在我的控制器 StudentController 中,我有一个变量 Course course,我想用在我的 JSF 页面中 selectOneMenu 中选择的值来设置这个变量。单击保存按钮将暂时调用 JSF 页面 index(我将用我自己的代码填充该部分,以保留学生课程,这不会有问题)。 我的 JSF 页面中的相应部分:

<h:form>
    <h:panelGrid columns="2" style="margin-bottom:10px" cellpadding="5">
        <p:outputLabel for="course" value="Select Course:" />
        <p:selectOneMenu id="course" value="#{studentController.course}">
            <f:selectItem itemLabel="--- Please Select ---" itemValue="" />
            <f:selectItems value="#{studentController.courses}" var="course"
                itemLabel="#{course.name}" itemValue="#{course}" />
        </p:selectOneMenu>
    </h:panelGrid>
    <p:commandButton action="index?faces-redirect=true"
        value="Save" icon="ui-icon-circle-check" />
</h:form>

控制器中对应部分:

@ManagedBean
@SessionScoped
public class StudentController {

    // list contains available courses, is not empty
    private List<Course> courses;

    private Course course = new Course();

    // getter, setter and other functionality
}

当我点击保存按钮时,没有任何反应。我的控制台中没有错误消息,没有重定向。 如何将在 selectOneMenu 上选择的值存储在我的 course 变量中?

为了将值从 <p:selectOneMenu 映射到您的 java 对象,您需要使用 jsf 转换器。

您可以在不添加任何依赖项的情况下使用通用转换器

import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;
import java.util.WeakHashMap;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

@FacesConverter(value = "entityConverter")
public class EntityConverter implements Converter {

    private static Map<Object, String> entities = new WeakHashMap<Object, String>();

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object entity) {
        synchronized (entities) {
            if (!entities.containsKey(entity)) {
                String uuid = UUID.randomUUID().toString();
                entities.put(entity, uuid);
                return uuid;
            } else {
                return entities.get(entity);
            }
        }
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String uuid) {
        for (Entry<Object, String> entry : entities.entrySet()) {
            if (entry.getValue().equals(uuid)) {
                return entry.getKey();
            }
        }
        return null;
    }

}

然后将您的 xhtml 更改为

<p:selectOneMenu converter="entityConverter"> 

现在您将在托管 bean 中选择值。