事象 : FacesMessageをコンテンツに設定したのにメッセージが表示されない
- 環境
- CentOS Linux release 7.8.2003 (Core)
- Eclipse IDE for Enterprise Java Developers.Version: 2020-03 (4.15.0)
- openjdk version "11.0.7" 2020-04-14 LTS
- JSF 2.3.9
ajaxでメソッドを実行して
<h:form id="formId">
<div id="uploadArea">
<!--...省略...-->
<f:ajax event="change" execute="uploadArea" render="uploadArea" listener="#{uploadBean.uploadFile}" />
<!--...省略...-->
<div>
<h:message for="uploadArea" errorClass="error" warnClass="warn" infoClass="info" />
</div>
</div>
</h:form>
メソッドでメッセージをコンテンツに設定したのに表示されない
public void uploadFile(AjaxBehaviorEvent event) throws IOException {
if (!isUpload()) {
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "", "ファイルが選択されなかったよ。");
event.getFacesContext().addMessage("uploadArea", message);
//...省略...
出力されたHTML
<form id="formId" name="formId" method="post" action="/tryJsf/base.jsf" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="formId" value="formId">
<div id="uploadArea">
<!--...省略...-->
<input id="formId:file" type="text" name="formId:file" style="display:none;" onchange="mojarra.ab(this,event,'change','uploadArea','uploadArea')">
<div>
</div>
</div>
<input type="hidden" name="javax.faces.ViewState" id="j_id1:javax.faces.ViewState:0" value="-7689768516583343150:2206148480801750608" autocomplete="off">
</form>
原因 : 不明(誰か教えてください。)
どうもf:ajax
のメソッドが実行された後に再表示されていないもよう。
render="uploadArea"
が・・・無視られた?HTMLのタグはダメ?JSFのタグじゃなきゃダメ?
JSFのタグで書かないものはコンポーネントではない?
The clientIds of components that will participate in the "render" portion of the Request Processing Lifecycle.
ajax(JSF 2.2 View Declaration Language: Facelets Variant)
対応方法 : divタグをh:panelGroupに変える
ajaxでメソッドを実行して
<h:form id="formId">
<h:panelGroup id="uploadArea">
<!--...省略...JSFのタグにしたので指定するid属性にする..-->
<f:ajax event="change" execute="formId:uploadArea" render="formId:uploadArea" listener="#{uploadBean.uploadFile}" />
<!--...省略...-->
<div>
<h:message for="formId:uploadArea" errorClass="error" warnClass="warn" infoClass="info" />
</div>
</div>
</h:form>
メソッドでメッセージをコンテンツに設定したら表示された
public void uploadFile(AjaxBehaviorEvent event) throws IOException {
//...省略...対応前と同じ...指定するid属性だけ変える...
event.getFacesContext().addMessage("formId:uploadArea", message);
//...省略...対応前と同じ...