Si se trata de un proyecto de interfaz HTTP+JSON como cliente y no hay JSP y otras vistas de vista, usar el marco Jersery es definitivamente la primera opción. Bajo la arquitectura basada en MVC Spring3, el tipo de retorno de HTTP+JSON también es muy solidario. Sin embargo, en el trabajo de desarrollo, es muy común que la actualización de funciones se base en la arquitectura establecida. Encontré la necesidad de usar la interfaz de tipo HTTP+JSON de retorno basada en Struts2, que se basa en la estructura del marco establecida.
Hay dos formas de devolver JSON en Struts2: 1. Use el flujo de salida del servlet para escribir la cadena JSON; 2. Use Struts2 para extender JSON.
1. Utilice la transmisión de salida de servlet
La esencia de la interfaz JSON es: durante el proceso de aprobación de datos JSON, en realidad es solo pasar una cadena ordinaria que se ajusta al formato de sintaxis JSON. El llamado "objeto JSON" se refiere al resultado de análisis y envolviendo esta cadena JSON.
Así que aquí solo necesita escribir una cadena en formato de sintaxis JSON en la HttpServletResponse del servlet. Aquí usa el método PrintWriter y, por supuesto, también puede usar el método de transmisión de transmisión. Cabe señalar que la codificación no se establece antes de llamar a GetWriter (ya sea llamado SetContentType o SetCharacterEncoding Method para establecer la codificación), httpServletResponse devolverá una instancia de impresión impresa codificada con la codificación predeterminada (ya sea ISO-8859-1). Esto causará chino confuso. Además, al establecer la codificación, debe configurarse antes de llamar a GetWriter, de lo contrario no será válido.
Escribir código de interfaz:
La diferencia entre el método aquí y el método General Struts2 es que este es el tipo de retorno vacío.
public void write () lanza ioexception {httpservletResponse respuesta = servletactionContext.getResponse (); / * * La codificación no se establece antes de llamar a GetWriter (ya sea llamado setContentType o setCharacterEncoding método para establecer), * httpServletResponse devolverá una instancia de impresión impresa codificada con la codificación predeterminada (ya sea ISO-8859-1). Esto causará chino confuso. Además, al establecer la codificación, debe configurarse antes de llamar a GetWriter, de lo contrario no será válido. * */ respuesta.setContentType ("text/ html; charset = utf-8"); //Response.SetcharacterEncoding("UTF-8 "); PrintWriter out = Response.getWriter (); // JSON se pasa en forma de una cadena normal durante el proceso de entrega. Aquí hay un empalme simple de uno para probar String JSonstring = "{/" user/": {/" id/":/" 123/",/" name/":/" zhang san/",/" say/":/" hola, soy una acción para imprimir un json!/",/" Contraseña/":/" json/"},/" éxito/": verdadero}"; out.println (jsonstring); out.flush (); out.close (); }Acción de configuración
A partir de la siguiente configuración, se puede ver claramente que la configuración no es diferente de la configuración de acción normal, pero no hay una vista de retorno.
<Action name = "Write" Method = "Write" />
Valor de retorno
{"usuario": {"id": "123", "nombre": "zhang san", "decir": "Hola, soy una acción para imprimir un json!", "Contraseña": "Json"}, "éxito": True}2. Extensión de JSON usando Struts2
Para usar esta extensión, definitivamente deberá agregar un paquete de soporte. Después de mi depuración, aquí hay dos opciones:
1.xwork-core-2.1.6.jar y struts2-json-plugin-2.1.8.jar. Si desea usar Struts2-Json-Plugin-2.1.8.Jar, su jar de Xwork-*. No puede elegir 2.2.1 y por encima de las versiones, porque las versiones 2.2.1 y anteriores de Xwork-Core-*. El jar no tiene paquetes como org.apache.commons.lang. Al comenzar Tomcat, aparecerá: java.lang.noclassDeffoundError: org.apache.commons.lang.xwork.stringutils.
2.xWork-2.1.2.Jar y JsonPlugin-0.34.Jar. Si desea usar JSONPLUGIN-0.34.JAR para admitir, debe cambiar su xwork-n-n-core-*. Jar a xwork-2.1.2.Jar. Porque JsonPlugin-0.34.Jar requiere soporte para com.opensymphony.xwork2.util.textutils. Se encuentran las versiones 2.2.1 y anteriores de Xwork-Core-*.
Finalmente, quiero decir que realmente no vale la pena debido al método de construcción original. Estoy realmente cansado. El uso de componentes automatizados como Maven evitará en gran medida errores que dependan de las diferencias de versión entre las piezas privadas. El método de componente de Maven se utilizará en la "Configuración cero Struts2" en la tercera sección.
Escribir código de interfaz
En esta clase, el método json () es el método Struts2 ordinario. No veo ninguna cadena en formato JSON aquí, porque vamos a dejar este trabajo a la extensión para hacerlo. Sin ninguna configuración, los valores de retorno de todos los métodos getter en la clase se incluirán en la cadena JSON devuelta al cliente. Para eliminar los atributos que no necesitan incluirse, debe usar @JSON (serialize = false) en el método Getter para la anotación en la estructura de clase. Por supuesto, también puede eliminar directamente este método Getter cuando no afecta a otras empresas. Entonces, el resultado de retorno en este ejemplo es una cadena JSON-format que convierte el objeto DataMap.
Paquete JSON; import java.util.hashmap; import java.util.map; importar 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 extiende ActionSupport {Private Static final Long SerialVersionUid = 1l; Mapa privado <String, Object> DataMap; Key de cadena privada = "Just Ve Ver"; Struts2 de la cadena pública JSON () {// Los datos en el DataMap se convertirán en una cadena JSON, por lo que primero debe borrar los datos en él. datAMAP = new HashMap <String, Object> (); Usuario user = nuevo usuario (); user.setName ("Zhang San"); user.setPassword ("123"); datAMAP.put ("usuario", usuario); // Ponga una etiqueta si la operación es exitosa datAMAP.put ("éxito", true); // devuelve el éxito de retorno de resultados; } mapa público <string, object> getDatamap () {return dataMap; } // Establezca el atributo clave para no devolver como contenido de JSON @json (serialize = false) public string getKey () {return Key; }}Configurar aciton
En la configuración, primero, el paquete donde se encuentra la acción necesita heredar JSON default, o el paquete principal heredado hereda JSON-default. Esto configura el tipo de acción de retorno a JSON, y puede configurar sus propiedades serializadas y otros parámetros de clase.
<? xml versión = "1.0" encoding = "utf-8"?> <! DocType Struts public "-// Apache Software Foundation // Dtd Struts Configuration 2.0 // en" "http://struts.apache.org/dtds/struts-2.0.dtdd"> <truts> <pack name = "JSon" "JSON" "JSON" "Json" Extends = "Struts-Default, Json-Default"> <Action name = "json" método = "json"> <resultado type = "json"> <!-Aquí especificamos el atributo que se serializa por Struts2. Este atributo debe tener un método getter correspondiente en la acción -> <param name = "root"> dataMap </amam> </ resultado> </action> </paquete> </struts>
Valor de retorno
{"éxito": true, "usuario": {"nombre": "zhang san", "contraseña": "123"}}3. Cómo usar la configuración Struts2 Zero, utilizando el componente Maven:
3.1) Para construir una aplicación web, todavía usamos Maven para construirla. El proceso de construcción se refiere al blog de Limingnihao: use Eclipse para construir el proyecto SpringMVC de Maven.
3.2) Agregue dependencia de Struts2, dependencia de configuración de Struts2 cero y dependencia de Struts2 JSON:
<Spendencies> <!-Struts2 Core Dependency-> <Spendency> <MoupRid> org.apache.structs </groupid> <artifactId> structs2-core </artifactid> <versión> 2.3.4 </versión> <iplo> jar </type> <cope> compile compile </cope> </pendency> <! <MoupRid> org.apache.structs </proupid> <artifactId> structs2-confonvention-plugin </artifactid> <versión> 2.3.4 </versión> <proye> jar </type> <cope> compilar </cope> </dependency> <!-Dependencia de JSON de Struts2-> <epelepentency> <grupiD> org.apache.structs </groupid> </groupid> <artifactId> Struts2-Json-Plugin </arfactid> <versión> 2.3.4 </versión> <proye> jar </pype> <cope> compilar </cope> </pendency> </dependencias>
Después de las pruebas, no hay un error compatible con la versión en la sala de dependencia anterior, no solo porque son la misma versión, sino también por el método de construcción automática de Maven.
3.3) Configurar web.xml y habilitar Struts2:
<? xml versión = "1.0" encoding = "utf-8"?> <web-app versión = "2.5" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <filter-name> StrutsPrepareanDexecutefilter </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,struts.xml</param-value> </init-param> </filtro> <filter-mapping> <filter-name> strutsprepareAndexeCuteFilter </filtre-name> <url-pattern>/*</url-Pattern> </filter-mapping> </web-app>
3.4) Configure Struts.xml y establezca algunas constantes y aplicaciones básicas:
<? xml versión = "1.0" encoding = "utf-8"?> <! DocType Struts public "-// Apache Software Foundation // Dtd Struts Configuration 2.0 // en" "http://struts.apache.org/dtds/struts-2.0.dtdd"> <truts> <cuence name = "base" base "" base "" " extends="json-default,struts-default"> <!-- Here you can set some global return value mapping relationships, etc. --> </package> <constant name="struts.action.extension" value="" /> <constant name="struts.ui.theme" value="simple" /> <constant name="struts.i18n.encoding" value="utf-8" /> <constant name = "Struts.multipart.maxSize" value = "1073741824"/> <constant name = "struts.devmode" valor = "falso"/> </truts>
3.5) Escribir y configurar la acción. Establecido por ninguna convención especificada, por lo que para el complemento de la convención, tratará todas las clases de Java con nombres de clases que terminan con acción como acción:
paquete watson.action; import java.util.hashmap; import java.util.map; importar org.apache.struts2.convention.annotation.action; importar org.apache.struts2.convention.annotation.namespace; importar org.apache.struts2.convention.annotation.namespace; importar org.apache.struts2.convention.annotation.parentpackage; importar org.apache.struts2.convention.annotation.result; importar org.apache.struts2.convention.annotation.results; @ParentPackage ("base") @namespace ("/watson") @Results ({@Result (name = "json", type = "json", params = {"root", "msg"})}) clase pública jSonaction {@Action (valor = "json") public string json () {msg = new Hashmap <string, object () () () (); msg.put ("bandera", "éxito"); Map <string, string> user = new HashMap <String, String> (); user.put ("Nombre", "Zhang San"); user.put ("edad", "34"); msg.put ("usuario", usuario); regresar "json"; } // ======================================== Mapa privado <cadena, objeto> msg; MAP Public <String, Object> getMsg () {return msg; }} 3.6) Implemente el proyecto, inicie el contenedor e ingrese: http: // localhost: 7070/struts2foo/watson/json en la barra de direcciones del navegador. Espere hasta que los resultados sean los siguientes:
{"bandera": "éxito", "usuario": {"edad": "34", "nombre": "zhang san"}}De los resultados anteriores, podemos ver que después de que la configuración cero esté habilitada, falta la configuración en XML y, en su lugar, se anota con anotación en cada acción. Aquí eliminamos la configuración anterior en XML y escribimos el siguiente código en la parte superior de la JSONACTION anterior:
@Parentpackage ("base") @namespace ("/watson") @Results ({@Result (name = "json", type = "json", params = {"root", "msg"})})Root es equivalente a la configuración de parámetros en la configuración XML.
4. Adjunto:
Explicación detallada de los parámetros configurables cuando el tipo de acción de retorno es JSON:
<Result type = "json"> <!- Aquí especifica las propiedades que se serializarán por Struts2. Esta propiedad debe tener un método getter correspondiente en la acción-> <!-Por defecto, los valores de todos los métodos de Getter con valores de retorno se secuenciarán, independientemente de si el método tiene propiedades correspondientes-> <param name = "root"> datamap </param> <!-especifica si es serializar las propiedades vacías-> <param name = "excludenullpperties"> verdadero </param> <!-especifica las propiedades vacías en las propiedades vacías-<amam name = "excludenullpperties"> verdadero </param> <! Especifica las propiedades vacías en las propiedades vacías en las propiedades de las datamizadas en las propiedades de las datamatizadas " -> <param name = "includeProperties"> UserList.*</param> <!-Aquí especifica qué propiedades se excluirán del DataMap. Estas propiedades excluidas no se serializarán, y generalmente no aparecerán al mismo tiempo que la configuración de parámetros anterior -> <param name = "excludeProperties"> éxito </param> </resultado>
Descarga de archivos adjuntos
Strutsjson.rar
Struts2foo.rar
Lo anterior es todo el contenido de Struts2 que devuelven los objetos JSON. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.