自定义视图(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方法中定义对这次请求如何响应;
原文地址:https://www.cnblogs.com/limingxian537423/p/7285231.html