2013-01-23 29 views
0

(java7,jsf/mojarra v2.1.11,primefaces v3.4.2)如何防止字符串值 - 「null」 - 出現在我的「p:autocomplete」輸入字段之後的一個表單提交

問題

我有與我需要用戶來填充p:autocomplete輸入字段的形式。

它看起來像這樣:

<p:autoComplete 
    id="code" 
    requiredMessage="code value required" 
    converter="acConverter" 
    style="overflow: hidden" 
    maxResults="200" 
    scrollHeight="150" 
    dropdown="false" 
    value="#{testBean.parmMap['code']}" 
    completeMethod="#{testBean.codeListComplete}" 
    var="entry" 
    itemLabel="#{entry.split(':')[1]}" 
    itemValue="#{entry.split(':')[0]}" 
    minQueryLength="1" 
    forceSelection="true"> 
</p:autoComplete> 

在「控制器」豆,我用的是「validate(ComponentSystemEvent e)」的方法來確定該字段是否已被填充。
- 當表單被提交併且用戶沒有選擇一個值時,我使用這種方法創建一個錯誤消息(即FacesMessage)並呈現響應(例如fc.renderResponse())。

在回傳時,p:autocomplete輸入字段以粉紅色突出顯示,這很好。
- 問題是該字段現在包含字符串文字:「null」。

(我想實現一個「轉換器」來解決這個問題,但沒有成功。)

問:

我怎樣才能防止出現在自動完成這個「空」字符串?

(請讓我知道,如果這個問題沒有意義和/或需要進一步的信息)


僅供參考 - 下面是詳細信息,如果您需要它(否則,你可以不理會它)...


的index.xhtml ...

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:c="http://java.sun.com/jsp/jstl/core" 
     xmlns:p="http://primefaces.org/ui"> 
    <f:view contentType="text/html"> 
     <h:head> 
      <title>test autocomplete...</title> 
      <meta charset="utf-8" /> 
     </h:head> 
     <h:body> 
      <h:form id="queryForm"> 

       <f:event type="postValidate" listener="#{testBean.validate}" /> 
       <p:panel id="queryPanel" header="test autocomplete..." style="width:100%;"> 

        <p:autoComplete 
         id="code" 
         requiredMessage="code value required" 
         converter="acConverter" 
         style="overflow: hidden" 
         maxResults="200" 
         scrollHeight="150" 
         dropdown="false" 
         value="#{testBean.parmMap['code']}" 
         completeMethod="#{testBean.codeListComplete}" 
         var="entry" 
         itemLabel="#{entry.split(':')[1]}" 
         itemValue="#{entry.split(':')[0]}" 
         minQueryLength="1" 
         forceSelection="true"> 
        </p:autoComplete> 

        <br/> 
        <br/> 

        <p:commandButton 
         id="submit" 
         value="Submit" 
         type="submit" 
         update="@form" 
         process="@form" 
         action="#{testBean.submitQuery}" 
         style="width:150px;" 
         styleClass="button"/> 

        <p:commandButton 
         value="Reset" 
         update="@form" 
         onclick="location.reload();return true;" 
         process="@this" 
         actionListener="#{testBean.reset}" 
         immediate="true" 
         ajax="false"/> 

       </p:panel> 
      </h:form> 

      <h:outputStylesheet library="styles" name="query.css"  /> 
      <h:outputScript  library="primefaces" name="/jquery/jquery.js" /> 
      <h:outputScript  library="primefaces" name="/jquery/plugins/ui/jquery-ui.custom.js" /> 
      <h:outputScript  library="primefaces" name="/jquery/plugins/inputmask/maskedinput.js" /> 

     </h:body> 
    </f:view> 
</html> 

TestBean.java ...

package aaa.bbb.ccc.war; 

import java.io.Serializable; 
import java.text.ParseException; 
import java.util.ArrayList; 
import java.util.LinkedHashMap; 
import java.util.List; 
import javax.faces.application.FacesMessage; 
import javax.faces.component.UIForm; 
import javax.faces.component.UIInput; 
import javax.faces.context.FacesContext; 
import javax.faces.event.ActionEvent; 
import javax.faces.event.ComponentSystemEvent; 
import org.apache.commons.lang.StringUtils; 
import org.primefaces.context.RequestContext; 
import org.springframework.context.annotation.Scope; 
import org.springframework.stereotype.Component; 

@Component("testBean") 
@Scope("request") 
public class TestBean implements Serializable 
{ 
    public TestBean() 
    { 
     parmMap = this.getParmMap(); 
     FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("parmMap", parmMap); 
    } 

    public void reset(ActionEvent event) 
    { 
     RequestContext.getCurrentInstance().reset("queryForm:queryPanel"); 
     LinkedHashMap<String, Object> m = new LinkedHashMap<String, Object>(); 
     FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("parmMap"); 
     setParmMap(m); 
    } 

    public String submitQuery() 
    { 
     FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("hitlistData"); 

     System.out.println("TestBean_________________________submitQuery()____________________parmMap contains:" + this.getParmMap().toString()); 

     if (this.getParmMap().isEmpty()) 
     { 
      return ""; 
     } 

     return "/page2.xhtml?faces-redirect=true"; 
    } 

    private static LinkedHashMap<String, Object> parmMap; 
    public LinkedHashMap<String, Object> getParmMap() 
    { 
     LinkedHashMap<String, Object> map = (LinkedHashMap<String, Object>) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("parmMap"); 

     if (null == map) 
     { 
      map = new LinkedHashMap<String, Object>(); 
     } 

     return map; 
    } 

    public void setParmMap(LinkedHashMap<String, Object> map) 
    { 
     parmMap = map; 
     FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("parmMap", parmMap); 
    } 

    public void validate(ComponentSystemEvent e) throws ParseException 
    { 
     LinkedHashMap parmMap = this.getParmMap(); 
     UIForm queryForm = (UIForm) e.getComponent(); 
     FacesContext fc = FacesContext.getCurrentInstance(); 

     UIInput code_c = (UIInput) queryForm.findComponent("code"); 
     String code = (String) code_c.getValue(); 

     try 
     { 
      if (StringUtils.isBlank(code)) 
      { 
       code_c.setValid(false); 
       fc.addMessage(code_c.getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, code_c.getRequiredMessage(), code_c.getRequiredMessage())); 
      } 

      if (fc.getMessageList().size() > 0) 
      { 
       fc.renderResponse(); 
      } 
     } 
     catch (Exception e1) 
     { 
      e1.printStackTrace(); 
     } 
    } 

    private static List<String> codeList; 
    public static List<String> getCodeList() 
    { 
     codeList = (List<String>) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("codeList"); 

     if (null == codeList) 
     { 
      codeList = new ArrayList<String>(); 
      codeList.add("keyaaaa:valaaaa"); 
      codeList.add("keybbbb:valbbbb"); 
      codeList.add("keycccc:valcccc"); 
      codeList.add("keydddd:valdddd"); 
      codeList.add("keyeeee:valeeee"); 
      codeList.add("keyffff:valffff"); 
      codeList.add("keygggg:valgggg"); 
      codeList.add("keyhhhh:valhhhh"); 
      FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("codeList", codeList); 
     } 

     return codeList; 
    } 

    public void setCodeList(List<String> list) 
    { 
     codeList = list; 
    } 

    public static List<String> codeListComplete(String s)  //autocomplete "completeMethod"... 
    { 
     List<String> list = getCodeList(); 
     List<String> suggestions = new ArrayList<String>(); 
     for (String ss : list) 
     { 
      if (ss.toLowerCase().contains(s.toLowerCase())) 
      { 
       suggestions.add(ss); 
      } 
     } 

     return suggestions; 
    } 

} 

ACConverter.java ...(我在不成功的企圖刪除字符串值 「空」 創造了這個)

package aaa.bbb.ccc.war; 

import javax.faces.application.FacesMessage; 
import javax.faces.component.UIComponent; 
import javax.faces.component.UIInput; 
import javax.faces.context.FacesContext; 
import javax.faces.convert.Converter; 
import javax.faces.convert.ConverterException; 
import javax.faces.convert.FacesConverter; 
import org.apache.commons.lang.StringUtils; 

@FacesConverter("acConverter") 
public class ACConverter implements Converter 
{ 
    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) 
    { 
     try 
     { 
      if (StringUtils.isBlank(value) || String.valueOf(value).equalsIgnoreCase("null")) 
      { 
       return ""; 
      } 
     } 
     catch (Exception e) 
     { 
      UIInput input = (UIInput) component; 
      FacesMessage msg = new FacesMessage(input.getConverterMessage(),input.getConverterMessage()); 
      msg.setSeverity(FacesMessage.SEVERITY_ERROR); 
      throw new ConverterException(msg); 
     } 

     return value; 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) 
    { 
     return (null==value?"":String.valueOf(value)); 
    } 
} 
+0

你可以使用空格填充它,如果它不驗證? – Floris

+0

嗨弗洛里斯 - 我不知道該怎麼做。我嘗試使用轉換器,但沒有效果(也許,我錯了)。你會如何做到這一點?謝謝 – sairn

回答

2

謝謝Floris的想法。我想我必須通過一個「轉換器」來實現這一點,但是,這並不奏效。

但是,在對UIInput組件上可用的方法進行了一些實驗之後,我發現我可以使用setSubmittedValue方法將該字段的值設置爲空白。這似乎工作。

即,

code_c.setSubmittedValue(""); 
code_c.setValid(false); 
fc.addMessage(code_c.getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, code_c.getRequiredMessage(), code_c.getRequiredMessage())); 

請讓我知道這是否是一個不明智的解決方案。

再次感謝

小號

+0

+1正確回答你自己的問題! – Floris

相關問題