SpringMVC响应数据与视图

😂 这篇文章最后更新于1709天前,您需要注意相关的内容是否还可用。
目录导航
  • 响应数据与视图
    • 返回字符串
    • 返回void
    • Model与ModelAndView
      • Model
      • ModelAndView
    • ResponseBody返回json
    • RequestBody转对象
  • 响应数据与视图

    返回字符串

    Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。

        @RequestMapping(value="/hello")
        public String sayHello() {
            // 跳转到success页面
            return "success";
        }

    返回void

    1、默认会跳转到同mapping同名的页面,如@RequestMapping(value="/hello") 默认跳转到hello页面,不存在报404

    2、已知道Servlet 原始 API 可以作为控制器中方法的参数,可使用其做转发或重定向

        @RequestMapping(value = "/initAdd")
        public void initAdd(HttpServletRequest request, HttpServletResponse response) throws
                Exception {
            System.out.println("请求转发或者重定向");
    // 请求转发 转发网址栏地址不变 页面变
    // request.getRequestDispatcher("/WEB-INF/pages/add.jsp").forward(request,response);
    // 重定向 跳转网址会产生变化
    // response.sendRedirect(request.getContextPath()+"/add2.jsp");
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=UTF-8");
    // 用getWriter()直接响应数据
            response.getWriter().print("你好");
            return;
        }

    3、使用SpringMVC关键字进行转发与重定向

    如下重定向与转发不仅仅可以跳页面也能跳到其他Controller的mapping

    //"forward:转发的JSP路径",不走视图解析器了,所以需要编写完整的路径
    //转发
    	@RequestMapping("/delete")
        public String delete() throws Exception {
    // return "forward:/WEB-INF/pages/success.jsp";
            return "forward:/user/findAll";
        }
    
    //重定向 到本机不需要完整路径
        @RequestMapping("/count")
        public String count() throws Exception {
            return "redirect:/add.jsp";
    // return "redirect:/user/findAll";
        }

    Model与ModelAndView

    Model

    Model作为参数可调用其addAttribute方法添加数据到request域,如下:

        @RequestMapping(value = "/initUpdate")
        public String initUpdate(Model model) {
    // 模拟从数据库中查询的数据
            User user = new User();
            user.setUsername("张三");
            model.addAttribute("user", user);
            return "update";
        }

    在jsp页面可通过${ requestScope }${ user.username }调用request中内容。

    ModelAndView

    ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图。它可以同时传入跳转页面名与数据对象,与上方Model功能差不多。只是Model将数据存在Model中,返回String页面名称,一般作为参数,但ModelAndView是作为返回值的。

        /**
         * 返回ModelAndView对象
         * 可以传入视图的名称(即跳转的页面),还可以传入对象。
         *
         * @return
         * @throws Exception
         */
        @RequestMapping(value = "/findAll")
        public ModelAndView findAll() throws Exception {
            ModelAndView mv = new ModelAndView();
    // 跳转到list.jsp的页面
            mv.setViewName("list");
    // 模拟从数据库中查询所有的用户信息
            List<User> users = new ArrayList<>();
            User user1 = new User();
            user1.setUsername("张三");
            user1.setPassword("123");
            User user2 = new User();
            user2.setUsername("赵四");
            user2.setPassword("456");
            users.add(user1);
            users.add(user2);
    // 添加对象
            mv.addObject("users", users);
            return mv;
        }

    JSP页面开启c标签调用

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    获取集合中值通过forEach遍历

    <c:forEach items="${ users }" var="user">
    ${ user.username }
    </c:forEach>

    ResponseBody返回json

    @ResponseBody注解写在方法上或者方法返回的类型前,或者写在类上或者使用@RestCotroller注解

    public @ResponseBody Address testJson(@RequestBody String body) {}

    RequestBody转对象

    上述代码如果@RequestBody注解修饰的String变量封装成JavaBean对象

    public @ResponseBody Address testJson(@RequestBody Address address) {}

    使用jackson添加jar包即可,Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换

    <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>