Jsf 使用POJO';带SelectOne的s带有通用转换器的菜单

Jsf 使用POJO';带SelectOne的s带有通用转换器的菜单,jsf,primefaces,Jsf,Primefaces,您好,如何将POJO列表与JSFh:selectOneMenu或Primefacesp:selectOneMenu? 我知道有很多相关问题建议使用Converter,但没有明确的从头构建示例 我想要一个通用的转换器代码用于上述目的 请建议任何备选方案/如果是重复的,请向我指出正确的问题。这里是一个使用POJO和Primefaces的完整示例p:selectOneMenu。Primefaces select one菜单显示学生列表。如果在选择任何学生后按details按钮,将显示一个Primefa

您好,如何将POJO列表与JSF
h:selectOneMenu
或Primefaces
p:selectOneMenu

我知道有很多相关问题建议使用Converter,但没有明确的从头构建示例

我想要一个通用的转换器代码用于上述目的


请建议任何备选方案/如果是重复的,请向我指出正确的问题。

这里是一个使用POJO和Primefaces的完整示例p:selectOneMenu。Primefaces select one菜单显示学生列表。如果在选择任何学生后按details按钮,将显示一个Primefaces对话框,其中包含该学生的全名

com.model包:

学生班

package com.model;

import java.io.Serializable;

public class Student implements Serializable{


private static final long serialVersionUID = 1L;

private int Id;


public int getId() {
    return Id;
}
public void setId(int id) {
    Id = id;
}

private String lastName;
private String firstName;


public String getLastName() {
    return lastName;
}
public void setLastName(String lastName) {
    this.lastName = lastName;
}
public String getFirstName() {
    return firstName;
}
public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public Student() {
    super();
    }

    public Student(String lastName, String firstName,int Id) {
    super();
    this.lastName = lastName;
    this.firstName = firstName;
    this.Id = Id;


  }}
转换器

   package com.model;

 import java.util.ArrayList;
 import java.util.List;

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

  @FacesConverter(forClass = com.model.Student.class,value="student")
   public class StudentConverter implements Converter{
 public static List<Student> studentDB;

    static {
        studentDB = new ArrayList<Student>();
        studentDB.add(new Student("William", "Wong", 1));
        studentDB.add(new Student("John", "Smith", 2));
        studentDB.add(new Student("Mari", "Beckley", 3));
        studentDB.add(new Student("Messi", "Leonardo",4));
        studentDB.add(new Student("William", "Astrid", 5));
        studentDB.add(new Student("William", "Banana", 6));

        }

    public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) {
        if (submittedValue.trim().equals("")) {
            return null;
        } else {
            try {
                int number = Integer.parseInt(submittedValue);

                for (Student s : studentDB) {
                    if (s.getId() == number) {
                        return s;
                    }
                }

            } catch(NumberFormatException exception) {
                throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid player"));
            }
        }

        return null;
    }

    public String getAsString(FacesContext facesContext, UIComponent component, Object value) {
        if (value == null || value.equals("")) {
            return "";
        } else {
            return String.valueOf(((Student) value).getId());
        }
    }
}
package.com.model;
导入java.util.ArrayList;
导入java.util.List;
导入javax.faces.application.FacesMessage;
导入javax.faces.component.UIComponent;
导入javax.faces.context.FacesContext;
导入javax.faces.convert.Converter;
导入javax.faces.convert.ConverterException;
导入javax.faces.convert.FacesConverter;
@FacesConverter(forClass=com.model.Student.class,value=“Student”)
公共类StudentConverter实现转换器{
公共静态列表studentDB;
静止的{
studentDB=newarraylist();
学生数据库添加(新学生(“威廉”,“王”,1));
学生数据库添加(新学生(“约翰”、“史密斯”,2));
学生数据库添加(新学生(“玛丽”,“贝克利”,3));
学生数据库添加(新学生(“梅西”、“莱昂纳多”,4));
学生数据库添加(新学生(“威廉”,“阿斯特里德”,5));
学生数据库添加(新学生(“威廉”,“香蕉”,6));
}
公共对象getAsObject(FacesContext FacesContext、UIComponent组件、字符串submittedValue){
if(submittedValue.trim()等于(“”){
返回null;
}否则{
试一试{
int number=Integer.parseInt(submittedValue);
用于(学生s:studentDB){
如果(s.getId()==数字){
返回s;
}
}
}捕获(NumberFormatException异常){
抛出新ConverterException(新FacesMessage(FacesMessage.SEVERITY_错误,“转换错误”,“不是有效的播放机”);
}
}
返回null;
}
公共字符串getAsString(FacesContext FacesContext、UIComponent组件、对象值){
if(value==null | | value.equals(“”){
返回“”;
}否则{
返回字符串.valueOf(((学生)值).getId());
}
}
}
com.managedbean包

   package com.managedbean;

   import java.util.List;
   import javax.annotation.PostConstruct;
   import javax.faces.bean.ManagedBean;
   import javax.faces.bean.ViewScoped;
   import com.model.Student;
   import com.model.StudentConverter;

 @ManagedBean
 @ViewScoped
    public class StudentMB {
    private Student  selectedStudent;
    public Student getSelectedStudent() {
    return selectedStudent;
}


public void setSelectedStudent(Student selectedStudent) {
    this.selectedStudent = selectedStudent;
}


public List<Student> getStudents() {
    return students;
}


public void setStudents(List<Student> students) {
    this.students = students;
}


private List<Student> students;


@PostConstruct
public void init(){
    students=StudentConverter.studentDB;
}

 }
package com.managedbean;
导入java.util.List;
导入javax.annotation.PostConstruct;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.ViewScoped;
导入com.model.Student;
导入com.model.StudentConverter;
@ManagedBean
@视域
公立班学生{
私人学生选择学生;
公立学生getSelectedStudent(){
返回所选学生;
}
公共无效设置selectedStudent(Student selectedStudent){
this.selectedStudent=selectedStudent;
}
公众学生名单{
留学生;
}
公立学校学生(名单学生){
这个。学生=学生;
}
私人名单学生;
@施工后
公共void init(){
students=StudentConverter.studentDB;
}
}
选择menu.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:p="http://primefaces.org/ui">
  <h:head>
 </h:head>
 <h:body>
 <h:form> 
 <h:panelGrid columns="2" style="margin-bottom:10px" cellpadding="1">  
 <h:outputText value="Pojo: " />  
     <p:selectOneMenu value="#{studentMB.selectedStudent}"  effect="fade" converter="student">  
        <f:selectItem itemLabel="Select One" itemValue="" />  
        <f:selectItems value="#{studentMB.students}" var="student" itemLabel="#{student.firstName}" itemValue="#{student}"/>  
    </p:selectOneMenu> 
    </h:panelGrid>  
    <p:commandButton value="Details" update="display" oncomplete="dlg.show()" />  

 <p:dialog header="Selected Value" modal="true" showEffect="fade" hideEffect="fade" widgetVar="dlg">
 <h:panelGrid columns="1" id="display">  
  <h:outputText value="#{studentMB.selectedStudent.firstName} #{studentMB.selectedStudent.lastName}" rendered="#{not empty studentMB.selectedStudent}" />
  </h:panelGrid>
  </p:dialog>
  </h:form>


</h:body>
</html>

获取源代码


您可以从h:selectOneMenu中下载使用eclipse构建并部署到glassfish的完整示例。这是可能的,但您的POJO必须实现一个带有标识符属性的接口

接口:

public inteface IConvertible {
    public Integer getId();
}
Pojo:

和通用转换器:

@SuppressWarnings("unchecked")
public class GenericConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
        IConvertible ret = null;
        UIComponent src = arg1;
        if (src != null) {
            List<UIComponent> childs = src.getChildren();
            UISelectItems itens = null;
            if (childs != null) {
                for (UIComponent ui : childs) {
                    if (ui instanceof UISelectItems) {
                        itens = (UISelectItems) ui;
                        break;
                    } else if (ui instanceof UISelectItem) {
                        UISelectItem item = (UISelectItem) ui;
                        try {
                            IConvertible val = (IConvertible) item.getItemValue();
                            if (arg2.equals("" + val.getId())) {
                                ret = val;
                                break;
                            }
                        } catch (Exception e) {
                        }
                    }
                }
            }

            if (itens != null) {
                List<IConvertible> values = (List<IConvertible>) itens.getValue();
                if (values != null) {
                    for (IConvertible val : values) {
                        if (arg2.equals("" + val.getId())) {
                            ret = val;
                            break;
                        }
                    }
                }
            }
        }
        return ret;
    }

    @Override
    public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
        String ret = "";
        if (arg2 != null && arg2 instanceof IConvertible) {
            IConvertible m = (IConvertible) arg2;
            if (m != null) {
                Long id = m.getId();
                if (id != null) {
                    ret = id.toString();
                }
            }
        }
        return ret;
    }
}
@SuppressWarnings(“未选中”)
公共类GenericConverter实现转换器{
@凌驾
公共对象getAsObject(FacesContext arg0、UIComponent arg1、字符串arg2){
IConvertible ret=null;
UISRC组件=arg1;
如果(src!=null){
List childs=src.getChildren();
UISelectItems itens=null;
if(childs!=null){
用于(UIComponent ui:childs){
if(UISelectItems的ui实例){
itens=(UISelectItems)ui;
打破
}else if(UISelectItem的ui实例){
UISelectItem项目=(UISelectItem)用户界面;
试一试{
IConvertible val=(IConvertible)item.getItemValue();
if(arg2.equals(“+val.getId())){
ret=val;
打破
}
}捕获(例外e){
}
}
}
}
如果(itens!=null){
列表值=(列表)itens.getValue();
如果(值!=null){
对于(IConvertible val:值){
if(arg2.equals(“+val.getId())){
ret=val;
打破
}
}
}
}
}
返回ret;
}
@凌驾
公共字符串getAsString(FacesContext arg0、UIComponent arg1、对象arg2){
字符串ret=“”;
if(arg2!=null&&arg2 instanceof IConvertible){
IConvertible m=(IConvertible)arg2;
如果(m!=null){
Long id=m.getId();
如果(id!=null){
ret=id.toString();
}
}
}
返回ret;
}
}
JSF页面:

<h:selectOneMenu id="combo" value="#{pojoMB.pojo}" converter="genericConverter">
    <f:selectItem itemLabel="-- Select one --" itemValue="" />
    <f:selectItems value="#{pojoMB.pojoList}" var="pj" itemValue="#{pj}" itemLabel="#{pj.labelOfPojo}" />
</h:selectOneMenu>

在我的情况下,需要添加一个equals
<h:selectOneMenu id="combo" value="#{pojoMB.pojo}" converter="genericConverter">
    <f:selectItem itemLabel="-- Select one --" itemValue="" />
    <f:selectItems value="#{pojoMB.pojoList}" var="pj" itemValue="#{pj}" itemLabel="#{pj.labelOfPojo}" />
</h:selectOneMenu>