Wenn es sich um ein HTTP+JSON -Schnittstellenprojekt als Client handelt und es keine JSP- und andere Ansichtsansichten gibt, ist die Verwendung des Jersery -Frameworks definitiv die erste Wahl. Unter der Spring3 MVC-basierte Architektur ist auch der Rückgabetyp von HTTP+JSON sehr unterstützend. In der Entwicklungsarbeit ist es jedoch sehr häufig, dass die Aufrüstung der Funktionen auf der etablierten Architektur basiert. Ich habe die Notwendigkeit der Verwendung der HTTP+JSON -Rückgabetyp -Schnittstelle basierend auf Struts2 verwendet, die auf der festgelegten Framework -Struktur basiert.
Es gibt zwei Möglichkeiten, JSON in Struts2: 1 zurückzugeben. Verwenden Sie den Ausgangsstrom von Servlet, um die JSON -String zu schreiben. 2. Verwenden Sie Struts2, um JSON zu erweitern.
1. Verwenden Sie den Servlet -Ausgangsstrom
Die Essenz der JSON -Schnittstelle lautet: Während des Vorgangs des Übergebenes von JSON -Daten besteht tatsächlich nur eine gewöhnliche Zeichenfolge, die dem JSON -Syntaxformat entspricht. Das sogenannte "JSON-Objekt" bezieht sich auf das Ergebnis des Parsens und Wickelns dieser JSON-Zeichenfolge.
Hier müssen Sie also nur eine Zeichenfolge im JSON -Syntaxformat in das HTTPServletResponse des Servlets schreiben. Hier verwenden Sie die Printwriter -Methode und können natürlich auch die Stream -Stream -Methode verwenden. Es ist zu beachten, dass die Codierung nicht vor dem Aufrufen von GetWriter festgelegt ist (entweder setContentType- oder setCharactercoding-Methode zur Festlegung der Codierung). Dies wird verstümmelte Chinesen verursachen. Darüber hinaus muss es beim Einstellen der Codierung vor dem Aufrufen von GetWriter festgelegt werden, da es sonst ungültig ist.
Schnittstellencode schreiben:
Der Unterschied zwischen der Methode hier und der allgemeinen Struts2 -Methode besteht darin, dass dies der Hohlraum -Rückgabetyp ist.
public void write () löscht ioException {httpServletResponse response = servletActionContext.getResponse (); / * * Codierung wird nicht vor dem Aufrufen von getWriter festgelegt (entweder setContentType- oder setCharactercoding-Methode zum Setzen). Dies wird verstümmelte Chinesen verursachen. Darüber hinaus muss es beim Einstellen der Codierung vor dem Aufrufen von GetWriter festgelegt werden, da es sonst ungültig ist. * */ response.setContentType ("text/ html; charSet = utf-8"); //response.setcharactercoding("UTF-8 "); Printwriter out = response.getWriter (); // JSON wird während des Lieferprozesses in Form einer normalen Zeichenfolge übergeben. Hier ist ein einfaches Spleißen von einem zum Testen von String jSonstring = "{/" user/": {/" id/":/" 123/",/" name/":/" zhang san/",/" Say/":/" Hallo, ich bin eine Aktion, um ein JSON!/"Passwort/":/"Json/"}/"Erfolg/": ":": ":" Json/"}/": ":" out.println (jSonstring); out.flush (); out.close (); }Konfigurationsaktion
Aus der folgenden Konfiguration ist deutlich zu erkennen, dass sich die Konfiguration nicht von der Normalaktionskonfiguration unterscheidet, aber es gibt keine Rückkehransicht.
<action name = "write" methode = "write" />
Rückgabewert
{"Benutzer": {"ID": "123", "Name": "Zhang San", "Say": "Hallo, ich bin eine Aktion, um einen JSON zu drucken!", "Passwort": "JSON"}, "Erfolg": True}2. Erweiterung von JSON mit Struts2
Um diese Erweiterung zu verwenden, müssen Sie auf jeden Fall ein Support -Paket hinzufügen. Nach meinem Debuggen finden Sie hier zwei Optionen:
1.xwork-core-2.1.6.jar und Struts2-Json-Plugin-2.1.8.Jar. Wenn Sie Struts2-Json-Plugin-2.1.8.jar verwenden möchten, kann Ihr Xwork-Core-*. Jar kann 2.2.1 und über den Versionen nicht wählen, da die 2.2.1 und über Versionen von Xwork-Core-*. JAR keine Pakete wie org.apache.commons.lang verfügen. Beim Starten von Tomcat wird es angezeigt: java.lang.noclassDeffoundError: org.apache.commons.lang.xwork.Stringutils.
2.xwork-2.1.2.jar und jsonplugin-0.34.jar. Wenn Sie Jsonplugin-0.34.jar verwenden möchten, müssen Sie Ihr Xwork-Core-*. Jar auf xwork-2.1.2.jar umstellen. Weil Jsonplugin-0.34.jar Unterstützung für com.opensymphony.xwork2.util.textutils erfordert. Die 2.2.1 und über Versionen von Xwork-Core-*. Jar werden gefunden, und es gibt keine solche Klasse in Xwork-Core-2.1.6.jar.
Schließlich möchte ich sagen, dass es sich aufgrund der ursprünglichen Baumethode wirklich nicht lohnt. Ich bin wirklich müde. Die Verwendung automatisierter Komponenten wie Maven vermeidet weitgehend Fehler, die sich auf Versionsunterschiede zwischen den privaten Teilen verlassen. Die Komponentenmethode von Maven wird im dritten Abschnitt in der "Struts2 -Nullkonfiguration" verwendet.
Schnittstellencode schreiben
In dieser Klasse ist die JSON () -Methode die gewöhnliche Struts2 -Methode. Ich sehe hier keine Saiten im JSON -Format, weil wir diese Arbeit der Erweiterung überlassen, um dies zu tun. Ohne Einstellungen werden die Rückgabeteile aller Getter -Methoden unter der Klasse in der JSON -Zeichenfolge an den Client zurückgegeben. Um Attribute zu beseitigen, die nicht enthalten sein müssen, müssen Sie @JSON (Serialize = False) für die Getter -Methode zur Annotation in der Klassenstruktur verwenden. Natürlich können Sie diese Getter -Methode auch direkt entfernen, wenn sie andere Unternehmen nicht beeinflusst. Das Rückgabeergebnis in diesem Beispiel ist also eine JSON-Format-Zeichenfolge, die das DataMap-Objekt in die Konvertierung von DATAMAP-Objekt umwandelt.
Paket JSON; import Java.util.hashMap; import Java.util.map; import org.apache.struts2.json.annotations.json; import com.opensymphony.xwork2.actionsupport; / ** * JSON-Test * * @author Watson xu * @date 2012-8-4 06:21:01 PM */ public class JsonAction erweitert die Aktionsversorgung {private statische endgültige lange Serialversionuid = 1L; private map <string, Object> datamap; private String key = "Nur siehe siehe"; public String json () {// Die Daten in der DataMap werden von Struts2 in eine JSON -Zeichenfolge konvertiert, sodass Sie zuerst die darin enthaltenen Daten löschen müssen. Datamap = new HashMap <String, Object> (); User user = new user (); user.setName ("Zhang san"); user.setPassword ("123"); Datamap.put ("Benutzer", Benutzer); // ein Tag eingeben, ob der Vorgang erfolgreich ist, datamap.put ("Erfolg", true); // Rückgabe des Ergebnisserfolgs; } public map <String, Objekt> getDatamap () {return DataMap zurückgeben; } // Legen Sie das Schlüsselattribut fest, um nicht als JSON -Inhalt @JSON (Serialize = False) public String GetKey () {return Key; }}Aciton konfigurieren
In der Konfiguration muss zunächst das Paket, in dem sich die Aktion befindet, JSON-Default erben oder das erbliche übergeordnete Paket JSON-Default erbt. Dadurch konfiguriert sich die Rückgabetyp von JSON und kann seine serialisierten Eigenschaften und andere Klassenparameter konfigurieren.
<? Extends = "Struts-Default, JSON-Default"> <Action name = "json" method = "json"> <result type = "json"> <! Dieses Attribut muss eine entsprechende Getter -Methode in der Aktion haben -> <param name = "root"> datamap </param> </result> </action> </package> </struts>
Rückgabewert
{"Erfolg": True, "Benutzer": {"Name": "Zhang San", "Passwort": "123"}}3.. Verwenden Sie die Struts2 -Konfiguration mit der Maven -Komponente:
3.1) Um eine WebApp zu erstellen, verwenden wir Maven immer noch, um sie zu erstellen. Der Bauprozess bezieht sich auf den Blog von Limingnihao: Verwenden Sie Eclipse, um das SpringMVC -Projekt von Maven zu erstellen.
3.2) Fügen Sie die Abhängigkeit von Struts2, die Abhängigkeit von Struts2 Zero -Konfiguration und Struts2 JSON -Abhängigkeit hinzu:
<abhängigkeiten> <!-Struts2-Kernabhängigkeit-> <Depopentcy> <gruppe> org.apache.structs </GroupID> <artifactId> structs2-core </artifactId> <version> 2.3.4 </Version> <Typ> jar </type> <Scope> compile </scopecy> </abhängig> </abhängig> </abhängig> </abhängig> </abhängig> </abhängig> <! <groupId>org.apache.structs</groupId> <artifactId>structs2-convention-plugin</artifactId> <version>2.3.4</version> <type>jar</type> <scope>compile</scope> </dependency> <!-- struts2's json dependency--> <dependency> <groupId>org.apache.structs</groupId> <artifactId> Struts2-json-Plugin </artifactid> <version> 2.3.4 </Version> <typs
Nach dem Testen gibt es im obigen Abhängigkeitsraum keinen Versionskompatible-Fehler, nicht nur, weil sie dieselbe Version sind, sondern auch aufgrund der automatischen Konstruktionsmethode von Maven.
3.3) konfigurieren Sie web.xml und aktivieren Sie Struts2:
<? XSI: Schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" <Filterklasse> org.apache.struts2.dispatcher.ng.filter.strutsprepareAndexecuteFilter </Filter-Klasse> <init-param> <param-name> config </param-name> <param-value> struts-default.xml, stuts-plugin.xml, stuts- </filter> <filter-mapping> <filter-name> strutsprepareAndexecuteFilter </filter-name> <url-puftern>/*</url-pattern> </filter-mapping> </web-App>
3.4) Konfigurieren von Struts.xml und stellen Sie einige grundlegende Konstanten und Anwendungen fest:
<? erweitert = "JSON-Default, Struts-Default"> <! name = "struts.multipart.maxSize" value = "1073741824"/> <Constant Name = "Struts.DevMode" Value = "False"/> </Struts>
3.5) Aktion schreiben und konfigurieren. Setzen Sie von keiner Konvention, so dass für das Kongress -Plugin alle Java -Klassen mit Klassennamen behandelt werden, die mit Aktion als Aktion enden:
Paket Watson.Action; import Java.util.hashMap; import Java.util.map; import org.apache.struts2.Convention.Annotation.Action; import org.apache.struts2.convention.annotation.namePace; import org.apache.struts2.convention.annotation.namePace; import org.apache.struts2.convention.annotation.Parentpackage; import org.apache.struts2.Convention.annotation.Result; import org.apache.struts2.Convention.annotation.Results; @ParentPackage ("Basis") @NameSpace ("/Watson") @Results ({@result (name = "json", type = "json", params = {"root", "msg"}) public class jsonAction {@Action (value = "json). msg.put ("Flag", "Erfolg"); Karte <String, String> user = new HashMap <String, String> (); user.put ("name", "zhang san"); user.put ("Alter", "34"); msg.put ("Benutzer", Benutzer); Rückkehr "JSON"; } // ===================================== Private Map <String, Objekt> msg; public map <String, Objekt> getMsg () {return msg; }} 3.6) Bereiten Sie das Projekt ein, starten Sie den Container und geben Sie ein: http: // localhost: 7070/struts2foo/Watson/JSON in der Browser -Adressleiste. Warten Sie, bis die Ergebnisse wie folgt sind:
{"Flag": "Erfolg", "Benutzer": {"Alter": "34", "Name": "Zhang San"}}Aus den obigen Ergebnissen können wir feststellen, dass nach der Nullkonfiguration die Konfiguration in XML fehlt und stattdessen mit Annotation in jeder Aktion kommentiert wird. Hier löschen wir die obige Konfiguration in XML und schreiben den folgenden Code in den oberen Teil der obigen JSONACTION:
@ParentPackage ("Basis") @NameSpace ("/Watson") @Results ({@result (name = "json", type = "json", params = {"root", "msg"})})Das Root entspricht der Parameterkonfiguration in der XML -Konfiguration.
4. Anhang:
Detaillierte Erläuterung konfigurierbarer Parameter, wenn die Rückgabetyp der Aktion JSON ist:
<result type = "json"> <!- Hier gibt die Eigenschaften an, die von Struts2 serialisiert werden. Diese Eigenschaft muss eine entsprechende Getter-Methode in der Aktion haben-> <!-standardmäßig werden die Werte aller Getter-Methoden mit Rückgabetwerten sequenziert, unabhängig davon, ob die Methode entsprechende Eigenschaften aufweist-> <param name = "root"> datamap </param> <! DATAMAP-> <param name = "includeProperties"> Benutzerliste.*</param> <!-Hier gibt an, welche Eigenschaften von der DataMap ausgeschlossen werden. Diese ausgeschlossenen Eigenschaften werden nicht serialisiert und erscheinen im Allgemeinen nicht gleichzeitig mit der obigen Parameterkonfiguration -> <param name = "excludeProperties"> Erfolg </param> </result>
Anhang Download
Strutsjson.rar
Struts2foo.rar
Das obige ist der gesamte Inhalt von Struts2, das JSON -Objekte zurückgibt. Ich hoffe, es kann Ihnen eine Referenz geben und ich hoffe, Sie können Wulin.com mehr unterstützen.