SpringMVC notas de estudio -05 valor de retorno del método del procesador

1. ModelAndView

    El tipo de valor de retorno más comúnmente utilizado, Modelo, se usa para almacenar datos y finalmente se coloca en el alcance de la solicitud; Vista representa la vista y el marco usa adelante para saltar a la vista. Si el resultado del procesamiento de la solicitud requiere tanto datos como vista, es más conveniente usar ModelAndView. Si solo necesita datos y no necesita saltos de página (por ejemplo, respuesta asincrónica Ajax para actualizar datos parciales); o solo necesita saltos de página y no necesita pasar datos, no es apropiado usar ModelAndView en este momento, y siempre hay una parte que es redundante.

    @RequestMapping(value = "/noLimit.do")
    public ModelAndView doNoLimit(){
        ModelAndView modelAndView = new ModelAndView();

        // 存放数据 框架会自动将数据放到request作用域
        modelAndView.addObject("msg","hello-nolimit");

        modelAndView.setViewName("show");

        return modelAndView;
    }

2. Cadena

    Cuando el analizador de vista está configurado en el marco, el resultado de la cadena devuelto se considerará como el nombre de la vista lógica y la dirección se formará después de que se empalme el analizador de vista; si el analizador de vista no está configurado, se considerará la cadena devuelta como la ruta de la vista.

El solucionador de vistas está configurado:

    <p>处理器方法返回String表示视图名称</p>
    <form action="test/returnString-view.do" method="post">
        姓名:<input type="text" name="name"><br>
        年龄:<input type="text" name="age"><br>
        <input type="submit" value="提交">
    </form>
    @RequestMapping(value = "/returnString.do")
    public String doReturnString(HttpServletRequest request, @RequestParam(value = "name") String name, @RequestParam(value = "age") Integer age){
        System.out.println("name = " + name + ", age = " + age);
        // 手动将数据添加到request对象中
        request.setAttribute("name",name);
        request.setAttribute("age",age);
        return "showProperty";
    }

En este punto, si volvemos a la ruta del intento:

    @RequestMapping(value = "/returnString.do")
    public String doReturnString(HttpServletRequest request, @RequestParam(value = "name") String name, @RequestParam(value = "age") Integer age){
        System.out.println("name = " + name + ", age = " + age);
        // 手动将数据添加到request对象中
        request.setAttribute("name",name);
        request.setAttribute("age",age);
        return "/WEB-INF/view/showProperty.jsp";
    }

    

Obviamente, el marco trata el resultado String que devolvemos como el nombre de la vista lógica, que es empalmado por el analizador de vistas.

Nota: Cuando devolvemos el tipo String, si necesitamos reenviar datos al mismo tiempo, debemos agregar manualmente el objeto al objeto de solicitud.

3.void

    Void se utiliza cuando no hay necesidad de saltar a otras vistas después de que se procesa la solicitud. Por ejemplo, se puede usar para responder a solicitudes asincrónicas de Ajax: generar datos a través de HttpServletResponse y responder a solicitudes de Ajax.

1. Importe el archivo de la biblioteca jquery

2. Los datos de procesamiento de Ajax utilizan formato json, también necesitamos importar el paquete de dependencia de json para envolver la cadena en formato json

    <!--jackson-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>

3. Configure el evento de activación para iniciar la solicitud Ajax en la página.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="js/jquery-3.5.1.js"></script>
    <script type="text/javascript">
        $(function () {
            $("button").click(function () {
                $.ajax({
                    url:"test/returnVoid_ajax.do", // 请求路径
                    data:{ // 请求的数据
                        name:"zzt",
                        age:21
                    },
                    type:"post", // 请求方式
                    dataType:"json", // 返回数据的解析方式 json为把json格式的字符串解析为对象
                    success:function (resp) { // resp结果数据解析后的结果
                        alert(resp);
                    }
                })
            })
        })
    </script>
</head>
<body>
    <button id="btn">发起Ajax请求</button>
</body>
</html>

4. En el método del procesador, use el objeto de respuesta para devolver datos

    @RequestMapping(value = "/returnVoid_ajax.do")
    public void doReturnVoid(HttpServletResponse response,@RequestParam("name") String name, @RequestParam("age") Integer age) throws IOException {
        System.out.println("name = " + name + ", age = " + age);
        // 1.(假装)调用业务方法获取数据
        Student student = new Student(name, age);
        // 2.将结果转换成json格式的字符串
        String json = "";
        if(student != null){
            ObjectMapper objectMapper = new ObjectMapper();
            json = objectMapper.writeValueAsString(student);
            System.out.println("对象转换为json格式为 : " + json);
        }
        // 3.设置相应格式,响应请求
        response.setContentType("application/json;charset=utf-8");
        PrintWriter printWriter = response.getWriter();
        printWriter.println(json);
        printWriter.flush();
        printWriter.close();
        return;
    }

5. Resultados de la ejecución

Jquery analiza la cadena devuelta en un objeto en formato json y lo asigna al parámetro de recepción. Por supuesto, también podemos recuperar el valor en el objeto.

        success:function (resp) { // resp结果数据解析后的结果
                alert("name = " + resp.name + " age = " + resp.age);
        }

Vale la pena señalar que el atributo dataType, que se utiliza para especificar el tipo de resultado deseado, se declara en el encabezado de la solicitud:

Pero hemos especificado en el código que el formato de los datos es una cadena json para el encabezado de respuesta, y jquery también intentará analizarlo en un objeto json (usando el método JSON.parse):

4.Objeto

        En el tercer método, para la respuesta a la solicitud Ajax, necesitamos convertir permanentemente el objeto en una cadena json y usar el objeto de respuesta para devolver los datos. Esta es una operación redundante común. Por supuesto, también podemos extraer la parte común a través de la clase de herramienta, pero SpringMVC también proporciona otra forma, que es usar el objeto como valor de retorno. Si usamos este método, incluso si se devuelve el tipo String, el marco no lo tratará como un nombre de vista o un nombre de vista lógica, sino solo como los datos pasados.

        La anotación @ResponseBody colocará los datos del resultado en el cuerpo de la respuesta.

A. Pasar tipos de objetos ordinarios

1. Agregue la dependencia de Jackson

Jaskson es la dependencia json predeterminada de Spring MVC.

    <!--jackson-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>

2. Configurar <mvc: controlado por anotaciones /> basado en anotaciones

    <!--配置注解驱动-->
    <mvc:annotation-driven/>

Tenga en cuenta que también hay anotaciones en Spring, aquí vamos a utilizar las anotaciones en SpringMVC, no se equivoque.

<mvc: annotation-drive> creará automáticamente una clase de implementación para la interfaz HttpMessageConverter (conversor de mensajes) después de agregar la configuración.

Normalmente usamos StringHttpMessageConverter (creado de forma predeterminada) y MappingJackson2HttpMessageConverter (creado solo después de que se configura el controlador de anotaciones).

HttpMessageConverter: La interfaz del conversor de mensajes define el método para convertir objetos java en json, xml, flujo binario y otros formatos de datos. Tiene muchas clases de implementación, que son responsables de la conversión de objetos java.

Pasos de conversión: 1. Llame al método canWrite definido en la interfaz para determinar si se puede realizar la conversión.

                  2. Llame al método de escritura definido en la interfaz para completar la conversión del formato de datos.

Esto corresponde a la parte que acabamos de implementar manualmente:

        String json = "";
        if(student != null){
            ObjectMapper objectMapper = new ObjectMapper();
            json = objectMapper.writeValueAsString(student);
            System.out.println("对象转换为json格式为 : " + json);
        }

3. Agregue @ResponseBody al método del procesador

@ResponseBody es responsable de poner la salida en el cuerpo de la respuesta, además del método anotado con @ResponseBody, el valor de retorno no se usará como el nombre de la vista lógica o la ruta de la vista (específicamente String).

    @ResponseBody
    @RequestMapping(value = "/returnVoid_ajax.do")
    public Student doReturnVoid(HttpServletResponse response,@RequestParam("name") String name, @RequestParam("age") Integer age) throws IOException {
        System.out.println("name = " + name + ", age = " + age);

        Student student = new Student(name, age);
        return student;
    }

Esto corresponde a la parte que acabamos de implementar manualmente:

        response.setContentType("application/json;charset=utf-8");//响应数据格式
        PrintWriter printWriter = response.getWriter();
        printWriter.println(json);
        printWriter.flush();
        printWriter.close();

4. Resultados de la ejecución

5. Pasos de ejecución detallados

1. El contenedor usará una Lista para almacenar todos los convertidores de mensajes ArrayList <HttpMessageConverter> (Después de que el controlador de anotación entre en vigor, el objeto MappingJackson2HttpMessageConverter se creará y se colocará en la lista)

2. Para el objeto Student devuelto, el marco atravesará todos los convertidores de mensajes de la lista y llamará a su método canWrite () para determinar qué convertidor de mensajes implementa el objeto de clase que puede convertir el objeto Student.

3. Después de determinar el objeto conversor de mensajes, use su método write () para completar la conversión (Student es un objeto y debe convertirse al formato json)

4. La anotación @ResponseBody significa que el resultado devuelto se coloca en la respuesta

B. Recogida de pases

    @ResponseBody
    @RequestMapping(value = "/returnVoid_ajaxList.do")
    public List<Student> doReturnVoidList(HttpServletResponse response, @RequestParam("name") String name, @RequestParam("age") Integer age) throws IOException {
        System.out.println("name = " + name + ", age = " + age);

        List<Student> students = new ArrayList<>();
        Student student = new Student(name, age);
        students.add(student);
        student = new Student("辅助",20);
        students.add(student);
        return students;
    }

Lo que se devuelve en este momento es una matriz de cadenas json, podemos usar la función de bucle que viene con jquery para recorrer el valor:

                $.ajax({
                    url:"test/returnVoid_ajaxList.do", // 请求路径
                    data:{ // 请求的数据
                        name:"zzt",
                        age:21
                    },
                    type:"post", // 请求方式
                    dataType:"json", // 要求返回的数据类型是json格式的字符串
                    success:function (resp) { // resp结果数据解析后的结果
                        //alert("name = " + resp.name + " age = " + resp.age);
                        $.each(resp,function (i,student) {
                            alert(student.name + "--" + student.age)
                        })
                    }
                })

C.La cadena pasada solo se usa como datos de texto ordinarios

    @ResponseBody
    @RequestMapping(value = "/returnStringAjax.do")
    public String doReturnStringAjax(){
        return "返回的是字符串不是数据";
    }

Usamos ajax para enviar la solicitud:

                $.ajax({
                    url:"test/returnStringAjax.do", // 请求路径
                    data:{ // 请求的数据
                        name:"zzt",
                        age:21
                    },
                    type:"post", // 请求方式
                    dataType:"json", // 要求返回的数据类型是json格式的字符串
                    success:function (resp) { // resp结果数据解析后的结果
                        //alert("name = " + resp.name + " age = " + resp.age);
                        /*$.each(resp,function (i,student) {
                            alert(student.name + "--" + student.age)
                        })*/
                        alert("返回文本数据:" + resp);
                    }
                })

No hay una ventana emergente en este momento, pero la solicitud ajax se envió con éxito y se recibió la respuesta. La clave es que debido a que establecemos el requisito de que el tipo de retorno sea el formato json, pero en realidad devolvemos String, que es no se realiza mediante el método proporcionado por jackson Converted, por lo que se produjo una falta de coincidencia de formato y se interrumpió la ejecución.La solución es cambiar el valor de dataType a text, lo que indica que el resultado son datos de texto.

Ahora nos hemos encontrado con el segundo problema. No hay ningún error en la ejecución, pero los datos no se pueden analizar:

Al observar el encabezado de la respuesta, se encuentra que el formato de codificación predeterminado en la respuesta es ISO-8859-1. Este formato de codificación no puede analizar el chino normalmente. Necesitamos configurar manualmente el formato de codificación en utf-8: [Nota] Hemos configurado antes de Filtrado, pero los datos devueltos por la solicitud Ajax no pasarán el filtro, por lo que debe configurarse manualmente.

Utilice el atributo produce de @RequestMapping para establecer el formato de codificación ContentType:

    @ResponseBody
    @RequestMapping(value = "/returnStringAjax.do", produces = "text/plain;charset=utf-8")
    public String doReturnStringAjax(){
        return "返回的是字符串不是数据--SpringMVC";
    }

[Nota]: StringHttpMessageConverter convierte el valor de retorno del tipo String.

 

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_39304630/article/details/112919407
Recomendado
Clasificación