一. 响应
文章目录
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
弄混了:
@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字符串”。
④ 我还是分不清页面跳转和回写数据?
页面跳转是跳到了另一个展示全新信息的页面,回写数据只是对原本页面所展示信息的部分修改;至于操作域中的键值对,就是另外一码事了。