まぁ、上のStackoverflowにすべてが書かれてるんですけど。
元記事からサンプルをちょろっと修正して抜粋してます。
public String myMethod() {
RequestContext context = RequestContext.getCurrentInstance();
context.addCallbackParam("firstParam", "my string");
return "";
}
function handleComplete(args){
alert(args.firstParam);
}
<p:commandButton id="buttonId"
value="press me" actionListener="#{homeController.myMethod()}"
process="@this"
oncomplete="handleComplete(args)">
</p:commandButton>
まずactionListenerにサーバ側で行いたい処理のメソッドを指定します。
そしてcallback関数をoncompleteで指定します。その際にoncompleteで指定するcallback関数の引数にargsを指定してやれば、サーバ側(HomeController.java)で設定しているfirstParamがJavaScript側で使用できます。
ちなみにここのサンプルでは書いてないですけど、元記事に書かれているようにcallback関数の引数にxhrとstatusを記述すると、それぞれXmlHttpRequestのオブジェクトと処理結果のステータスが使えます。
で、元記事で書かれてるのはここまでなんですけど、Listを渡そうとしたら上手く値が取れなかったんですよね。
public String myMethod() {
List<String> resultList = new ArrayList<>();
resultList.add("result1");
resultList.add("result2");
RequestContext context = RequestContext.getCurrentInstance();
context.addCallbackParam("firstParam", resultList);
return "";
}
function handleComplete(args){
alert(args.firstParam[0]); // undefinedになる
}
<p:commandButton id="buttonId"
value="press me" actionListener="#{homeController.myMethod()}"
process="@this"
oncomplete="handleComplete(args)">
</p:commandButton>
どうやらList的なものを渡す場合はJSONObjectでラップして渡してやらないとダメらしいのです。
つまりこんな感じで
public String myMethod() {
List<String> resultList = new ArrayList<>();
resultList.add("result1");
resultList.add("result2");
JSONObject json = new JSONObject();
json.put("list", resultList);
RequestContext context = RequestContext.getCurrentInstance();
context.addCallbackParam("firstParam", json);
return "";
}
function handleComplete(args){
alert(args.firstParam.list[0]); // OK
}
<p:commandButton id="buttonId"
value="press me" actionListener="#{homeController.myMethod()}"
process="@this"
oncomplete="handleComplete(args)">
</p:commandButton>
と、ここまで書きましたけど上記は自分で色々試した結果、これでイケたっていう内容なので正しい書き方なのかはイマイチ自信ないです…(正しい書き方知ってる人がいたら教えて下さい…)
というわけでハマったメモでした。