Using POJO's with SelectOneMenu with Generic Converter

前端 未结 2 1543
我寻月下人不归
我寻月下人不归 2021-01-03 06:28

Hello How to use List of POJO\'s with JSF h:selectOneMenu or Primefaces p:selectOneMenu?
I know that there are lot of related questions which s

相关标签:
2条回答
  • 2021-01-03 06:52

    In h:selectOneMenu it's possible, but yours POJO must implements a interface with a identifier atrribute.

    Interface:

    public inteface IConvertible {
        public Integer getId();
    }
    

    Pojo:

    public class POJO implements IConvertible {
        ....
        ....
    }
    

    And generic converter:

    @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;
        }
    }
    

    JSF page:

    <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>
    
    0 讨论(0)
  • 2021-01-03 07:05

    here is a complete example of using a POJO with Primefaces p:selectOneMenu.the primfaces select one menu display a list of students.If you press details button after select any student, a primfaces dialog will appear with the full name of this student.

    com.model package:

    Student class

    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;
    
    
      }}
    

    The converter

       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());
            }
        }
    }
    

    com.managedbean package

       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;
    }
    
     }
    

    selectMenu.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>
    

    get the source code

    you can download the complete example built using eclipse and deployed to glassfish from here

    0 讨论(0)
提交回复
热议问题