web-dev-qa-db-ja.com

JSFバッキングBeanから特定のコンポーネントにメッセージを追加する方法

H:inputTextとそれに接続されたh:messageがあります。

<h:inputText id="myText" value="#{myController.myText}" />
<a4j:outputPanel>
    <h:message for="myText" .../>
</a4j:outputPanel>

次のような方法で、Javaからそれにメッセージを送信したいと思います。

FacesContext.getCurrentInstance().addMessage(arg0, arg1);

これはh:messagesに送信されますが、特定の形式の特定のIDに送信されます。これどうやってするの? (検証Beanまたは検証メソッドを実装しない場合-検証例外をスローしないことを意味します)。

19
Benchik

いわゆるclient idUIComponentにあります。

以下は、これを使用する簡単な例です。

次のBeanについて考えてみます。

@ManagedBean
@RequestScoped
public class ComponentMsgBean {

    private UIComponent component;

    public UIComponent getComponent() {
        return component;
    }

    public void setComponent(UIComponent component) {
        this.component = component;
    }

    public String doAction() {

        FacesContext context = FacesContext.getCurrentInstance();

        context.addMessage(component.getClientId(), new FacesMessage("Test msg"));

        return "";
    }

}

次のFaceletで使用されています:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://Java.Sun.com/jsf/html"
    xmlns:f="http://Java.Sun.com/jsf/core"
    xmlns:ui="http://Java.Sun.com/jsf/facelets" 
    >

    <h:body>

        <h:form>
            <h:outputText id="test" value="test component" binding="#{componentMsgBean.component}"/>
            <h:message for="test"/>

            <h:commandButton value="click me" action="#{componentMsgBean.doAction}" />
        </h:form>

    </h:body>
</html>

これにより、例で使用されているoutputTextコンポーネントのコンテンツ「Test msg」を含むFacesメッセージが追加されます。

32
Arjan Tijms

これを行う別の方法は、「form1」のようにフォームにIDを指定し、メッセージを追加するときにclientIdが「form1:test」になることです。

7
user2166787