メンチカツには醤油でしょ!!

AWS/Java/Node.js/Spreadsheets/Docker/Jenkins/コミュニティ・勉強会レポを主とした技術系ブログ

JSFのcommandLink動かん [WebSphere 8.5 (MyFaces) JSF 2.0]

Java EE 6 / JSF 2.0 で。
(追記:どうやらJSFの実装がMyFacesだとこの現象が出るようですね。
 Mojarra(Wildfly)では出ませんでした。id:kikutaro777さんありがとうございます!

JSFjQueryな時って、レンダリングさたhtmlは

<form id="j_id425786386_6463da65" ~~>
<input id="j_id425786386_6463da65:userName" ~~>


みたいにformIdとidが:(コロン)で句切られてレンダリングされるんで
jQueryセレクタだとエスケープしなくちゃでちょっと面倒。

そこで、よくある解決策の1つにweb.xml

    <context-param>
        <param-name>javax.faces.SEPARATOR_CHAR</param-name>
        <param-value>-</param-value>
    </context-param>


を書くってやつです。
h:formにprependId="false"を指定したりもしますよね。
問題はその後。

画面の開発ですとだいたいテンプレ化されているので

<ui:insert name="nav">
    <ui:include src="~~~" />
</ui:insert>
<main>
    <h:form id="main-form">
        <ui:insert name="~~~" />
    </h:form>
</main>


みたいな感じになってるかとは思います。
メインのコンテンツだけh:formで囲うって感じですね。

一方navではグローバルに遷移できるメニューを表示しますが
ここでログアウト(処理)など、ただのリンクではなく
actionを伴う処理を書きたい場合はこうしているかと思います。

<li><h:form><h:commandLink action="#{logoutAction.doLogout}" value="ログアウト" /></h:form></li>


commandLink生成のためにformで囲いますね。

この場合にどうもactionが呼ばれないという事態にアタリまして
・h:commandButton ならaction呼ばれる
・SEPARATOR_CHARを指定しない場合なら呼ばれる
ということでこれはどうもJSFの挙動がアヤシイなってことで
web.xmlのSEPARATOR_CHARの指定をやめて、
formでは

<h:form id="main_form" prependId="false">


と生成することにしましたとさ。

 

環境
Rational Application Developer 8.5.5 / WebSphere 8.5.0.1 / Java EE 6

 

JSFが生成するidあれこれについてはid:kikutaro777さんのこちらの記事もどうぞ!

 

単にcommandLink/commandButtonとかajaxが動かんって人は
BalusC先生が回答しているStackOverflowも参照してみて下さい。