随笔 - 1162  文章 - 0  评论 - 16  阅读 - 59万 

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

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 提供的 AbstractExcelViewAbstractJExcel View 即可。实现 buildExcelDocument() 方法,在方法中使用模型数据对象构建 Excel 文档就可以了。

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

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

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

posted on   格物致知_Tony  阅读(147)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?
点击右上角即可分享
微信分享提示

目录导航