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

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. [java基础]一文理解java多线程必备的sychronized关键字,从此不再混淆!

    java并发编程中最长用到的关键字就是synchronized了,这里讲解一下这个关键字的用法和容易混淆的地方. synchronized关键字涉及到锁的概念, 在java中,synchronized ...

  2. 习题 6 字符串(string)和文本

    虽然你已经在程序中写过字符串了,你还没学过它们的用处.在这章习题中我们将使用复杂的字符串来建立一系列的变量,从中你将学到它们的用途.首先我们解释一下字符串是什么 东西. 字符串通常是指你想要展示给别人 ...

  3. 扑克牌游戏-华为OJ-C++实现

    /*扑克牌游戏大家应该都比較熟悉了.一副牌由54张组成,含3~A.2各4张,小王1张.大王1张.牌面从小到大用例如以下字符和字符串表示(当中.小写joker表示小王,大写JOKER表示大王): 3 4 ...

  4. js 数组的操作

    js数组的操作 用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简单的string.split(char).这段时间做的一个项目,用到数组的地方很多,自以为js高手的自己居然无从下手,一 ...

  5. YOLO2 (3) 快速训练自己的目标

    1快速训练自己的目标 在 YOLO2 (2) 测试自己的数据 中记录了完整的训练自己数据的过程. 训练时目标只有一类 car. 如果已经执行过第一次训练,改过一次配置文件,之后仍然训练同样的目标还是只 ...

  6. oracle11g设置归档模式和非归档模式

    1.首先查看当前数据库是否处于归档模式            可使用如下两种方式查看 1.1  select name, log_mode from v$database;   log_mode的值为 ...

  7. 2018-2019-2 20165302程上杰 Exp6 信息搜集与漏洞扫描

    1,实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.,实验内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测. ...

  8. yarn出现“There are no scenarios ; must have at least one"

    错误信息:“There are no scenarios ; must have at least one" 背景:在将vscode自动化构建编译打包时出现这种情况,主要是执行yarn这一步 ...

  9. 'style-loader', 'css-loader'使用

    'style-loader', 'css-loader'使用 1.安装 npm install style-loader css-loader --save-dev 2.配置 webpack.conf ...

  10. 新的WireGuard快照发布

    导读 WireGuard首席开发人员Jason Donenfeld宣布发布WireGuard 0.0.20190123,作为Linux系统和其他平台的安全VPN隧道实施的最新快照. WireGuard ...