zoukankan      html  css  js  c++  java
  • springmvc返回视图(解析)

    1.什么是视图?

    视图就是展示给用户看的结果。可以是很多形式,例如:html、JSP、excel表单、Word文档、PDF文档、JSON数据、freemarker模板视图等等。

    2.传统JSP和JSTL视图?

    我们使用的internalResourceViewResolver解析器,默认支持JSP视图,而JSP中最常用的莫过于JSTL标签库了:该解析器默认使用的是JSTL解析器,要想使用JSTL标签需要导入JSTL的依赖

    <dependency>
          <groupId>jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
    <dependency>
    
    <!--jsp相关-->
    <dependency>
           <groupId>jstl</groupId>
           <artifactld>jstl</artifactld>
    <dependency>    

    将一个user的集合放入模型中返回:数据如何在页面渲染

    @RequestMapping(value="/show3")
    public ModelAndView show3(){
    //创建模型视图,指定视图名
           ModelAndView mv=new ModelAndView("user-list");
    //创建用户列表,用于页面展示
           List<User> users=new ArrayList<User>();
           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">

    <body>
        <table>
             <tr>
                  <th>ID</th>
                  <th>UserName</th>
                  <th>Name</th>
                  <th>Age</th>
             </tr>
    //利用标签库中EL表达式遍历集合,展示到页面
            <c:forEach items="${users}" var="user">
                   <tr>
                         <td>${user.id}</td>
                         <td>${user.username}</td>
                         <td>${user.name}</td>
                         <td>${user.age}</td>
                   </tr>
            </c:forEach>
        </table>
    </body>                

    3.JSON视图

    在实际开发中,我们经常需要以JSON的格式进行数据的传输,所以在SpringMVC中提供了一种非常便捷的方式来返回一个JSON视图。SpringMVC的JSON功能,底层依赖的是Jackson这个JSON工具

    使用这个工具必须要引入该依赖:

    <!-- Jackson Json处理工具包 -->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
            </dependency>

    编写controller类,该注解@ResponseBody返回的是一个JSON视图(springmvc或自动把返回值转换为JSON格式)

        @RequestMapping(value="test2")
        @ResponseBody
        public List<User> test2(){
            
            User user = new User();
            
            List<User> 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类无返回值的方法

  • 相关阅读:
    PHP的轻量消息队列php-resque使用说明
    Laravel 5.1 事件、事件监听的简单应用
    Ubuntu常用命令
    Mysql 主从数据库
    MySQL日志
    两条比较实用的mysql导入导出命令
    Linux下mysql定时自动备份并FTP到远程脚本
    观察者模式范例
    devexpress gridControl1导出为pdf文件时出现 中文乱码的解决方案
    devexpress打印gridControl
  • 原文地址:https://www.cnblogs.com/lichangyun/p/8524862.html
Copyright © 2011-2022 走看看