您好如何使用JSF h:selectOneMenu
或Primefaces p:selectOneMenu
的POJO列表?
我知道有很多相关的问题建议使用Converter但没有明确的构建从头开始的例子。
我想要一个通用的转换器代码用于上述目的。
如果重复,请建议任何替代方案/指出正确的问题。
答案 0 :(得分:5)
这里是一个使用POJO和Primefaces的完整示例p:selectOneMenu.theprinfaces选择一个菜单显示学生列表。如果在选择任何学生后按详细信息按钮,将出现一个名称对话框的全名学生。
com.model package:
学生班
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());
}
}
}
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>
获取源代码
您可以下载使用eclipse构建的完整示例,并从here
部署到glassfish答案 1 :(得分:3)
在h:selectOneMenu中它是可能的,但是你的POJO必须实现一个带有标识符atrribute的接口。
接口:
public inteface IConvertible {
public Integer getId();
}
POJO的:
public class POJO implements IConvertible {
....
....
}
通用转换器:
@SuppressWarnings("unchecked")
public class GenericConverter implements Converter {
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
Entidade 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 (Entidade 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 Entidade) {
Entidade m = (Entidade) arg2;
if (m != null) {
Long id = m.getId();
if (id != null) {
ret = id.toString();
}
}
}
return 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}" />