私はJSFで次のスイッチを達成する方法を探しています:h:メッセージが空の場合のデフォルト出力
...
<div>
if empty(<h:message for="x">)
<h:outputText value="default value" />
else
<h:message for="x" />
endif
</div>
....
任意のアイデア?
私はJSFで次のスイッチを達成する方法を探しています:h:メッセージが空の場合のデフォルト出力
...
<div>
if empty(<h:message for="x">)
<h:outputText value="default value" />
else
<h:message for="x" />
endif
</div>
....
任意のアイデア?
これはPhaseListener
の助けを借りて行うことができます。
ビューは、衝撃的ではないように見えますが、blur
イベントをフックするすべての入力コンポーネントには<f:ajax>
があり、入力フィールドがフォーカスを失ったときにすぐにメッセージコンポーネントを再描画します。
<!DOCTYPE html>
<html lang="en"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<title>Stackoverflow question 4313917</title>
<style>.info { color: green; } .error { color: red; }</style>
</h:head>
<h:body>
<h:form>
<h:panelGrid columns="3">
<h:outputLabel for="input1">Input 1</h:outputLabel>
<h:inputText id="input1" value="#{bean.input1}" required="true">
<f:ajax event="blur" render="input1message" />
</h:inputText>
<h:message id="input1message" for="input1" infoClass="info" errorClass="error" />
<h:outputLabel for="input2">Input 2</h:outputLabel>
<h:inputText id="input2" value="#{bean.input2}" required="true">
<f:ajax event="blur" render="input2message" />
</h:inputText>
<h:message id="input2message" for="input2" infoClass="info" errorClass="error" />
<h:outputLabel for="input3">Input 3</h:outputLabel>
<h:inputText id="input3" value="#{bean.input3}" required="true">
<f:ajax event="blur" render="input3message" />
</h:inputText>
<h:message id="input3message" for="input3" infoClass="info" errorClass="error" />
<h:panelGroup />
<h:commandButton value="Submit" action="#{bean.submit}" />
<h:panelGroup />
</h:panelGrid>
</h:form>
</h:body>
</html>
豆は、それ自体のために話す:3つのプロパティinput1
、input2
とinput3
とvoid submit()
方法。あなたのIDEがボイラープレートを自動生成するようにしてください。ここで
はPhaseListener
です:
package com.example;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
public class MessagePhaseListener implements PhaseListener {
@Override
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
@Override
public void beforePhase(PhaseEvent event) {
FacesContext facesContext = event.getFacesContext();
if (facesContext.isPostback()) {
UIViewRoot viewRoot = facesContext.getViewRoot();
for (String clientId : facesContext.getExternalContext().getRequestParameterMap().keySet()) {
UIComponent component = viewRoot.findComponent(clientId);
if (component instanceof UIInput && !facesContext.getMessages(clientId).hasNext()) {
facesContext.addMessage(clientId, new FacesMessage(FacesMessage.SEVERITY_INFO, "OK!", null));
}
}
}
}
@Override
public void afterPhase(PhaseEvent event) {
// NOOP. It's too late anyway.
}
}
faces-config.xml
に次のように(いや、残念ながら、phaselistenersにはJSF 2.0注釈が存在しない)、それを登録します。
"OK!" phaselistenerのメッセージ。
このphaseListenerを特定のページに適用する方法を指定しますか? –
HttpServletRequestリクエスト=(HttpServletRequest)phaseEvent.getFacesContext()。getExternalContext()。getRequest(); request.getRequestURI()。startWithまたは.endsWidthまたは.equals –
これは、特定の 'h:message'ではなく' h:messages'でのみ可能です。あなたはそれを必要としていると確信していますか?何を見せたいですか?機能要件は何ですか?多分もっと良い方法があるかもしれません。 – BalusC
私は入力フィールドの内容に基づいて検証メッセージを(再)提示したいと思います。テキストフィールドの内容が有効であると見なされた場合(ぼかしイベントの後)、 "OK"のようなメッセージが表示されます。コンテンツが無効である場合、検証エラーが表示されます。 – perdian
私はあなたが意味するものを得ます。しかし、JSFはそのための標準的な機能をサポートしていません。それはかなり複雑になるかもしれません。ところで、自分以外の投稿のコメント返信について他人に知らせるためには、@ニックネームを使用してください。 [this post](http://meta.stackexchange.com/questions/43019/how-do-comment-replies-work)も参照してください。 – BalusC