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

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方法中定义对这次请求如何响应;

自定义视图(SpringMVC)的更多相关文章

  1. SpringMVC系列(九)自定义视图、重定向、转发

    一.自定义视图 1. 自定义一个视图HelloView.java,使用@Component注解交给Spring IOC容器处理 package com.study.springmvc.views; i ...

  2. SpringMVC自定义视图Excel视图和PDF视图

    SpringMVC自定义视图 Excel视图和PDF视图 SpringMVC杂记(十一) 使用Excel视图 Spring MVC 视图解析器(ViewResolver ) java实现导出excel ...

  3. SpringMvc配置自定义视图

    1.在dispatcherServlet-servlet.xml配置自定义视图 <!-- 配置视图 BeanNameViewResolver 解析器: 使用视图的名字来解析视图 --> & ...

  4. SpringMVC:自定义视图及其执行过程

    一:自定义视图 1.自定义一个实现View接口的类,添加@Component注解,将其放入SpringIOC容器 package com.zzj.view; import java.io.PrintW ...

  5. SpringMVC自定义视图 Excel视图和PDF视图

    一.自定义视图-Excel视图 1.Maven依赖 引入POI <dependency> <groupId>org.apache.poi</groupId> < ...

  6. springmvc自定义视图

    自定义视图 可以整合jfreechart.excel @RequestMapping("/testView") public String testView(){ System.o ...

  7. 基于BeanNameViewResolver解析器,自定义视图

    概述 基于spring-mvc自定义视图,以BeanNameViewResolver作为解析器,以满足特殊需求. 本文以输出多个pdf文件的压缩文件,供前台下载的需求为例:但是不提供服务层实现. 实现 ...

  8. 《连载 | 物联网框架ServerSuperIO教程》- 13.自定义视图显示接口开发,满足不同的显示需求

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  9. Android中的自定义视图控件

    简介 当现有控件不能满足需求时,就需要自定义控件. 自定义控件属性 自定义控件首先要继承自View,重写两个构造函数. 第一个是代码中使用的: public MyRect(Context contex ...

随机推荐

  1. 【学习笔记】python 进阶特性

    __slots__魔法 在Python中,每个类都有实例属性.默认情况下Python用一个字典来保存一个对象的实例属性.这非常有用,因为它允许我们在运行时去设置任意的新属性. 然而,对于有着已知属性的 ...

  2. 在Oracle中使用Guid

    sys_guid()  -  唯一索引 在Oracle中可以用SYS_GUID()来生成一个guid,相当于msSql中的newid(). 在Oracle9i和Oracle 10g 里SYS_GUID ...

  3. python3 小数据池

    '''小数据池:为了重复的使用同一个数据str(一般的,简单的)int -5~256bool True False3个数据类型会被放入小数据池id()取变量的内存地址字符串'''# s1 = &quo ...

  4. mybatis多数据源切换

    文章转自https://yq.aliyun.com/articles/188540?t=t1 https://www.liaoxuefeng.com/article/00151054582348974 ...

  5. android 给LinearLayout中添加一定数量的控件,并让着一定数量的控件从右到左移动,每隔若干秒停顿一下,最后一个view链接第一个view,然后继续移动循环往复,形成一个死循环简单动画效果

    主类:IndexAnimationLinearLayout.java package com.yw.sortlistview; import java.util.ArrayList; import j ...

  6. 洛谷 P2835 刻录光盘

    题目链接 https://www.luogu.org/problemnew/show/P2835 题目描述 在JSOI2005夏令营快要结束的时候,很多营员提出来要把整个夏令营期间的资料刻录成一张光盘 ...

  7. C++11 并发指南三(std::mutex 详解)

    上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::thread 的一些用法,并给出了两个小例子,本文将介绍 std::mutex 的用法. Mutex ...

  8. 7-(基础入门篇)关于STM32底层程序使用说明

    https://www.cnblogs.com/yangfengwu/p/9357695.html 基础教程源码链接请在淘宝介绍中下载,由于链接很容易失效,如果失效请联系卖家,谢谢 https://i ...

  9. excel保存为制表符分隔的文本文件 js无法完整读取

    excel保存为制表符分隔的文本文件 js无法完整读取 excel另存为文本有两个选项,一个是制表符分隔的文本文件,一个是unicode文本.生成的文件Unicode更大一些.但是这里需要注意的是[制 ...

  10. 复习整理9:SpringMVC应用以及源码解析

    一:SpringMVC是什么 SpringMVC只是Spring的一个子框架,作用学过Struts2的应该很好理解,他们都是MVC的框架.学他就是用来代替Struts2的,那么为什么不用Struts2 ...