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

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. centos 上安装phpstorm

    phpstorm在centos上运行依赖JDK,所以先安装JDK环境. 假如是centos自带的openjdk,直接卸载,不支持phpstorm. 下载jdk-7u45-linux-i586.tar. ...

  2. python六十一课——高阶函数之reduce

    2).reduce(fn,lsd): 参数一:fn --> 函数对象 参数二:lsd --> 序列对象 功能: 先将lsd中的第一和第二个元素去除传入到fn中参与运算, 运算后得到结果,再 ...

  3. Android Activity.startActivity流程简介

    http://blog.csdn.net/myarrow/article/details/14224273 1. 基本概念 1.1 Instrumentation是什么? 顾名思义,仪器仪表,用于在应 ...

  4. Arduino IDE for ESP8266教程(0)配置IDE

    淘宝链接 https://detail.tmall.com/item.htm?id=540067174120&spm=a1z09.2.0.0.6f7c6509ujAvQs&_u=71q ...

  5. linux 的常用命令---------第十一阶段

    软件管理rpm.yum 在 windows 与 linux 之间 实现小文件传输(仅支持在 X shell 中完成文件传输,虚拟机中不可实现): # yum install  lrzsz  -y    ...

  6. Rinkeby中测试币的申请

    https://www.rinkeby.io/#faucet 从这个页面可以看见测试币的请求是有要求的,下面说明怎么做: 之前使用的是google账号,即第二种方式来获取.后面gmail出现了问题,一 ...

  7. all与any的用法

    all函数:检测矩阵中是否全为非零元素 any函数:检测矩阵中是否有非零元素,如果有,则返回1,否则,返回0.用法和all一样 语法: B = all(A) B = all(A, dim) 复制代码 ...

  8. AI 逻辑回归

    逻辑回归 参考链接 https://zhuanlan.zhihu.com/p/44591359

  9. 【Codeforces 115D】Unambiguous Arithmetic Expression

    Codeforces 115 D 题意:给一个没有括号的表达式,问有多少种添加括号的方法使得这是一个合法的表达式?输入可能有正负号.加减乘除.数字. 思路1: 这是不能过的\(naive\)的\(dp ...

  10. http协议进阶(四)报文首部

    之前写的关于报文首部的传送门: 报文首部:http://www.cnblogs.com/imyalost/p/5708445.html 通用首部字段:http://www.cnblogs.com/im ...