4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PrimeFacesのAjaxでcallbackにサーバの処理結果を渡す

Last updated at Posted at 2015-06-03

まぁ、上のStackoverflowにすべてが書かれてるんですけど。
元記事からサンプルをちょろっと修正して抜粋してます。

HomeController.java
public String myMethod() {
    RequestContext context = RequestContext.getCurrentInstance();  
    context.addCallbackParam("firstParam", "my string");
    return "";
}
AjaxTest.xhtml
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を渡そうとしたら上手く値が取れなかったんですよね。

HomeController.java
public String myMethod() {
    List<String> resultList = new ArrayList<>();
    resultList.add("result1");
    resultList.add("result2");
    RequestContext context = RequestContext.getCurrentInstance();  
    context.addCallbackParam("firstParam", resultList);
    return "";
}
AjaxTest.xhtml
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でラップして渡してやらないとダメらしいのです。
つまりこんな感じで

HomeController.java
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 "";
}
AjaxTest.xhtml
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>

と、ここまで書きましたけど上記は自分で色々試した結果、これでイケたっていう内容なので正しい書き方なのかはイマイチ自信ないです…(正しい書き方知ってる人がいたら教えて下さい…)

というわけでハマったメモでした。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?