我创建了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>
答案 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;
}
}