zoukankan      html  css  js  c++  java
  • 自定义视图(SpringMVC)

    一、首先理解视图的解析过程

    1)请求处理方法执行完成后,最终返回一个 ModelAndView 对象。

    ModelAndView 对象,它包含了逻辑名(访问URL)和模型对象(javaBean数据)的视图

    2)视图解析器(ViewResolver)负责根据返回值(ModelAndView )作为页面地址得到视图对象。

    即:将逻辑视图解析为一个具体的视图对象

    常用的解析器:

    InternalResourceViewResolver  

    3) 视图(view)的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。

    常见的视图实现类:

    InternalResourceView,JstlView

    二、自定义视图

    假设:return "download:/aaa.txt";"sql:/aaaa","img:/haha.jpg"   --->自定义的ViewResolver;---->根据返回值创建一个我们想要实现的视图功能View;

    ViewResolver和view都是两个接口,要实现返回值到视图的实现,必须得实现这两个接口

    //多个视图解析器依次解析,如果某个解析成功就直接返回值;如果没有成功下一个解析器继续
            for (ViewResolver viewResolver : this.viewResolvers) {
                View view = viewResolver.resolveViewName(viewName, locale);
                if (view != null) {
                    return view;
                }
            }
    1、自定义一个ViewResolver;
    public class MyCustomViewResolver implements ViewResolver,Ordered {
        
        //保存当前视图解析器的优先级
        private int order = Integer.MAX_VALUE;
        /**
         * 将ModelAndView 中视图名解析成View对象返回
         */
        @Override
        public View resolveViewName(String ViewName, Locale arg1) throws Exception {
            // TODO Auto-generated method stub
            //如果ModelAndView的视图名字是以download:或sql:开头的,那么创建一个 MyCustomView()视图对象
            if(ViewName.startsWith("download:")||ViewName.startsWith("sql:")){
                //返回视图对象,该视图对象为自定义的
                return new MyCustomView();
            }
            return null;
        }
    
        @Override
        public int getOrder() {
            // TODO Auto-generated method stub
             return order;
        }
         public void setOrder(Integer order){
                this.order = order;
         }
    }
     
    2、自定义了一个视图(View)对象
    public class MyCustomView implements View{
        /**
         * 返回内容类型
         */
        @Override
        public String getContentType() {
            // TODO Auto-generated method stub
            //相当于response.setContextType()
            return "text/html;charset=utf-8";
        }
        /**
         * 渲染<br/>
         * Map<String, ?> model 隐含模型中的数据
         */
        @Override
        public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
            // TODO Auto-generated method stub
            System.out.println("这是我自定义的视图");
            response.getWriter().write(UUID.randomUUID().toString());
        }
    
    }
    3、视图解析器默认是先从ioc容器中拿到所有的解析器;如果没有就用出厂设置;
    4、我们可以在配置文件中配置多个视图解析器;
    <!-- 加载自定义的视图解析器 -->
        <bean class="com.atguigu.customview.MyCustomViewResolver">
            <property name="order" value="1"></property>
        </bean>
        <!--默认的视图解析器:对于forword; rdirect: 字符串等,生成一个重定向或者转发的视图对象 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/"></property>
            <property name="suffix" value=".jsp"></property>
            <!-- 设置优先级,数字越小,优先级越高 -->
            <property name="order" value="2"></property>
        </bean>
    5、多个视图解析器轮着尝试解析方法的返回值将其整成一个视图对象;
    6、我们需要为任何自定义的视图解析器,或者任何非InternalResourceViewResolver,的解析器都要优先于InternalResourceViewResolver运行;
     
    public class MyPlusViewResolver implements ViewResolver,Ordered{
    7、我们的视图解析器创建出了我们的视图对象(View)
    8、我们就可以在自己的View对象的render方法中定义对这次请求如何响应;
  • 相关阅读:
    快速编辑里指定默认值
    Odoo domain 中的 like, ilike, =like, =ilike 举例说明【转】
    odoo报表条码无法显示解决[转]
    ubuntu 安装 wkhtmltopdf 的方法
    解决Odoo日期(时间)无效的问题 [转]
    ShareSDK演示
    黑客帝国数字矩阵特效做法
    lua中实现倒计时
    Lua中用Split函数分割字符串
    lua封装的位运算
  • 原文地址:https://www.cnblogs.com/limingxian537423/p/7285231.html
Copyright © 2011-2022 走看看