S'il s'agit d'un projet d'interface HTTP + JSON en tant que client et qu'il n'y a pas de vues JSP et d'autres vues, l'utilisation du framework de maillot est certainement le premier choix. Dans le cadre de l'architecture basée sur MVC Spring3, le type de retour de HTTP + JSON est également très favorable. Cependant, dans les travaux de développement, il est très courant que la mise à niveau des fonctions soit basée sur l'architecture établie. J'ai rencontré la nécessité d'utiliser l'interface de type de retour HTTP + JSON basée sur Struts2, qui est basée sur la structure du cadre établie.
Il existe deux façons de retourner JSON dans Struts2: 1. Utilisez le flux de sortie du servlet pour écrire JSON String; 2. Utilisez Struts2 pour étendre JSON.
1. Utilisez le flux de sortie du servlet
L'essence de l'interface JSON est: pendant le processus de transmission des données JSON, il ne fait que passer une chaîne ordinaire conforme au format de syntaxe JSON. Le soi-disant "objet JSON" fait référence au résultat de l'analyse et de l'emballage de cette chaîne JSON.
Ici, il vous suffit d'écrire une chaîne au format de syntaxe JSON au HttpServletResponse du servlet. Ici, vous utilisez la méthode Printwriter et, bien sûr, vous pouvez également utiliser la méthode Stream Stream. Il convient de noter que l'encodage n'est pas défini avant d'appeler GetWriter (soit appelé setContentType ou setCharAtterencoding pour définir l'encodage), HttpservletResponse renvoie une instance de gravure encodée avec le codage par défaut (soit ISO-8859-1). Cela provoquera un chinois brouillé. De plus, lors de la définition de l'encodage, il doit être défini avant d'appeler GetWriter, sinon il ne sera pas valide.
Écrire le code d'interface:
La différence entre la méthode ici et la méthode générale Struts2 est qu'il s'agit du type de retour vide.
public void write () lève ioException {httpservletResponse réponse = servletActionContext.getResponse (); / * * L'encodage n'est pas défini avant d'appeler GetWriter (soit appelé setContentType, soit la méthode SetCacteRencoding à définir), * httpservletResponse renvoie une instance PrintWriter encodée avec le codage par défaut (soit ISO-8859-1). Cela provoquera un chinois brouillé. De plus, lors de la définition de l'encodage, il doit être défini avant d'appeler GetWriter, sinon il ne sera pas valide. * * / réponse.setContentType ("text / html; charset = utf-8"); //Response.Setcharacterencoding("utf-8 "); Printwriter out = réponse.getWriter (); // JSON est passé sous la forme d'une chaîne normale pendant le processus de livraison. Voici une simple épissage d'un pour tester la chaîne jsonstring = "{/" user / ": {/" id / ": /" 123 / ", /" name / ": /" zhang san / ", /" say / ": /" bonjour, je suis une action pour imprimer un json! / ", /" Mot de passe / ": /" JSON / "}, /" Success / ":: true";;; out.println (jsonstring); out.flush (); out.close (); }Action de configuration
À partir de la configuration suivante, on peut voir clairement que la configuration n'est pas différente de la configuration d'action normale, mais il n'y a pas de vue de retour.
<action name = "write" method = "write" />
Valeur de retour
{"utilisateur": {"id": "123", "name": "Zhang san", "dire": "Bonjour, je suis une action pour imprimer un json!", "mot de passe": "json"}, "succès": true}2. Extension de JSON à l'aide de Struts2
Pour utiliser cette extension, vous devrez certainement ajouter un package d'assistance. Après mon débogage, voici deux options:
1.xwork-core-2.1.6.jar et struts2-json-plugin-2.1.8.jar. Si vous souhaitez utiliser Struts2-Json-Plugin-2.1.8.jar, votre xwork-core - *. Jar ne peut pas choisir les versions 2.2.1 et ci-dessus, car les versions 2.2.1 et ci-dessus de xwork-core - *. Jar n'ont pas de packages tels que org.apache.commons.lang. Lors du démarrage de Tomcat, il apparaîtra: java.lang.noclassdeffounderror: org.apache.commons.lang.xwork.stringutils.
2.xwork-2.1.2.jar et jsonplugin-0.34.jar. Si vous souhaitez utiliser JSONPlugin-0.34.jar pour prendre en charge, vous devez changer votre xwork-core - *. Jar vers xwork-2.1.2.jar. Parce que JSONPlugin-0.34.Jar nécessite une prise en charge de com.opensymphony.xwork2.util.textutils. Les versions 2.2.1 et au-dessus de Xwork-Core - *. JAR sont trouvées, et il n'y a pas de classe de tel dans XWork-Core-2.1.6.jar.
Enfin, je veux dire que cela n'en vaut vraiment pas la peine à cause de la méthode de construction d'origine. Je suis vraiment fatigué. L'utilisation de composants automatisés tels que Maven évitera en grande partie les bogues qui reposent sur les différences de version entre les pièces privées. La méthode des composants de Maven sera utilisée dans la "configuration zéro Struts2" dans la troisième section.
Écriture du code d'interface
Dans cette classe, la méthode JSON () est la méthode Struts2 ordinaire. Je ne vois aucune chaîne au format JSON ici, car nous allons laisser ce travail à l'extension pour le faire. Sans aucun paramètre, les valeurs de retour de toutes les méthodes Getter sous la classe seront incluses dans la chaîne JSON renvoyée au client. Pour éliminer les attributs qui n'ont pas besoin d'être inclus, vous devez utiliser @json (serialize = false) sur la méthode Getter pour l'annotation dans la structure des classes. Bien sûr, vous pouvez également supprimer directement cette méthode Getter lorsqu'elle n'affecte pas d'autres entreprises. Ainsi, le résultat de retour dans cet exemple est une chaîne JSON-Format qui convertit l'objet DataMap vers.
Package JSON; import java.util.hashmap; importation java.util.map; import org.apache.struts2.json.annotations.json; Importer com.opensymphony.xwork2.actionsupport; / ** * Test JSON * * @Author Watson Xu * @Date 2012-8-4 06:21:01 PM * / classe publique JSONAction étend ActionSupport {private static final long SerialversionUID = 1l; Carte privée <String, objet> dataMap; clés de chaîne privée = "juste voir voir"; Public String JSON () {// Les données du DATAMAP seront converties en une chaîne JSON par Struts2, vous devez donc d'abord effacer les données. dataMap = new HashMap <String, objet> (); Utilisateur utilisateur = nouveau utilisateur (); user.setName ("Zhang San"); user.setpassword ("123"); dataMap.put ("utilisateur", utilisateur); // a mis une balise si l'opération est réussie dataMap.put ("Success", vrai); // Renvoie le succès du rendement des résultats; } Map public <String, objet> getDatamap () {return dataMap; } // Définissez l'attribut de clé pour ne pas revenir en tant que contenu de JSON @json (serialize = false) public string getKey () {return key; }}Configurer l'aciton
Dans la configuration, d'abord, le package où l'action est située doit hériter de JSON-Default, ou le package parent hérité hérite de JSON-Default. Cela configure le type d'action de retour à JSON et peut configurer ses propriétés sérialisées et autres paramètres de classe.
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Struts public "- // APCACH SOFTWARE FOUNDATION // Dtd Struts Configuration 2.0 // en" "http://strts.apache.org/dtds/struts-2.0.dtd"> <strutts> <package nom = "json" " extends = "struts-default, json-default"> <action name = "json" method = "json"> <result type = "json"> <! - Nous spécifions ici l'attribut à sérialiser par Struts2. Cet attribut doit avoir une méthode Getter correspondante dans l'action -> <param name = "root"> dataMap </ param> </sult> </ action> </ package> </ struts>
Valeur de retour
{"Success": True, "User": {"Name": "Zhang San", "Mot de passe": "123"}}3. Comment utiliser la configuration de Struts2 Zero, en utilisant le composant Maven:
3.1) Pour construire un WebApp, nous utilisons toujours Maven pour le construire. Le processus de construction fait référence au blog de Limmingnihao: Utilisez Eclipse pour construire le projet SpringMVC de Maven.
3.2) Ajouter la dépendance Struts2, la dépendance de configuration zéro Struts2 et la dépendance JSON Struts2:
<Dendecces> <! - Struts2 Core Dependency -> <Dedency> <ProupId> org.apache.structs </proncId> <Artifactid> struct2-core </refactId> <version> 2.3.4 </ version> <pype> jar </pype> </ scope> compilation </cope> </dedency> <! - Struts2 Zero Configuration dépendance -> </cope> </ dépendance> <! - Struts2 Zero Configuration dépendance -> </cope> </ dépendance> <! - Struts2 Zero Configuration dépendance --> <ProupId> org.apache.structs </prômId> <Artifactid> strustS2-Convention-Plugin </ Artifactid> <DERVIÈRE> 2.3.4 </ Version> <Type> Jar </pype> <ccope> compile </cope> </sendency> <! - STRUTS2's JSON Dependance -> <Dedency> <ProupId> Org.apache.Structs </ Groupid> <ArtefactId> Struts2-Json-Plugin </Retifactid> <DERNÉRATION> 2.3.4 </ version> <type> jar </pype> <ccope> compile </ccope> </dependency> </Dependance>
Après les tests, il n'y a pas de bug compatible vers la version dans la salle de dépendance ci-dessus, non seulement parce qu'ils sont la même version, mais aussi en raison de la méthode de construction automatique de Maven.
3.3) Configurer web.xml et activer Struts2:
<? xml version = "1.0" encoding = "utf-8"?> <web-app version = "2.5" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema instance" XSI: ScheMalation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <filter-name> STRUTSPREANDEXETEFILTFILTER </ Filter-Name> <Filter-Class> org.apache.struts2.dispatcher.ng.filter.strutSprepareandexEcuteFilter </filter-Class> <Init-Param> <param-name> Config </ Param-Name> <AmAr-Value> Struts-default.xml, Struts-plugin.xml, StrUts.Xml </ Param-value> </ init-param> </ filter> <mappage de filter> <hilter-name> strutsprepareAndexECuteFilter </filter-name> <url-potern> / * </url-potern> </filter-mapping> </ web -pp>
3.4) Configurer les struts.xml et définir certaines constantes et applications de base:
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Struts public "- // APCACH SOFTWARE FOUNDATION // DTD Struts Configuration 2.0 // en" "http://strts.apache.org/dtds/struts-2.0.dtd"> <strutts> <package nom = "Base" extends = "JSON-Default, Struts-default"> <! - Ici, vous pouvez définir certaines relations de mappage de valeur de retour globales, etc. -> </ package> <constante name = "struts.action.extension" value = "" /> <constante name = "struts.ui.theme" value = "simple" /> <constante name = "struts.i18n.encoding" name = "strut.multuparts.maxsize" value = "1073741824" /> <constante name = "strut.devmode" value = "false" /> </ struts>
3.5) Écrire et configurer l'action. Défini par aucune convention spécifiée, donc pour le plugin de convention, il traitera toutes les classes Java avec des noms de classe se terminant par l'action comme action:
Package Watson.Action; import java.util.hashmap; importation java.util.map; import org.apache.struts2.convention.annotation.action; import org.apache.struts2.convention.annotation.namespace; import org.apache.struts2.convention.annotation.namespace; import org.apache.struts2.convention.annotation.parentPackage; import org.apache.struts2.convention.annotation.result; import 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 = news hashmap <string, objet> ();); msg.put ("drapeau", "succès"); Map <string, string> user = new HashMap <String, String> (); user.put ("Name", "Zhang San"); user.put ("Age", "34"); msg.put ("utilisateur", utilisateur); retourner "JSON"; } // ===================================== Carte privée <String, objet> MSG; Map public <string, objet> getmsg () {return msg; }} 3.6) Déployez le projet, démarrez le conteneur et entrez: http: // localhost: 7070 / struts2foo / watson / json dans la barre d'adresse du navigateur. Attendez que les résultats soient les suivants:
{"Flag": "Success", "User": {"Age": "34", "Name": "Zhang San"}}D'après les résultats ci-dessus, nous pouvons voir qu'après l'activation de la configuration zéro, la configuration dans XML est manquante et a été annotée avec annotation dans chaque action. Ici, nous supprimons la configuration ci-dessus dans XML et écrivons le code suivant dans la partie supérieure de la JSONAction ci-dessus:
@ParentPackage ("Base") @Namespace ("/ Watson") @Results ({@Result (name = "JSON", type = "JSON", params = {"root", "msg"})})La racine est équivalente à la configuration des paramètres dans la configuration XML.
4. Attachement:
Explication détaillée des paramètres configurables lorsque le type de retour d'action est JSON:
<Result Type = "JSON"> <! - Ici, spécifie les propriétés qui seront sérialisées par Struts2. Cette propriété doit avoir une méthode Getter correspondante dans l'action -> <! - Par défaut, les valeurs de toutes les méthodes Getter avec des valeurs de retour seront séquencées, que la méthode ait des propriétés correspondantes -> <param name = "root"> dataMap </param> <! - Spécifie s'ils pour sérialiser les propriétés vides -> <param name = "ExclusionProperties"> true </ param> <! dataMap -> <param name = "includeproperties"> userList. * </onsam> <! - Ici, spécifie quelles propriétés seront exclues du dataMap. Ces propriétés exclues ne seront pas sérialisées et n'apparaissent généralement pas en même temps que la configuration du paramètre ci-dessus -> <param name = "ExcludeProperties"> Succès </param> </sult>
Téléchargement de la pièce jointe
Strutsjson.rar
Struts2foo.rar
Ce qui précède est le contenu entier de Struts2 Retour des objets JSON. J'espère que cela pourra vous donner une référence et j'espère que vous pourrez soutenir Wulin.com plus.