SpringMVC的请求和响应ModelAndView,Model,ResponseBody

 一:SpringMVC 输出模型数据

springMVC提供了以下几种途径输出模型数据

1) ModelAndView: 处理方法返回值类型为 ModelAndView , 方法体即可通过该对象添加模型数据

2) Map Model: 入参为 org.springframework.ui.Model

org.springframework.ui.ModelMap java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。

1.1 ModelAndView介绍

控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型信息。(我们返回界面的时候想携带参数给界面,可以使用ModelAdnView)

1) 两个重要的成员变量:

  MoelAndView addObject(String attributeName, Object attributeValue)   设置模型数据

  ModelAndView addAllObject(Map<String, ?> modelMap)

3)添加模型数据:

  MoelAndView addObject(String attributeName, Object attributeValue)   设置模型数据

  ModelAndView addAllObject(Map<String, ?> modelMap)

 4)设置视图: 

void setView(View view)                设置视图对象
void setViewName(String viewName)     设置视图名字

5)获取模型数据

      protected Map<String, Object> getModelInternal()   获取模型数据
      public ModelMap getModelMap()
      public Map<String, Object> getModel()

 

`

SpringMVC的数据响应

下面的数据相应需要提前配置好,视图解析器

如jsp界面直接在webapp下与WEB-INF同目录那么我们就使用如下的视图解析配置

SpringMvc.xml

 

<!--    配置试图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>   <!--  所有的前端界面都在webapp目录下-->
        <property name="suffix" value=".jsp"/><!--所有的返回界面都事.jsp结尾的-->
    </bean>

 

 

 

01-SpringMVC的数据响应-数据响应方式(理解)

1) 页面跳转

直接返回字符串

通过ModelAndView对象返回

2) 回写数据

直接返回字符串

返回对象或集合

02-SpringMVC的数据响应-页面跳转-返回字符串形式(应用)

 

 

 

03-SpringMVC的数据响应-页面跳转-返回ModelAndView形式1(应用)

 在Controller中方法返回ModelAndView对象,并且设置视图名称

 

    /**
     * 在Controller中方法返回ModelAndView对象,并且设置视图名称
     * @return
     */
    @RequestMapping(value = "quickOne",method = RequestMethod.GET)
    public ModelAndView quick(){
       /*
        model:模型,作用封装数据
        view: 视图,用作展示数据
         */
        ModelAndView modelAndView = new ModelAndView();
        //设置返回的数据
        modelAndView.addObject("username","我是ModelAndView");
        //设置返回的视图
        modelAndView.setViewName("quick");   返回的试图,这样的显示事需要配置视图解析器的
        return modelAndView;
    }

在跳转视图的时候前端的el表达式无法解析的时候就

在前端上加入以下标签让其不屏蔽el表达式

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" isELIgnored="false"%>

 

前端

jsp界面

<%--<%@ page contentType="text/html;charset=UTF-8" language="java" %>--%>
<%--如果需要使用后el表达式需要将自带的界面设置修改为以下的--%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" isELIgnored="false"%>
<html>
<head>
    <title>Title</title>
</head>
<body>

This is oneDy;
<%--jsp界面取值modelAndView中的值,直接${}就可以--%>
${username}   

</body>
</html>

 

 

 

04-SpringMVC的数据响应-页面跳转-返回ModelAndView形式2(应用)

在Controller中方法形参上直接声明ModelAndView,无需在方法中自己创建,在方法中直接使用该对象设置视图,同样可以跳转页面

    @RequestMapping(value = "/quickTwo")
    public ModelAndView quick1(ModelAndView modelAndView){ // springMvc可以给你的参数进行自动注入,不需要你的这个形参再去手动实例化赋值了
        modelAndView.addObject("username","我是自动赋值的ModelAndView");
        modelAndView.setViewName("quick");
        return modelAndView;
    }

 

05-SpringMVC的数据响应-页面跳转-返回ModelAndView3(应用)

在Controller方法的形参上可以直接使用原生的HttpServeltRequest对象,只需声明即可

 
    /**
     * 使用原生的HttpServeltRequest对象,将参数放置在request域中
     * @param request
     * @return
     */
    @RequestMapping(value = "/quickFour")
    public String quick3(HttpServletRequest request){
        request.setAttribute("username","我是参数放置在request域中的");
        return "quick";
    }

06-SpringMVC的数据响应-回写数据-直接回写字符串(应用)

通过SpringMVC框架注入的response对象,使用response.getWriter().print(“hello world”) 回写数据,此时不需要视图跳转,业务方法返回值为void

将需要回写的字符串直接返回,但此时需要通过@ResponseBody注解告知SpringMVC框架,方法返回的字符串不是跳转是直接在http响应体中返回

    /**
     * RrsponseBody注解不进行视图跳转,直接进行数据响应
     * @return
     */
    @RequestMapping("/quickSeven")
    @ResponseBody  //告知SpringMVC框架 不进行视图跳转 直接进行数据响应
    public String quick6(){
        return "你好,我是直接返回数据的responseBody注解的方法";
    }
    @RequestMapping("/quickSix")
    public void quick5(HttpServletResponse response) throws IOException {
        response.getWriter().println("hello");  // 直接返回数据,不返回特定界面
    }

07-SpringMVC的数据响应-回写数据-直接回写json格式字符串(应用)

   /**
     * 直接回写json字符串
     * @return
     */
    @RequestMapping("/quickEight")
    @ResponseBody
    public String quick7(){
        return "{\"username\":\"zhangsan\",\"age\":18}";
    }

手动拼接json格式字符串的方式很麻烦,开发中往往要将复杂的java对象转换成json格式的字符串,我们可以使用web阶段学习过的json转换工具jackson进行转换,通过jackson转换json格式字符串,回写字符串

 

<!-- 导入json转化的包-->
    <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>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.0</version>
    </dependency>
导入json转换所需要的包

 

@RequestMapping(value="/quick9")
    @ResponseBody
    public String save9() throws IOException {
        User user = new User();
        user.setUsername("lisi");
        user.setAge(30);
        //使用json的转换工具将对象转换成json格式字符串在返回
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(user);

        return json;
    }

08-SpringMVC的数据响应-回写数据-返回对象或集合(应用)

通过SpringMVC帮助我们对对象或集合进行json字符串的转换并回写,为处理器适配器配置消息转换参数,指定使用jackson进行对象或集合的转换,因此需要在spring-mvc.xml中进行如下配置:

<!--    配置处理器映射器,将你的返回的集合可以直接以json格式返回-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
            </list>
        </property>
    </bean>

 

    @RequestMapping("/quickNine")
    @ResponseBody
    //期望SpringMVC自动将User转化为json格式的字符串
    public User quick8(){
        User user = new User();
        user.setUsername("li");
        user.setAge(30);
        return user; //直接返回User用户对象的数据 因为springMVC.xml中已经配置了处理器映射器,所以可以直接返回json格式
    }

 

上面返回对象或者集合的方法太繁琐了我们可以直接使用注解驱动来代替

09-SpringMVC的数据响应-回写数据-返回对象或集合2(应用)

 @ResponseBody

在方法上添加@ResponseBody就可以返回json格式的字符串,但是这样配置比较麻烦,配置的代码比较多,因此,我们可以使用mvc的注解驱动代替上述配置

 在springMVC.xml中配置

<mvc:annotation-driven/>
首先要在springMVC中导入mvc命名空间

 

    @RequestMapping("/quickNine")
    @ResponseBody
    //期望SpringMVC自动将User转化为json格式的字符串
    public User quick8(){
        User user = new User();
        user.setUsername("li");
        user.setAge(30);
        return user; //直接返回User用户对象的数据 因为springMVC.xml中已经配置了注解驱动,所以可以直接返回json格式
    }

 

在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。

使用<mvc:annotation-driven />自动加载 RequestMappingHandlerMapping(处理映射器)和

RequestMappingHandlerAdapter( 处 理 适 配 器 ),可用在Spring-xml.xml配置文件中使用

<mvc:annotation-driven />替代注解处理器和适配器的配置。

同时使用<mvc:annotation-driven />

默认底层就会集成jackson进行对象或集合的json格式字符串的转换

 

 

数据响应----Model

Model:只返回参数,我们要搭配return来使用

    /**
     * Model是只设置返回的参数,界面要搭配return来返回,所以我们使用Model要搭配return来使用
     * @param model
     * @return
     */
    @RequestMapping(value = "/quickFive")
    public String quick4(Model model){
        model.addAttribute("username","我是只设置参数的Model");
        return "quick"; // Model设置并返回了参数,界面就直接以return来返回
    }

 

 

 

 

SpringMVC的数据响应-知识要点小结(理解,记忆)

1) 页面跳转

直接返回字符串

通过ModelAndView对象返回

2) 回写数据 

直接返回字符串

HttpServletResponse 对象直接写回数据,HttpServletRequest对象带回数据,Model对象带回数据或者@ResponseBody将字符串数据写回

返回对象或集合 

@ResponseBody+`<mvc:annotation-driven/>   `

 

 

 

.

posted @ 2021-01-12 18:10  可爱的红领巾  阅读(1380)  评论(0编辑  收藏  举报