Primefaces具有大数据集的Picklist

时间:2013-10-17 12:07:53

标签: java jsf-2 primefaces

我创建了PickList是我的网站,但它很有效但很慢。 我有大约1000个项目,每次我点击提交它进入转换器并做1000次。即使没有选择。

也许我可以跳过转换器或只接受目标项目(在互联网上找不到示例)或只返回一些文本(因为这可能只是代码)或其他错觉?

我正在使用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>

2 个答案:

答案 0 :(得分:0)

由于为1000个项目中的每个项目执行了'findById',它似乎太慢了。 也许使用数据库缓存或为这种情况实现自定义缓存解决方案。

答案 1 :(得分:0)

使用always数据库似乎是我的错误。

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

转换器可以像这样重写:

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

}