それがクライアントとしてHTTP+JSONインターフェイスプロジェクトであり、JSPやその他のビュービューがない場合、Jerseryフレームワークを使用することは間違いなく最初の選択です。 Spring3 MVCベースのアーキテクチャの下では、HTTP+JSONのリターンタイプも非常に協力的です。ただし、開発作業では、機能のアップグレードが確立されたアーキテクチャに基づいていることが非常に一般的です。確立されたフレームワーク構造に基づいたStruts2に基づいて、HTTP+JSONリターンタイプインターフェイスを使用する必要があることに遭遇しました。
struts2:1でJSONを返す方法は2つあります。サーブレットの出力ストリームを使用して、JSON文字列を書きます。 2。Struts2を使用してJSONを拡張します。
1.サーブレット出力ストリームを使用します
JSONインターフェイスの本質は、JSONデータを渡すプロセス中に、実際にはJSON構文形式に準拠する通常の文字列を渡すだけです。いわゆる「JSONオブジェクト」とは、このJSON文字列を解析してラップした結果を指します。
したがって、ここでは、json構文形式の文字列をサーブレットのhttpservletresponseに書き込むだけです。ここでは、PrintWriterメソッドを使用します。もちろん、Stream Streamメソッドも使用できます。 getWriterを呼び出す前にエンコードが設定されていないことに注意する必要があります(setcontentTypeまたはsetCharacterencodingメソッドと呼ばれるか、エンコードを設定します)、httpservletResponseは、デフォルトのエンコード(ISO-8859-1のいずれか)でエンコードされたプリントライターインスタンスを返します。これは文字化けされた中国人を引き起こします。さらに、エンコードを設定する場合、GetWriterを呼び出す前に設定する必要があります。それ以外の場合は無効になります。
インターフェイスコードを書き込む:
ここでの方法と一般的なStruts2メソッドの違いは、これが無効なリターンタイプであることです。
public void write()throws ioexception {httpservletResponse response = servletactionContext.getResponse(); / * *エンコードは、GetWriterを呼び出す前に設定されていません(SetContentTypeまたはSetCharacterenCodingメソッドと呼ばれるかどうか)、 * HTTPSERVLETRESPONSEは、デフォルトのエンコード(ISO-8859-1)でエンコードされたプリントライターインスタンスを返します。これは文字化けされた中国人を引き起こします。さらに、エンコードを設定する場合、GetWriterを呼び出す前に設定する必要があります。それ以外の場合は無効になります。 * */ respons.setContentType( "text/ html; charset = utf-8"); //response.setcharacterencoding("utf-8 "); printwriter out = response.getWriter(); // JSONは、配信プロセス中に通常の文字列の形で渡されます。文字列jsonstring = "{/" user/":{/" id/":/" 123/"、/" name/":/" zhang san/"、" say/":/" hello、hello、i a json! out.println(jsonstring); out.flush(); out.close(); }構成アクション
次の構成から、構成は通常のアクション構成と違いはないが、返品ビューはないことが明確にわかります。
<アクションname = "write" method = "write" />
返品値
{"user":{"id": "123"、 "name": "zhang san"、 "say": "こんにちは、私はjson!"、 "password": "json"}、 "success":true}2。struts2を使用したJSONの拡張
この拡張機能を使用するには、間違いなくサポートパッケージを追加する必要があります。私のデバッグの後、ここに2つのオプションがあります。
1.xwork-core-2.1.6.jarおよびstruts2-json-plugin-2.1.8.jar。 Struts2-JSON-Plugin-2.1.8.jarを使用する場合、Xwork-Core-*。Jarは2.2.1以降を選択できません。 Tomcatを起動すると、Java.lang.noclassdeffounderror:org.apache.commons.lang.xwork.stringutilsが表示されます。
2.xwork-2.1.2.jarおよびjsonplugin-0.34.jar。 jsonplugin-0.34.jarを使用してサポートする場合は、xwork-core-*。jarをxwork-2.1.2.jarに切り替える必要があります。 jsonplugin-0.34.jarにはcom.opensymphony.xwork2.util.textutilsのサポートが必要です。 Xwork-Core-*。JARの2.2.1以降のバージョンが見つかりましたが、Xwork-Core-2.1.6.jarにはそのようなクラスはありません。
最後に、元の建設方法のために本当に価値がないと言いたいです。私は本当に疲れています。 Mavenなどの自動化されたコンポーネントを使用すると、プライベートパーツ間のバージョンの違いに依存するバグを大幅に回避できます。 Mavenのコンポーネント方法は、3番目のセクションの「Struts2ゼロ構成」で使用されます。
インターフェイスコードの書き込み
このクラスでは、JSON()メソッドは通常のStruts2メソッドです。 JSON形式の文字列はここにありません。なぜなら、この作業を拡張機能に任せているからです。設定がなければ、クラスの下のすべてのゲッターメソッドの返品値は、クライアントに返されるJSON文字列に含まれます。含める必要のない属性を排除するには、クラス構造での注釈のためのゲッターメソッドで@JSON(Serialize = false)を使用する必要があります。もちろん、他のビジネスに影響を与えない場合、このGetterメソッドを直接削除することもできます。したがって、この例の返された結果は、DataMapオブジェクトを変換するJSON形式の文字列です。
パッケージJSON; java.util.hashmapをインポートします。 java.util.mapをインポートします。 org.apache.struts2.json.annotations.jsonをインポートします。 com.opensymphony.xwork2.actionsupportをインポートします。 / ** * JSON TEST * * @Author Watson XU * @Date 2012-8-4 06:21:01 PM */ public class jsonaction extends ActionSupport {private static final long serialversionuid = 1l;プライベートマップ<文字列、オブジェクト>データマップ;プライベート文字列key = "See See See"; public string json(){//データマップのデータは、struts2によってjson文字列に変換されるため、最初にデータをクリアする必要があります。 dataMap = new Hashmap <string、object>(); user user = new user(); user.setName( "Zhang San"); user.setPassWord( "123"); datamap.put( "user"、user); //操作が成功しているかどうかをタグに入れます。datamap.put( "success"、true); //結果を返しますreturn success; } public Map <string、object> getDatamap(){return datamap; } // jsonのコンテンツ@json(serialize = false)public string getKey(){return key; }}Acitonを構成します
構成では、最初に、アクションが配置されているパッケージがJSON-Defaultを継承する必要があります。これにより、JSONへのアクションのリターンタイプが構成され、シリアル化されたプロパティやその他のクラスパラメーターを構成できます。
<?xml version = "1.0" encoding = "utf-8"?> <!doctype struts public " - // apacheソフトウェア財団// dtd struts configuration 2.0 // en" "http://struts.apache.org/dtds/struts-2.0.dtd" extends = "struts-default、json-default"> <action name = "json" method = "json"> <result type = "json"> <! - ここでは、struts2によってシリアル化される属性を指定します。この属性には、アクションに対応するゲッターメソッドが必要です - > <param name = "root"> datamap </param> </result> </action> </package> </struts>
返品値
{"success":true、 "user":{"name": "zhang san"、 "password": "123"}}3. Mavenコンポーネントを使用して、struts2ゼロ構成の使用方法:
3.1)WebAppを構築するために、Mavenを使用してそれを構築します。建設プロセスとは、Limingnihaoのブログを指します。Eclipseを使用して、MavenのSpringMVCプロジェクトを構築します。
3.2)struts2依存関係、struts2ゼロ構成依存関係、struts2 json依存関係を追加します。
<依存関係> <! - struts2コア依存関係 - > <依存関係> <groupid> org.apache.structs </groupid> <artifactid> structs2-core </artifactid> <バージョン> 2.3.4 </バージョン> <タイプ> jar </type> <scope> compile </scope> <groupid> org.apache.structs </groupid> <artifactid> structs2-convention-plugin </artifactid> <version> 2.3.4 </version> <type> jar </type> <scope> compile </scope> </depluanty> <! - struts2's json- <artifactid> struts2-json-plugin </artifactid> <bersion> 2.3.4 </version> <type> jar </type> <scope>コンパイル</scope> </dependency> </dependencies>
テスト後、上記の依存室にバージョン互換のバグはありません。これらは同じバージョンであるだけでなく、Mavenの自動構築方法のためにもあります。
3.3)web.xmlを構成し、struts2を有効にします:
<?xml version = "1.0" encoding = "utf-8"?> <web-appバージョン= "2.5" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instcance" xsi:schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <フィルター> <フィルター> <フィルター> <フィルター名> strutspareandecutefilter </filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilter </filter-class> <init-param> <param-name> config </param-name> <param-value> struts-default.xml、struts-plugin.xml、</sruts.xml> </filter> <フィルターマッピング> <filter-name> strutsprepareandexecutefilter </filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
3.4)struts.xmlを構成し、いくつかの基本的な定数とアプリケーションを設定します。
<?xml version = "1.0" encoding = "utf-8"?> <!doctype struts public " - // apacheソフトウェア財団// dtd struts configuration 2.0 // en" "http://struts.apache.org/dtds/struts-2.0.dtd" extends = "json-default、struts-default"> <! - ここでは、いくつかのグローバルリターン値マッピング関係などを設定できます。-> < /package> <constant name = "struts.extension" value = "" /> <constant name = "struts.ui.theme" value = "simple" /> <constant name = " name = "struts.multipart.maxsize" value = "1073741824"/> <constant name = "struts.devmode" value = "false"/> </struts>
3.5)アクションを書き込み、構成します。コンベンションが指定されていないため、コンベンションプラグインでは、アクションとしてアクションとして終了するクラス名ですべてのJavaクラスを扱います。
パッケージwatson.action; java.util.hashmapをインポートします。 java.util.mapをインポートします。 org.apache.struts2.convention.annotation.actionをインポートします。 org.apache.struts2.convention.annotation.namespaceをインポートします。 org.apache.struts2.convention.annotation.namespaceをインポートします。 org.apache.struts2.convention.annotation.parentPackageをインポートします。 org.apache.struts2.convention.annotation.result; org.apache.struts2.convention.annotation.resultsをインポートします。 @ParentPackage( "base")@namespace( "/watson")@results({ @result(name = "json"、type = "json"、params = {"root"、 "msg"})})public class jsonaction { @action(value = "json")public string json(){msg = new hashmap < msg.put( "flag"、 "success"); map <string、string> user = new hashmap <string、string>(); user.put( "name"、 "Zhang San"); user.put( "age"、 "34"); msg.put( "user"、user); 「json」を返します。 } // ================================================================================================================================== public Map <string、object> getmsg(){return msg; }} 3.6)プロジェクトを展開し、コンテナを起動し、http:// localhost:7070/struts2foo/watson/jsonをブラウザアドレスバーに入力します。結果が次のようになるまで待ちます:
{"flag": "success"、 "user":{"age": "34"、 "name": "Zhang San"}}上記の結果から、ゼロ構成が有効になった後、XMLの構成が欠落し、代わりに各アクションで注釈が付けられていることがわかります。ここでは、上記の構成をXMLで削除し、上記のJSONACTIONの上部に次のコードを書き込みます。
@ParentPackage( "base")@namespace( "/watson")@results({ @result(name = "json"、type = "json"、params = {"root"、 "msg"})})ルートは、XML構成のパラメーター構成と同等です。
4。添付ファイル:
アクションの返されたタイプがJSONである場合の構成可能なパラメーターの詳細な説明:
<result type = "json"> <! - ここで、struts2によってシリアル化されるプロパティを指定します。このプロパティには、アクションに対応するゲッターメソッドが必要です - > <! - デフォルトでは、メソッドに対応するプロパティがあるかどうかにかかわらず、返品値を持つすべてのゲッターメソッドの値がシーケンスされます - > <param name = "root"> datamap </param> <! - 空のプロパティをシリアル化するかどうか - > <param name = "exprodenullporties" - > <param name = "includeProperties"> userlist。*</param> <! - ここで、データマップから除外されるプロパティを指定します。これらの除外されたプロパティはシリアル化されず、通常、上記のパラメーター構成と同時に表示されません - > <param name = "excludeproperties"> success </param> </result>
添付ファイルのダウンロード
strutsjson.rar
struts2foo.rar
上記は、JSONオブジェクトを返すStruts2のコンテンツ全体です。私はそれがあなたに参照を与えることができることを願っています、そしてあなたがwulin.comをもっとサポートできることを願っています。