Serie SpringMVC de SSM (tres) ---- datos de respuesta y vista de resultados

En el último artículo, hablamos sobre la vinculación de los parámetros de solicitud de SpringMVC y las anotaciones comunes . Ahora hablemos de los datos de respuesta y la vista de resultados en SpringMVC.

Datos de respuesta y vista de resultados

(Controller)El valor de retorno del método en el controlador puede ser uno de los siguientes:

  • String Tipo de cadena
  • void Sin valor de retorno
  • ModelAndView SpringMVC nos proporciona un objeto que puede contener datos y vistas
  • JavaBean 对象( jsonResponder por datos)

El valor de retorno es String

  • Cuando el controlador devuelve un Stringtipo, el valor predeterminado es devolver el nombre de la vista lógica , que luego el solucionador de la vista analiza en la dirección de la vista física y, finalmente, la capa inferior reenvía la solicitud a la página correspondiente a través del reenvío de solicitudes .

  • Entorno para construir frente a ti puedes ir y ver mi artículo anterior Portal

  • response.jspCódigo:

<a href="user/testString">testString</a>
  • Código del controlador
@Controller
@RequestMapping("/user")
public class UserController {
    
    

    /**
     * 返回值为 String ,结合 model 对象保存数据
     * @param model
     * @return
     */
    @RequestMapping("/testString")
    public String testString(Model model){
    
    
        System.out.println("testString执行了。。。");
        // 模拟从数据库中查询出User对象
        User user = new User();
        user.setUsername("老王");
        user.setPassword("123");
        user.setAge(30);
        // model对象
        model.addAttribute("user",user);
        return "success";
    }
}

El valor devuelto es nulo

  • Cuando se utiliza voidcomo valor de retorno de un método de controlador, la ruta de reenvío predeterminada@RequestMapping después de que finaliza la ejecución del método es la ruta vinculada al método actual, que es el valor en . Pero el hecho de que el valor de retorno también se analice en el solucionador de vista , por lo que generalmente informa 404errores. Por ejemplo, en este momento hay un método de controlador:
@RequestMapping("/testVoid")
    public void testVoid(Model model){
    
    
        System.out.println("testString执行了。。。");
    }

Inserte la descripción de la imagen aquí

  • Si solo desea usar voidel valor de retorno, también desean responder a la solicitud, como reenviar o redirigir la solicitud, entonces podemos usar Servletpara proporcionar parámetros de método de API nativos como el controlador
  • Solicitud de reenvío
@RequestMapping("/testVoid")
    public void testVoid(HttpServletRequest request, HttpServletResponse response)throws Exception{
    
    
        System.out.println("testString执行了。。。");
        // 转发是一次请求,无需加项目虚拟目录,但是因为直接通过原生api进行转发,不会经过视图解析器,所以应该写具体路径
        request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
        // 转发或重定向后,如果还有代码,会继续执行,此时可以使用 return; 结束
        return;
    }
  • Redirigir
 @RequestMapping("/testVoid")
    public void testVoid(HttpServletRequest request, HttpServletResponse response)throws Exception{
    
    
        System.out.println("testString执行了。。。");
        // 重定向,需要项目虚拟目录
        response.sendRedirect(request.getContextPath()+"/index.jsp");
        return;
    }
  • Genere una respuesta directamente como el cliente, como responder a los datos json
@RequestMapping("/testVoid")
    public void testVoid(HttpServletRequest request, HttpServletResponse response)throws Exception{
    
    
        System.out.println("testString执行了。。。");
        // 解决中文乱码
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        // 直接会进行响应
        response.getWriter().print("你好");
        return;
    }

Cuando los parámetros del método contengan HttpServletResponse, incluso si el cuerpo del método sin ningún tratamiento, después de que el método no salte a otra página. Respecto a este punto, consulta la documentación oficial porque SpringMVC pensará que ha respondido a la solicitud en este momento, por lo que no nos ayudará a saltar a otras páginas.

El valor de retorno es ModelAndView

  • Cuando el método devuelve el valor del controlador ModelAndView, cuando de hecho es equivalente al valor de retorno de una primera realización Stringjunto con los parámetros Model, ya que ModelAndViewpueden ser datos entrantes (utilizando la página directamente adquirido expresiones EL:) ${attributeName}, pero también se puede proporcionar El nombre de la vista lógica a la que saltar.

  • success.jspCódigo:

<body>
    <h3>执行成功</h3>
    ${requestScope.user}
</body>
  • Método de controlador
    /**
     * 返回ModelAndView
     * @return
     */
    @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView(){
    
    
        // 创建ModelAndView对象
        ModelAndView mv = new ModelAndView();
        System.out.println("testModelAndView方法执行了...");
        // 模拟从数据库中查询出User对象
        User user = new User();
        user.setUsername("小王");
        user.setPassword("456");
        user.setAge(20);
        // 把user对象存储到mv对象中,也会把user对象存入到request对象
        mv.addObject("user",user);

        // 跳转到哪个页面
        mv.setViewName("success");
        return mv;
    }

Solicitar reenvío y redireccionamiento

  • El método del controlador cuando el valor de retorno del Stringtiempo, el valor predeterminado es reenviar la solicitud , también nos puede gustar el ejemplo anterior, el uso de la API de Servlet nativa reenviar o redirigir la solicitud para completar. Sin embargo, SpringMVC también nos proporciona otra forma de usar forward:y redirect:palabras clave.
    /**
     * 使用关键字的方式进行转发或者重定向
     * @return
     */
    @RequestMapping("/testForwardOrRedirect")
    public String testForwardOrRedirect(){
    
    
        System.out.println("testForwardOrRedirect方法执行了...");

        // 请求的转发 forward: 关键字转发,不会使用视图解析器
        // return "forward:/WEB-INF/pages/success.jsp";

        // redirect: 关键字重定向,不用加项目路径
        return "redirect:/index.jsp";
    }
  • Para las forward:palabras clave, de acuerdo con la documentación oficial, la capa inferior también usa la API nativa de Servlet para el reenvío, es decir RequestDispatcher.forward(), no pasa por el solucionador de vistas, por lo que la ruta de reenvío requiere una ruta específica.

Inserte la descripción de la imagen aquí
Cabe señalar que si se utiliza, la formward:ruta debe escribirse como la vista realurl , no como la vista lógica.
Es equivalente a " request.getRequestDispatcher("url").forward(request,response)". Al usar el reenvío de solicitudes, se puede reenviar a jsp u otros métodos de controlador.

  • Para las response:palabras clave, de acuerdo con la documentación oficial, SpringMVC redirigirá de acuerdo con el contexto de Servlet actual, por lo que no es necesario escribir la ruta del proyecto.
    Inserte la descripción de la imagen aquí
    Es equivalente a " response.sendRedirect(url)". Cabe señalar que si se le redirige a una página jsp, la página jsp no se puede escribir en el WEB-INFdirectorio; de lo contrario, no se puede encontrar .

Utilice @RequestBody y @ResponseBody para la interacción json

  • En un desarrollo, la mayoría de las veces el cliente envía jsondatos, el servidor recibe jsonlos datos y el análisis, y luego genera una jsonrespuesta al cliente. Esta vez podemos usar @RequestBodyy @ResponseBodycompletar jsondatos interactivos.
  • response.jspCódigo:
<%--
  Created by IntelliJ IDEA.
  User: 15728
  Date: 2021/2/19
  Time: 20:49
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="js/jquery.min.js"></script>
    <script>
        // 页面加载,绑定单击事件
        $(function(){
    
    
           $("#btn").click(function () {
    
    
              //alert("你好");
               // 发送ajax请求
               $.ajax({
    
    
                   //编写json格式,设置属性和值
                   url:"user/testAjax",
                   contentType:"application/json;charset=UTF-8",
                   data:'{"username":"一个Java小白","password":"123","age":18}',
                   dataType:"json",
                   type:"post",
                   success:function (data) {
    
    
                       // data服务器端响应的json的数据,进行解析
                       alert(data);
                       alert(data.username);
                       alert(data.password);
                       alert(data.age);
                   }
               });
           });
        });

    </script>
</head>
<body>
    <button id="btn">发送ajax的请求</button>
</body>
</html>

Debido a que hemos configurado el controlador frontal DispatcherServlet, todas las solicitudes serán interceptadas, incluidos los recursos estáticos. Para evitar que lo importado jquery.jssea ​​interceptado, debemos springmvc.xmlconfigurar para no interceptar recursos estáticos en el archivo de configuración.

  <!--前端控制器,哪些静态资源不拦截-->
  <mvc:resources location="/css/" mapping="/css/**"/> <!-- 样式 -->
  <mvc:resources location="/images/" mapping="/images/**"/> <!-- 图片 -->
  <mvc:resources location="/js/" mapping="/js/**"/> <!-- javascript --> 
  • locationAtributo: especifique webappel paquete en el directorio
  • mappingPropiedades: expresadas en /statictodas las rutas solicitadas comenzando
  • Código del controlador
 /**
     * 模拟异步请求响应
     */
    @RequestMapping("/testAjax")
    public @ResponseBody User testAjax(@RequestBody User user){
    
    
        System.out.println("testAjax方法执行了...");
        // 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
        System.out.println(user);
        // 做响应,模拟查询数据库
        user.setUsername("一个Java小白2");
        user.setAge(20);
        // 做响应
        return user;
    }
  • El cliente envía una jsoncadena, utilizando el servidor que @RequestBodyadquiere el cuerpo de la solicitud de contenido, y el uso de jacksonla jsoncadena se encapsula en el objeto Usuario; el servidor utiliza @ResponseBodypara generar una respuesta jacksondel objeto Usuario json en una cadena.
  • SpringMVC utiliza MappingJacksonHttpMessageConverterde forma predeterminada para la conversión, por lo que necesita importar jacksonla dependencia
	<dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
    <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-annotations</artifactId>
      <version>2.9.0</version>
    </dependency>

Importa errores, de la misma forma. Portal

  • Cuando use jackson para convertir automáticamente entre objetos json y JavaBean, debe asegurarse de que las claves de la cadena json correspondan a los nombres de los atributos de JavaBean uno a uno

Supongo que te gusta

Origin blog.csdn.net/weixin_43844418/article/details/113871281
Recomendado
Clasificación