1.什么是视图?
视图就是展示给用户看的结果。可以是很多形式,例如:html、JSP、excel表单、Word文档、PDF文档、JSON数据、freemarker模板视图等等。
2.传统JSP和JSTL视图?
我们使用的internalResourceViewResolver解析器,默认支持JSP视图,而JSP中最常用的莫过于JSTL标签库了:该解析器默认使用的是JSTL解析器,要想使用JSTL标签需要导入JSTL的依赖
jstl jstl 1.2 jstl jstl
将一个user的集合放入模型中返回:数据如何在页面渲染
@RequestMapping(value="/show3") public ModelAndView show3(){ //创建模型视图,指定视图名 ModelAndView mv=new ModelAndView("user-list"); //创建用户列表,用于页面展示 Listusers=new ArrayList (); for(int i=0;i<10;i++){ User user=new User(); user.setId(Long.valueOf(i)); user.setAge(20+i); user.setname("张三"+i); user.setUsername("zhangsan_"+i); user.add(user); } //把用户列表添加到模型中 mv.addObject("users",users); return mv; }
在页面中引入JSTL标签库:
引入代码:<<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c">
ID | UserName | Name | Age |
---|---|---|---|
${user.id} | ${user.username} | ${user.name} | ${user.age} |
3.JSON视图
在实际开发中,我们经常需要以JSON的格式进行数据的传输,所以在SpringMVC中提供了一种非常便捷的方式来返回一个JSON视图。SpringMVC的JSON功能,底层依赖的是Jackson这个JSON工具
使用这个工具必须要引入该依赖:
com.fasterxml.jackson.core jackson-databind
编写controller类,该注解@ResponseBody返回的是一个JSON视图(springmvc或自动把返回值转换为JSON格式)
@RequestMapping(value="test2") @ResponseBody public Listtest2(){ User user = new User(); List users=new ArrayList<>(); for (int i = 0; i < 10; i++) { user.setAge(23); user.setName("kater"); user.setSex(1); user.setuserName("pick"); users.add(user); } return users; }
原理:
1) 当SpringMVC读取到方法上的@ResponseBody注解时,就知道该方法不再使用默认的视图解析器解析视图,而是直接把结果写到响应体中,这样就需要对结果进行转换。
2) SpringMVC会从框架中查找有没有定义MessageConvertor(消息转换器),通过消息转换器转换结果,返回对应视图
3) 在SpringMVC的注解驱动类中,会进行默认的消息转换器注册,因为我们引入了jacksonJson包,所以会注册JSON的消息转换器
注解驱动类中的代码:
4) 因为只有JSON消息转换器可以对Java对象序列化,因此这里默认用了JSON转换
3.直接返回视图名称
SpringMVC允许直接返回一个String数据,作为视图名称。不需要数据模型。
@RequestMapping(value="test3") public String test3(){
//如果只是访问页面,就不需要ModelAndView对象,直接返回一个字符串即可 return "index"; //访问的是index.jsp页面 }
也可以把视图和模型分离,不需要Model中的数据
@RequestMapping(value="test5") public String test5(Model model){ model.addAttribute("msg","我试试Model好不好用"); return "index"; //访问的是index.jsp页面 }
4.重定向视图和转发视图?
转发和重定向的区别?
(1)转发的是同一次请求;重定向是两次不同请求
(2)地址栏的地址发生变化的为重定向,不发生变化的为转发
(3)转发数据不丢失,重定向数据丢失
5.不返回视图和JSON数据,只是返回成功的状态码?
注解:@ResponseStatus(HttpStatus.OK) controller类无返回值的方法