2013-10-17 47 views
0

我创建了PickList是我的网站,它的工作原理非常缓慢。 我有大约1000个项目,每次我点击提交进入转换器,并做了1000次。即使没有选择。Primefaces Picklist with large data set

也许我可以跳过转换器或只采取目标项目(没有在互联网上找到的例子),或只回馈一些文本(因为这可能只是代码)或其他谣言?

我使用primefaces 3.5

我的转换器:

public Object getAsObject(FacesContext context, UIComponent component, String value) { 

    if(value != null){ 
     int iii = Integer.parseInt(value); 
     Jbtit s = new Jbtit(); 

     s = SR.findById(iii); 

     return s; 
    } 

    return null; 
} 


public String getAsString(FacesContext context, UIComponent component, Object value) { 

    if(value == null){ 
     return ""; 
    } 

    if (!(value instanceof Jbtit)) return null; 

    Integer i = ((Jbtit) value).getId(); 

    if(i != null){ 
     String s = Integer.toString(i); 
     return s; 
    } 
    return ""; 
} 

XHTML:

<p:pickList id="jbtit" styleClass="jbtitPickList" 
    value="#{panelCountMB.jobTitles}" var="jb" effect="none" 
    itemValue="#{jb}" itemLabel="#{jb.code} - #{jb.description_en}" 
    converter="#{jbtitConverter}" showCheckbox="true" showSourceFilter="true" 
    showTargetFilter="true" filterMatchMode="contains" > 
    <f:facet name="sourceCaption">Available</f:facet> 
    <f:facet name="targetCaption">Selected</f:facet> 
     <p:column > 
      <h:outputLabel styleClass="testingas" style="width:100%" value="#{jb.code} - #{jb.description_en}" /> 
     </p:column> 
</p:pickList> 

回答

0

这似乎是我的错误,总是使用数据库。

我找到了另一种解决方案。

转换器可以写成这样:

@Component(value="primefacesPicklistConverter") 
public class PrimefacesPicklistConverter implements Converter { 

     public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) { 
      Object ret = null; 
      if (arg1 instanceof PickList) { 
       Object dualList = ((PickList) arg1).getValue(); 
       DualListModel<?> dl = (DualListModel<?>) dualList; 
       for (Object o : dl.getSource()) { 
        String id = ""; 
        if (o instanceof Jbtit) { 
         id += ((Jbtit) o).getId(); 
        } 
        if (arg2.equals(id)) { 
         ret = o; 
         break; 
        } 
       } 
       if (ret == null) 
        for (Object o : dl.getTarget()) { 
          String id = ""; 
          if (o instanceof Jbtit) { 
           id += ((Jbtit) o).getId(); 
          } 
         if (arg2.equals(id)) { 
          ret = o; 
          break; 
         } 
        } 
      } 
      return ret; 
     } 

     public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) { 
      String str = ""; 
      if (arg2 instanceof Jbtit) { 
       str = "" + ((Jbtit) arg2).getId(); 
      } 
      return str; 
     } 

}

0

这似乎是因为这么慢的 'findById' 为每个1000的执行项目。 也许使用数据库缓存或实现这种情况下的自定义缓存解决方案。

+0

对不起@ gmeiner.m我不能接受你的答案,我用了一个又一个,但我想用CACH对于一些实体是好的理念。 – Darka