2017-01-23 2 views
0

Я использую 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> 

Java

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

ответ

0

Если вы хотите, чтобы показать ту же информацию для всех трех классов, скажем, идентификатор и имя, вы можете попробовать использовать наследование:

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}"/> 
Смежные вопросы