0

(java7、jsf / mojarra v2.1.11、primefaces v3.4.2)

問題

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>   

「コントローラー」Beanでは、「validate(ComponentSystemEvent e)」メソッドを使用して、フィールドにデータが入力されているかどうかを判別します。
-フォームが送信され、ユーザーが値を選択していない場合、このメソッドを使用してエラーメッセージ(FacesMessageなど)を作成し、応答をレンダリングします(例:)fc.renderResponse()

ポストバック時に、p:autocomplete入力フィールドはピンクで強調表示されます。これは良いことです。
--問題は、フィールドに文字列リテラル「null」が含まれるようになったことです。

(この問題に対処するために「コンバーター」を実装しようとしましたが、失敗しました。)

質問:

この「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(文字列値 "null"を削除しようとして失敗したためにこれを作成しました)...

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

1 に答える 1

2

フローリス、あなたのアイデアをありがとう。これは「コンバーター」で実装する必要があると思いましたが、うまくいきませんでした。

ただし、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()));

これが不適切な解決策であるかどうかをお知らせください。

再度、感謝します

s

于 2013-01-23T16:49:43.113 に答える