【SpringMVC】响应——跳转/修改视图页面+操作域中的键值对

一. 响应


1 数据响应方式

1)页面跳转 —— 直接返回字符串 / 返回ModelAndView对象

2)回写数据 —— 直接返回字符串 / 返回对象或集合

2.1 页面跳转-直接返回字符串

直接return的字符串会与在spring-mvc.xml配置的视图解析器的前后缀进行拼接。

@RequestMapping("/test0")
public String test0() {
    
    
    return "hello.jsp";
}

2.2 页面跳转-返回ModelAndView对象

-------------------------------------------------------------------------------------------

形式1: 在方法内部`new`出一个ModelAndView对象,并设置其模型和视图
形式2: 方法的参数直接写ModelAndView,SpringMVC就会自动帮我们创建这个对象,我们在方法内部就可以直接使用
形式3: 方法的参数直接写HttpServletRequest,我们之前学习Web时就是利用该对象向request域设置数据的(不推荐这种原生方法)

-------------------------------------------------------------------------------------------

@RequestMapping("/test1")
public ModelAndView test1() {
    
    
    ModelAndView modelAndView = new ModelAndView();
    // 设置模型
    modelAndView.addObject("username", "Alice");
    // 设置视图
    modelAndView.setViewName("hello.jsp");
    return modelAndView;
}


@RequestMapping("/test2")
public ModelAndView test2(ModelAndView modelAndView) {
    
    
    // 设置模型
    modelAndView.addObject("username", "Alice");
    // 设置视图
    modelAndView.setViewName("hello.jsp");
    return modelAndView;
}

@RequestMapping("/test2")
public String test2(Model model) {
    
    
	// 这种写法不难理解
    model.addAttribute("username", "Alice");
    return "hello.jsp";
}


@RequestMapping("/test3")
public String test3(HttpServletRequest request) {
    
    
	// 之前学习Web时就是利用该对象向request域设置数据的(原生写法,并未使用框架)
    request.setAttribute("username", "Alice");
    return "hello.jsp";
}

 
 

3.1 回写数据-直接返回字符串

在学习Web时,回写数据的写法是response.getWriter().print(“hello world”)。在SpringMVC框架中,我们也可以(但不推荐)使用这种使用原生Request/Responce对象的写法:

@RequestMapping("/test4")
public void test4(HttpServletResponse response) throws IOException {
    
    
    response.getWriter().print("萝莉suki");
}

我们甚至可以直接return字符串——只需要使用 @ResponseBody 注解,告诉框架别和视图跳转的直接return弄混了:

扫描二维码关注公众号,回复: 12934432 查看本文章
@RequestMapping("/test5")
@ResponseBody
public String test5() {
    
    
    return "萝莉suki";
}

3.2 回写数据-直接返回json格式字符串

实际开发场景中,我们返回的都是json字符串。使用jackson可以直接将对象转化为json字符串,极其方便。

@RequestMapping("/test6")
@ResponseBody
public String  test6() throws IOException {
    
    
    User user = new User("Alice", 12);
    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writeValueAsString(user);
    return json;
}

3.3 回写数据- 返回对象或集合

这种“将对象转化为json字符串”的操作极其频繁,总是使用上面的方法似乎很麻烦。幸好,SpringMVC框架竟然可以自动实现这种转化,而我们只需要进行简单的配置(spring-mvc.xml)。

另外,不要忘记写 @ResponseBody 注解哦!

<!-- 配置处理器适配器 -->
<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("/test7")
@ResponseBody
public User test7() throws IOException {
    
    
	// 直接返回对象/集合即可,框架帮我们做好了一切
    User user = new User("Alice", 12);
    return user;
}

甚至,还可以更简单。

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

RequestMappingHandlerAdapter(处理器适配器),而且,其默认的底层已经集成Jackson的自动转换。

也就是说,上面复杂无比的配置变成了下面的一句话:

<!-- 配置mvc注解驱动(自动加载处理器映射器+处理器适配器) -->
<mvc:annotation-driven />

 
 

4. 混淆点讲解

① 页面跳转中的“返回ModelAndView对象”中的“Model”,不算是回写数据吗?

  这是两回事。返回的“Model”的确是数据,但这些数据其实是写到了Request域中;而“回写数据”指的是通过Responce,将一些数据直接写到了所展示的页面上。

② 我有时会弄不清,或者忘记写 @ResponseBody 注解,怎么判断是写还是不写呢?

  很简单。关于“页面跳转”的,本质是使用了Request对象,因而不写该注解;关于“回写数据”的,本质是使用了Responce对象,因而要写该注解。换句话说,加了@ResponseBody注解的含义就是告诉SpringMVC框架 不跳转

③ 响应时的回写数据,可否理解为“既能回写字符串,又能回写对象/集合”?

  回写的其实是“普通字符串和json字符串”。

④ 我还是分不清页面跳转和回写数据?

页面跳转是跳到了另一个展示全新信息的页面,回写数据只是对原本页面所展示信息的部分修改;至于操作域中的键值对,就是另外一码事了。

在这里插入图片描述

 
 
 
 

 
 
 
 

 
 
 
 

More >_<

猜你喜欢

转载自blog.csdn.net/m0_46202073/article/details/114304113