• 第六节:SpringMVC 视图解析【6】自定义视图和自定义视图解析器


    一、自定义视图和视图解析器的步骤

      1、编写自定义的视图解析器和视图实现类;

      2、视图解析器放在 IOC 容器中;

      3、让SpringMVC来进行视图的解析;

      视图解析器:

    二、案例

      1、页面请求连接

    <a href="/handlePlus">下载敏感资源----福利</a><br>
    

      

      2、定义控制器

    @Controller
    public class MyViewResolveController {
    
        /**
         *  自定义前缀为 mm
         *  如果方法返回值前缀为 mm,使用自定义的视图解析器和视图进行解析渲染
         * @param model
         * @return
         */
        @RequestMapping(value = "/handlePlus")
        public String handlePlus(Model model) {
            List<String> vname = new ArrayList<>();
            List<String> imgname = new ArrayList<>();
    
            vname.add("苍老师");
            vname.add("刘老师");
    
            imgname.add("a");
            imgname.add("b");
    
            model.addAttribute("video", vname);
            model.addAttribute("imgs", imgname);
    
            return "mm:/gaoqing";
        }
    }

      3、自定义视图

    /*
        自定义视图
     */
    public class MyView implements View {
    
        /*
            返回的内容类型
         */
        @Override
        public String getContentType() {
            return "text/html";
        }
    
    
        @Override
        public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
            System.out.println("之前保存的数据:" + model);
    
            List<String> video = (List<String>) model.get("video");
    
            response.setContentType("text/html");
            response.getWriter().write("哈哈,<h1>即将展现精彩内容</h1>");
    
            for (String s : video) {
                response.getWriter().write("<h2><a href='http://www.baidu.com'>" + s +"</a></h2>");
            }
        }
    }

      4、自定义视图解析器

    public class MyMMViewResolve implements ViewResolver, Ordered {
    
        private Integer order = 0;
    
        @Override
        public View resolveViewName(String viewName, Locale locale) throws Exception {
            //根据视图名返回视图对象
            /*
                return "mm:/gaoqing";
    
             */
            if (viewName.startsWith("mm")) {
                return new MyView();
            } else {
                //如果不能处理返回 null 即可
                return null;
            }
        }
    
        @Override
        public int getOrder() {
            return this.order;
        }
    
        //改变视图解析器的顺序
        public void setOrder(Integer order) {
            this.order = order;
        }
    }

      5、配置自定义视图解析器

        <!--InternalResourceViewResolver 的优先级最低-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/pages/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>
    
        <!--
            自定义视图解析器
            调整视图解析器的顺序
    
            value = "1" 数字越小优先级越高
        -->
        <bean class="com.njf.ext.MyMMViewResolve">
            <property name="order" value="1"></property>
        </bean>
      每个视图解析器都实现了  Ordered 接口并开放出一个 order 属性,可以通过order 属性指定解析器的优先顺序, order 越小优先级越高;

      SpringMVC 会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出 ServletException 异常;

      可以配置多个视图解析器,并且可以指定视图解析器的顺序,SpringMVC 会按照视图解析器的 order 属性从小到大依次进行解析,如果匹配到一个视图解析器能够解析,则进行解析渲染;如果不能返回 null,由下一个视图解析器进行解析;

      配置的 InternalResourceViewResolver 的 order 属性为 Integer 的最大值,在自定义的视图解析器实现 Ordered 接口并设置 order 值即可;

    三、Excel 视图

      1、若希望使用 Excel 展示数据列表,仅需要扩展 SpringMVC 提供的 AbstractExcelView AbstractJExcel View 即可。实现 buildExcelDocument() 方法,在方法中使用模型数据对象构建 Excel 文档就可以了。

      2、AbstractExcelView 基于 POI API,而 AbstractJExcelView 是基于 JExcelAPI 的。

      3、视图对象需要配置 IOC 容器中的一个 Bean,使用 BeanNameViewResolver 作为视图解析器即可;

      4、若希望直接在浏览器中直接下载 Excel 文档,则可以设置响应头 Content-Disposition 的值为 attachment;filename=xxx.xls

  • 相关阅读:
    移动硬盘和u盘的区别
    U盘文件系统格式
    WARN: Establishing SSL connection
    数据库基本操作命令
    PCM EQ DRC 音频处理
    那些年、那些歌、那些事
    编译与链接
    Flash芯片你都认识吗?
    ACM暑假集训第三周小结
    H
  • 原文地址:https://www.cnblogs.com/niujifei/p/15569803.html
Copyright © 2020-2023  润新知