转换器动态更改类名

时间:2017-01-23 03:24:59

标签: jsf primefaces

我在我的应用程序中使用PrimeFaces 5.1我使用高级下拉菜单显示学生姓名。我的问题是,如果相同的高级下拉选项用于教授,员工和部门的详细信息。现在我为

中的每个转换器使用单独的类
**Object value1 =resolver.getValue(facesContext.getELContext(), null, "Student");
Student service = (Student) value1;**

线。 我的疑问是如何替换类名以动态地为所有转换器使用它?

XHTML

<p:selectOneMenu value="#{Student.studentName}" var="bean"
   converter="StudentConvertor" >
<f:selectItems value="#{Student.studentNameList}" var="stuVar"    
   itemLabel="#{stuVar.studName}" itemValue="#{stuVar}"/>
<p:column>
<h:outputText value="#{bean.studName}"/>
</p:column>
<p:ajax event="change" update="studentPanel" 
   listener="#{Student.studentChangeAction}"/>
</p:selectOneMenu>

爪哇

public class StudentConvertor implements Converter
{

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value)
    {
        if ((value != null) && (value.trim().length() > 0))
        {
            try
            {
                FacesContext facesContext = FacesContext.getCurrentInstance();
                ELResolver resolver = facesContext.getApplication().getELResolver();
                Object value1 = resolver.getValue(facesContext.getELContext(), null, "Student");
                Student service = (Student) value1;

                if (service != null)
                {
                    for (Integer studentId : service.getStudentNameList())
                    {
                        if (Integer.parseInt(value) == studentId)
                        {
                            return studentId;
                }
                    }
                }
                return null;
            }
            catch (NumberFormatException e)
            {
                throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid value."));
            }
        }



        return null;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value)
    {
        if (value != null)
        {
            return String.valueOf(((String) value).getStudentId());
        }


        return null;
    }
}

1 个答案:

答案 0 :(得分:0)

如果您想要显示所有三个类的相同信息,请说出Id和Name,您可以尝试使用继承:

public class Item{
    private Integer Id;
    private String name;
    //get + set for both
}
public class Student extends Item{}
public class Staff Item{}
public class Department extends Item{}

然后将您的服务方法更改为:

public List<Item> getStudentList();
public List<Item> getStaffList();
public List<Item> getDepartmentList();

最后,在你的xhtml中:

<f:selectItems value="#{Student.studentNameList}" var="item"    
   itemLabel="#{item.name}" itemValue="#{item.id}"/>
<f:selectItems value="#{Staff.staffNameList}" var="item"    
   itemLabel="#{item.name}" itemValue="#{item.id}"/>
<f:selectItems value="#{Department.departmentNameList}" var="item"    
   itemLabel="#{item.name}" itemValue="#{item.id}"/>