Red de conocimiento informático - Problemas con los teléfonos móviles - Cómo struts2 devuelve datos json

Cómo struts2 devuelve datos json

Si utiliza la interfaz HTTP JSON como cliente del proyecto y no tiene JSP ni otras vistas, usar el marco Jersey para el desarrollo es definitivamente la primera opción. En la arquitectura basada en Spring3 MVC, también hay un buen soporte para el tipo de retorno HTTP JSON. Sin embargo, en el trabajo de desarrollo, es muy común actualizar funciones basadas en la arquitectura existente. La interfaz de tipo de retorno HTTP JSON basada en Struts2 que encontró el autor y que necesita desarrollarse se basa en la estructura del marco establecido.

Hay dos formas para que Struts2 devuelva JSON: 1. Utilice el flujo de salida del Servlet para escribir una cadena JSON 2. Utilice Struts2 para extender JSON;

I. Utilice el flujo de salida de Servlet

Interfaz JSON: durante el proceso de transmisión de datos JSON, en realidad transfiere una cadena ordinaria que se ajusta al formato de sintaxis JSON. llamado "objeto JSON" se refiere al resultado de analizar y empaquetar cadenas JSON.

Entonces aquí solo necesita escribir una cadena en formato de sintaxis JSON en el HttpServletResponse del Servlet, usando el método PrintWriter. Por supuesto, también puede usar el método Stream. Cabe señalar que si no configura la codificación antes de llamar a getWriter (llame al método setContentType o setCharacterEncoding para configurar la codificación), HttpServletResponse devolverá una instancia de PrintWriter con la codificación predeterminada (es decir, codificación ISO-8859-1). Esto dará como resultado caracteres chinos confusos. La codificación debe configurarse antes de llamar a getWriter; de lo contrario, no tendrá ningún efecto.

Escribir código de interfaz:

La diferencia entre el método aquí y el método general de Struts2 es que tiene un tipo de retorno nulo.

¿Código Java?

public?void?write()?throws?IOException{?

HttpServletResponse?response=ServletActionContext.getResponse();?

/*?

*?La codificación no se configuró antes de llamar a getWriter (llamando al método setContentType o setCharacterEncoding),?

*? HttpServletResponse luego devolverá una instancia de PrintWriter codificada usando la codificación predeterminada (ambas ISO-8859-1). Esto

*? Además, la codificación debe establecerse antes de llamar a getWriter; de lo contrario, no tendrá ningún efecto.

*?

*?

response.setContentType("text/html;charset=utf-8");?

//response.setCharacterEncoding("UTF-8");?

/PrintWriter?

// JSON se pasa en forma de una cadena normal durante el proceso de transmisión, haga esto aquí ¿Una simple prueba de empalme?

String?jsonString="{\"usuario\":{\"id\":\"123\",\"nombre\":\"Zhang San\",\"decir\" :\"¿Hola?,?soy?una?acción?para?imprimir?un?json!\", \"contraseña\":\"JSON\":\"JSON\".response.getWriter(); ?":\"JSON\"},\"éxito\": true}";?

out.println(jsonString);?

out.flush();?

out.close();?

}?

Operación de configuración

Como se puede ver en la siguiente configuración, excepto que no hay vista Excepto por el valor de retorno, la configuración no es diferente de la configuración de operación normal

¿Código Java

lt;action?name="write"?class=" json.JsonAction"?method. ="write"?/gt;

Valor de retorno

¿Código de consola?

{"user":{"id" :"123", " name": "ZhangSan", "say": "¡Hola, soy el operador que imprime json! ", "password": "JSON"}, "success": true}

II. Amplíe JSON usando Struts2

Para usar esta extensión, por supuesto, debe agregar un soporte paquete Después de I Para depurar, hay dos opciones:

1. xwork-core-2.1.6.jar y struts2-json-plugin-2.1.8.jar si desea utilizar struts2-json. -plugin-.2.1.8.jar Este tipo de soporte, su xwork-core-*.jar no puede elegir las versiones 2.2.1 y superiores, porque xwork-core-*.jar 2.2.1 y las versiones superiores no tienen org. apache.commons.lang, etc. Al iniciar Tomcat se producirá: java.lang.NoClassDefFoundError: org.apache.commons.lang.xwork.StringUtils.

2. 0.34.jar si desea utilizar jsonplugin-0.34.jar como método de soporte, entonces debe cambiar xwork-core-*.jar a xwork-2.1.2.jar porque jsonplugin-0.34.jar requiere com.opensymphony. xwork2.util.TextUtils<. /p>

Esta clase es compatible A partir de la versión 2.2.1, esta clase no está disponible en xwork-core-*.jar, ni está disponible en xwork-core-2.1. 6.tarro.

Una nota final es que dado que estás utilizando el método de compilación original, no vale la pena seguir atravesando un campo minado, es realmente agotador hacerlo. La herramienta Maven se utilizará en la Sección 3, "Configuración cero para Struts2".

Escribir código de interfaz

El método json() en esta clase es un método Struts2 ordinario. No verá ninguna cadena con formato JSON aquí porque dejaremos ese trabajo a la extensión. Sin ninguna configuración, los valores de retorno de todos los métodos getter en la clase de cambio se incluirán en la cadena JSON devuelta al cliente. Para eliminar atributos que no necesitan incluirse, debe anotar el método de adquisición con @JSON (serialize=false) en la estructura de clases. Por supuesto, también puede eliminar el método de adquisición si no afecta a otras empresas. Entonces, en este caso, el resultado devuelto es un objeto dataMap convertido en una cadena con formato JSON.

¿Código Java?

paquete?json;?

importar?java.util.HashMap;?

importar?java.util.Map;?

import?org.apache.struts2.json.annotations.JSON;?

import?com.opensymphony.xwork2.ActionSupport;?

/**?

*?

*?

*?@autor?@fecha?2012-8-4?06:21:01 PM?

*/ ?

¿pública?class?JsonAction?extends?ActionSupport{?

privada?static?final?long?serialVersionUID?=?1L;?

privada? Maplt; Cadena, Objectgt;? dataMap;?

privado?

público?

público?{

//? Struts2 convertirá los datos a una cadena JSON, así que borrelos primero.

dataMap =?new?HashMaplt;String,?Objectgt;();?

¿Usuario?user?=?new?User();?

user.setName("ZhangSan");?

user.setPassword("123");?

dataMap.put("user",?user);?

//?Ingrese el identificador de si la operación fue exitosa.

dataMap.put("success",?true);?

//?¿Devolver el resultado?

return?SUCCESS;?

}?

public?Maplt; String,?Objectgt;?getDataMap()?{

return.dataMap;?

}?

//¿Establecer el atributo clave y no devolverlo como contenido json?

@JSON(serialize=false)?

¿público?{

tecla de retorno;?

}?

}??

Configurar aciton

En la configuración, primero debe realizar la acción en el paquete que hereda json-default, o en el paquete principal que hereda json- default , configurando así el tipo de retorno de la acción como json, y luego puede configurar las propiedades de serialización y otros parámetros de clase.

¿Código XML?

lt;?xml?version="1.0"?encoding="UTF-8"?gt;?

lt;! DOCTYPE?struts?PUBLIC?

"-//Apache?Software?Foundation//DTD?Struts?Configuration?2.0//ES"?

"pilelt;/scopegt;?

lt;/dependencygt;?

lt;! --struts2 ¿dependencia de configuración cero

lt;!

lt;dependencygt ;?

lt;groupIdgt;org.apache.strutslt;/groupIdgt;?

lt;artifactIdgt;struts2-convention-pluginlt;/artifactIdgt;?

lt;versiongt;2.3.4lt;/versiongt;?

lt;typegt;jarlt;/typegt;?

lt;scopegt;compilelt;/scopegt;?

lt;/dependencygt;?

lt;! --¿dependencias json de struts2?

lt;!

lt;dependencygt;?

lt;groupIdgt;org.apache.strutslt;/groupIdgt;?

lt;artifactIdgt;struts2-json-pluginlt;/artifactIdgt;?

lt;versiongt ;2.3.4lt;/versiongt;?

lt;typegt;jarlt;/typegt;?

lt;scopegt;compilelt;/scopegt;?

lt;/dependencygt;?

lt;/dependenciesgt;?

Después de las pruebas, no hay ningún error de compatibilidad de versiones entre las dependencias anteriores. Esto no se debe solo a que sean la misma versión. También por la forma en que Maven los construye automáticamente.

3.3) Configurar web.xml para habilitar Struts2:

¿Código XML?

lt;?xml?version="1.0"?encoding="UTF-8"?gt;?

lt;web-app?version="2.5"?xmlns= "/xml/ns/javaee"?

xmlns:xsi="/xml/ns/javaee

/xml/ns/javaee/web-app_2_5.xsd"gt;?

lt;filtergt;

lt;filter-namegt;StrutsPrepareAndExecuteFilter?lt;/filter-namegt;

lt;filter-classgt;org. struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter?lt;/filter-classgt;?

lt;init-paramgt;?

lt;param-namegt;configlt;/param- namegt;?

lt;param-valuegt;struts-default.xml, struts-plugin.xml, struts.xmllt;/param-valuegt;?

lt;/init- paramgt;

lt;/filtergt;?

lt;/filter-mappinggt;?

lt;filter-namegt;StrutsPrepareAndExecuteFilterlt;/filter-namegt; ?

lt;url-patterngt;/*lt;/url-patterngt;?

lt;/filter-mappinggt;?

lt;/web -appgt;?

3.4) Configurar struts.xml y establecer algunas constantes y aplicaciones básicas:

¿Código XML?

lt;?xml?version="1.0"?encoding="UTF-8"?

lt;!DOCTYPE?struts?PUBLIC?

" -//Apache?Software?Foundation//DTD?Struts?Configuration?2.0/ES"?

"http://struts.apache.org/dtds/struts-2.0.dtd"gt;?

lt;strutsgt;?

lt;package?name="base"?extends="json-default, struts-default"gt;?

lt;?--?Aquí puede establecer algunas relaciones de mapeo de valores de retorno globales, etc.

lt;!

lt;/packagegt;?

lt;constant?name="struts.action.extension"?value=""?/ gt;?

lt;constant?name="struts.ui.theme"?value="simple"?

lt;constant?name="struts.ui.theme" ?value="simple"?

lt;constant?name="struts.i18n.encoding"?value="utf-8"?/gt;?

lt;constante ?name="struts.multipart.maxSize"?value="1073741824"/gt;?

lt;constant?name="struts.devMode"?value="false"/gt;? p>

lt;/strutsgt;?

3.5) Escribir y configurar Acciones.

Esto se establece al no especificar la Convención, por lo que para el complemento Convención tratará de forma predeterminada todas las clases de Java cuyos nombres de clase terminen con Acción como Acciones:

¿Código Java?

paquete?watson.action;?

importar?java.util.HashMap;?

importar?java.util.Map;?

¿importar?

¿importar?org.apache.struts2.convention.annotation.Namespace;?

importar?org.apache.struts2.convention.annotation.ParentPackage;?

importar?org.apache.struts2.convention.annotation.Resultados;?

importar?org.apache.struts2.convención.annotation.Resultados;?

¿@ParentPackage("base")?

@Namespace("/watson")?

@Resultados({?

@Resultado(nombre?=? "json", type="json", ?params={"root", "msg"})?

})?

public?class?JsonAction?{? /p>

@Action(value="json")?

public?String?{

msg = new HashMaplt; Objectgt ();?

msg.put("bandera",?" éxito");?

Maplt;Stringgt;?user?=?new?HashMaplt;String,?Stringgt;() ;?

usuario.put("nombre",?" ZhangSan");?

usuario.put("edad",?" 34");?

msg.put("usuario",?usuario);?

return?"json";?

}?

//== ================================?

¿privado?

público ?Maplt; Cadena, ?Objectgt; ?getMsg()?{

retorno?

}?

}?

3.6) Implemente el proyecto, inicie el contenedor y escriba en la barra de direcciones del navegador: http://localhost:7070/Struts2foo/watson/json. El resultado de la espera es el siguiente:

¿Código Json?

¿{"flag": "success", "user": {"age": "34", "name": "Zhang San"}}?

De lo anterior resultados Se puede ver que después de habilitar la configuración cero, la configuración en xml se reduce y cada operación no tiene comentarios.

Elimine la configuración anterior en xml aquí y escriba el siguiente código encima del JsonAction anterior:

¿Código Java?

@ParentPackage("base")?

@Namespace("/watson")?

@Resultados({?

@Result(name?=?"json",type="json",?params={"root", "msg"})?

})?

la raíz es Configuración de parámetros equivalente en configuración xml.

IV.

Operación de tipo de retorno json de parámetro configurable:

¿Código XML?

lt;result?type="json"gt;?

lt;?--?Esto especifica el atributo que serializará Struts2, el cual debe tener un atributo correspondiente en la acción método captador.

lt;!

lt;!--?De forma predeterminada, serializará el valor de cualquier método getter que devuelva un valor, independientemente de si el método tiene una propiedad correspondiente.

lt;!

lt;param?name="root"gt;dataMaplt;/paramgt;?

lt;?--?Especifique si desea secuencia ¿Atributos vacíos?

lt;!

lt;param?name="excludeNullProperties"gt;truelt;/paramgt;?

lt;! --?Especifique aquí qué atributos del mapa de datos se serializarán.

lt;!

lt;param?name="includeProperties"gt;userList.*lt;/paramgt;?

lt;! --?Esto especificará los atributos que se excluirán del mapa de datos. Estos atributos excluidos no se serializarán y normalmente no aparecerán con la configuración de parámetros anterior. --gt;?

lt;param?name="excludeProperties"gt;SUCCESSlt;/paramgt;?

lt;/resultgt;??