No he querido usar la sesión recientemente. Quiero experimentar una forma de forma más segura y estable, y escribir una interfaz unificada para el navegador y la aplicación. Así que cambié la recepción de un programa de entrenamiento a AJAX, y luego salté y usé SpringMVC para controlar el reenvío. Tengo una comprensión más profunda de transmitir datos JSON. Lo compartiré y por favor corríjame.
En SpringMVC, podemos elegir varias formas de aceptar JSON. Antes de hablar sobre cómo SpringMVC acepta JSON, hablemos de lo que es JSON. No explicaré la definición específica. En JavaScript, a menudo definimos los objetos JSON de esta manera.
var jsonObject = {"nombre de usuario": "admin", "contraseña": 123}En esta forma, lo llamamos objeto JSON, y también hay un concepto llamado JSON String. Como su nombre indica, un completo envuelto por '' o "", lo llamamos una cadena. Sabemos que las cadenas se pueden emitir directamente, pero los objetos no se pueden emitir directamente. Entonces, en JavaScript, podemos
// Defina un objeto jsonObjectVar jsonObject = {"nombre de usuario": "admin", "contraseña": 123}; alerta (jsonObject);En este momento, [objeto objeto] se mostrará sin emitir el contenido del objeto JSON. JavaScript nos proporciona dos herramientas
Json.parse () se usa para convertir una cadena JSON en un objeto JavaScript. JSON.Stringify () se usa para convertir los valores de JavaScript en cadenas JSON.
Entonces cuando escribimos
alerta (json.stringify (jsonObject));
{"nombre de usuario": "admin", "contraseña": 123} se mostrará;
* Está bien, eso es todo para la explicación de JSON. Hablemos de SpringMVC *
Dado que JSON tiene las dos formas de existencia anteriores, ¿cuál deberíamos pasar el valor a SpringMVC a través de AJAX?
Primero intentamos enviar el objeto JSON directamente
// Definir el objeto JSON var userName = $ ("#username"). Val (); VAC PASSWORD = $ ("#Password"). Val (); var json = {"UserName": UserName, "Password": Password}; // jQuery AJAX Solicitud $ .AJAX ({URL: "JSontest", type: "post", async: true, data: json, dataType: 'json', stits: data (data). } else {if ($ ("#Errormsg"). Longitud <= 0) {$ ("form [name = loginform]"). append (errorMSG);Primero pensemos en lo que SpringMVC nos proporciona. Hay una anotación de @requestparam. Para esta anotación, su función es básicamente la misma que la solicitud. GetParameter en nuestro servlet. Primero usamos esta anotación para obtenerla
@RequestMapping ("/JSontest") public void test (@RequestParam (value = "username", requerido = true) string username, @requestparam (valor = "contraseña", requerir = true) string contraseña) {system.out.println ("username:" + nombre de usuario); System.out.println ("Password:" + Password); }¡Nuestros parámetros emiten con éxito desde el fondo fueron aceptados con éxito!
SpringMVC es tan inteligente, si eliminamos la anotación @RequestParam, ¿qué sucederá si ponemos dos valores directamente?
@RequestMapping ("/JSontest") Public void test (String UserName, String Password) {System.out.println ("UserName:" + UserName); System.out.println ("Password:" + Password); }En realidad fue exitoso. No daré más detalles sobre el principio aquí. Los amigos interesados pueden romper el punto y echar un vistazo.
SpringMVC proporciona un @RequestBody, que se utiliza para procesar los datos enviados por el tipo de contenido de definición de primer plano: no la codificación Aplication/X-WWW-Form-URLEncoded, como Aplicación/JSON, Aplicación/XML, etc.;
Los amigos cuidadosos pueden haber descubierto que en el AJAX anterior, no definimos el tipo de tipo de contenido, y JQuery usa el tipo de aplicación/X-www-form-urlencoded de forma predeterminada. Eso significa que la anotación @RequestParam de SpringMVC y la solicitud de servlet. GetParameter puede aceptar los objetos JSON transmitidos en este formato.
¡Por qué! ? Creo que todos están familiarizados con las solicitudes GET. Envía parámetros al servidor en forma de URL? USERNAME = "Admin" & Password = 123, y request.getParameter puede recibir este parámetro. También podemos ver esto en la barra de direcciones del navegador. En cuanto a la publicación que usamos en AJAX y envía un objeto JSON, ¿cómo lo obtenemos en segundo plano? La respuesta se encuentra en el método de codificación de contenido X-www-form-urlencoded convierte los datos JSON en una cadena, (username = "admin" & contraseña = 123) y agrega esta cadena a la URL y usa? segmentación (es muy similar al método GET). Cuando se publica el método de envío, el navegador encapsula los datos en el cuerpo HTTP y luego los envía al servidor. Por lo tanto, no se mostrará en la URL. (Este párrafo puede ser un poco un giro, espero que todos puedan entenderlo con cuidado).
Finalmente terminó de hablar, dio un largo suspiro. Entonces, cuando usamos la anotación @RequestBody, el tipo de contenido de la recepción debe cambiarse a Application/JSON. Si no hay cambios, la recepción informará un error de 415 (tipo de medio no compatible). El registro de antecedentes informará un tipo de contenido de error 'Application/X-WWW-Form-URLEncoded; Charset = UTF-8' no es compatible. Estos errores no se mostrarán en Tomcat en Eclipse. Solo se mostrará cuando se use el registro. Puede leer mi artículo anterior sobre cómo configurar el registro. A continuación, lo configuremos correctamente. La mencionada anteriormente de que el tipo de contenido debe cambiarse, y nuestros datos también deben cambiarse. Este método de anotación solo acepta cadenas JSON en lugar de objetos JSON.
$ .AJAX ({URL: "JSONTEST", Tipo: "POST", AsynC: True, ContentType: "Application/Json", Data: JSON.Stringify (JSON), DataType: 'Json', Succes: Function (Data) {if (data.userstatus === "Success") {$ ("#Errormsg"). ($ ("#ErrormSg"). Longitud <= 0) {$ ("form [name = loginform]"). append (errorMSG);El fondo también cambia. JSON en realidad puede entenderse como un par de valores clave, por lo que usamos MAP para recibirlo y luego procesar más la cadena u otros tipos de datos.
@RequestMapping ("/JSontest") Public void test (@RequestBody (requirir = true) map <string, object> map) {String username = map.get ("username"). ToString (); Cadena contraseña = map.get ("contraseña"). ToString (); System.out.println ("Nombre de usuario:" + nombre de usuario); System.out.println ("Password:" + Password); }Al mismo tiempo, recordé nuevamente el mágico SpringMVC, así que decidí eliminar la anotación y probarlo. Ok, me exploté decisivamente con un error de puntero nulo ... Traté de detenerlo.
SpringMVC también proporciona un método para unir los parámetros directamente a POJO, probándonos. La recepción es la misma, por lo que no lo publicaré.
@RequestMapping ("/JSontest") Public void test (@RequestBody User User) {String UserName = user.getUsername (); Cadena contraseña = user.getPassword (); System.out.println ("Nombre de usuario:" + nombre de usuario); System.out.println ("Password:" + Password); }Ok, esta vez puedes obtener el valor. Personalmente, no me gusta este método para cargar volúmenes de datos pequeños como el inicio de sesión. Hay muchas variables en el usuario. Solo usé dos de ellos. No hay necesidad de crear un objeto de usuario. En general, cuando el volumen de datos es pequeño, todavía prefiero usar valores separados para obtenerlo. Pensemos en ello nuevamente, si estamos cargando objetos JSON, ¿podemos atar a PoJo? La respuesta es sí. No use la anotación @RQUESTPARAM, de lo contrario el parámetro de usuario requerido 'usuario' no es un error presente. La explicación es básicamente por aquí, resumamos a continuación.
Primero hablamos sobre JSON Objects y JSON Strings
Luego, cuando SpringMVC acepta dos o dos formatos JSON, la configuración de ContentType de contenido frontal y si el back-end usa anotaciones para aceptarlo, también mencionó un pequeño servlet.
Cuando AJAX se carga en formato de aplicación/x-www-form-urlencoded, es necesario usar @RequestParam o servlet para obtenerlo en segundo plano. Cuando AJAX se carga en formato de aplicación/JSON, se usa para usar cadenas JSON, el fondo debe usar @RQuestbody para obtenerlo.
Estos son un resumen de mis experimentos por un día. Espero que pueda ayudarte. Si hay algún error, perdóname y corríjame.
La explicación detallada anterior de los parámetros JSON aceptados por SpringMVC y el resumen de los errores comunes es todo el contenido que comparto con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.