やっと、本題に来ました。
いままでStruts2を書いてきたのは、ほかでもない、表題の件を
やりたかったからです。
つまり、Struts2でRESTもできるんだけど
http://struts.apache.org/docs/rest-plugin.html
そこまでやんなくてよくて、AJAXで呼出し、JSONで受けたいというような場合、
どうするかというお話。
具体的な方法は、
http://kamegu.hateblo.jp/entry/struts2/json-result
などに書かれています。
今回は、そこにあるような、ゼロ・コンフィグレーションによる
書き方を行います。
なお、struts.xmlを書く(ゼロ・コンフィグレーションでない書き方)は、
Struts2でレスポンスをjsonにする方法
http://sugiim.hatenablog.com/entry/2013/02/21/190000
にあります。
■概要
セロコンフィグで書く場合
・JSON用プラグインstruts2-json-plugin-2.3.4.jarをダウンロードします。
・ソースのパッケージはXXX.○○○の形へ
・ダウンロードしたjarにパスを通して、
Javaのソースでは
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
する
・ソースに@Resultsアノテーションを書く
@Results({
@Result(name="success", type="json", params={"root", "session"})
})
この場合、返るJSONは、session、つまり、セッションの内容
・@ParentPackage("json-default")を書き、返る値の型をJSONに指定する。
こんなかんじですかね・・・
■お題
hello.actionをnameを指定して呼ぶと
回数やメッセージをJSON形式で返します。
■準備
・JSON用プラグインstruts2-json-pluginをダウンロード&パスを通す
以下のサイトにあるので、適切なバージョンをダウンロード
http://mvnrepository.com/artifact/org.apache.struts/struts2-json-plugin
今回はstruts2-json-plugin-2.3.4.jarをダウンロードしました。
そして、web-inf/libの下に置き、eclipseで開発する場合、プロパティのjavaのビルドパスで、
外部jar追加によって、追加しておきます。
これをダウンロード&設定しないと、Tomcat実行時
9 18, 2015 5:25:17 午後 org.apache.catalina.core.StandardContext filterStart
重大: フィルタ struts2 の起動中の例外です
Unable to load configuration. - [unknown location]
というエラーが出て、サービスが立ち上がらない
・struts.xmlは、いらない(削除してよい)
■ソースstruts2.gui.HelloAction.java
ソースコードは以下の通り
いままでStruts2を書いてきたのは、ほかでもない、表題の件を
やりたかったからです。
つまり、Struts2でRESTもできるんだけど
http://struts.apache.org/docs/rest-plugin.html
そこまでやんなくてよくて、AJAXで呼出し、JSONで受けたいというような場合、
どうするかというお話。
具体的な方法は、
http://kamegu.hateblo.jp/entry/struts2/json-result
などに書かれています。
今回は、そこにあるような、ゼロ・コンフィグレーションによる
書き方を行います。
なお、struts.xmlを書く(ゼロ・コンフィグレーションでない書き方)は、
Struts2でレスポンスをjsonにする方法
http://sugiim.hatenablog.com/entry/2013/02/21/190000
にあります。
■概要
セロコンフィグで書く場合
・JSON用プラグインstruts2-json-plugin-2.3.4.jarをダウンロードします。
・ソースのパッケージはXXX.○○○の形へ
・ダウンロードしたjarにパスを通して、
Javaのソースでは
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
する
・ソースに@Resultsアノテーションを書く
@Results({
@Result(name="success", type="json", params={"root", "session"})
})
この場合、返るJSONは、session、つまり、セッションの内容
・@ParentPackage("json-default")を書き、返る値の型をJSONに指定する。
こんなかんじですかね・・・
■お題
hello.actionをnameを指定して呼ぶと
回数やメッセージをJSON形式で返します。
■準備
・JSON用プラグインstruts2-json-pluginをダウンロード&パスを通す
以下のサイトにあるので、適切なバージョンをダウンロード
http://mvnrepository.com/artifact/org.apache.struts/struts2-json-plugin
今回はstruts2-json-plugin-2.3.4.jarをダウンロードしました。
そして、web-inf/libの下に置き、eclipseで開発する場合、プロパティのjavaのビルドパスで、
外部jar追加によって、追加しておきます。
これをダウンロード&設定しないと、Tomcat実行時
9 18, 2015 5:25:17 午後 org.apache.catalina.core.StandardContext filterStart
重大: フィルタ struts2 の起動中の例外です
Unable to load configuration. - [unknown location]
というエラーが出て、サービスが立ち上がらない
・struts.xmlは、いらない(削除してよい)
■ソースstruts2.gui.HelloAction.java
ソースコードは以下の通り
package struts2.gui; // セッションで使う import java.util.Map; //(1)リクエストで使うものインポート import javax.servlet.http.HttpServletRequest; import org.apache.struts2.convention.annotation.Action; //ゼロコンフィグレーション import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; //ゼロコンフィグレーション import org.apache.struts2.convention.annotation.Results; //ゼロコンフィグレーション import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.SessionAware; // 一般的に・・・ import com.opensymphony.xwork2.ActionSupport; //==============================================// // // // Struts2 // // セッション、リクエストのサンプル // // // //==============================================// @Results({ @Result(name="success", type="json", params={"root", "session"}) }) @ParentPackage("json-default") public class HelloAction extends ActionSupport implements SessionAware,ServletRequestAware{ private String name; // sタグの変数 private String msg; private Map<String,Object> session; // セッションの宣言 private HttpServletRequest request; // (2)リクエストの宣言 // sタグで必要なアクセサ public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } // セッションで必要なアクセサ public void setSession(Map<String,Object> session) { this.session = session; } // (3)リクエストで必要なアクセサ記述 public void setServletRequest(HttpServletRequest request) { this.request = request; } public HttpServletRequest getServletRequest() { return this.request; } @Action("hello") public String execute() { //======================================// // 値の取得 // //======================================// // name取得 setName(getServletRequest().getParameter("name")); // セッションでの取得 int kai; String kaistr = (String)session.get("kaisu"); if ( kaistr == null) { kai = 0; } else { kai = Integer.parseInt(kaistr); } // (4)リクエストパラメタでの取得 String start = getServletRequest().getParameter("start"); if (start != null) { try { kai = Integer.parseInt(start); } catch(Exception e) { // 数字でなかったら、なにもしない } } //======================================// // 処理 // //======================================// kai++; // 今回の分を足す String msg = "Hello World" + name + ":"+ kai+"回目"; //======================================// // 出力 // //======================================// // セッション書き出し session.put("kaisu", String.valueOf(kai)); session.put("msg", msg); this.addActionMessage("成功1"); return SUCCESS; } } |