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

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. 难点--均方误差(MSE)和均方根误差(RMSE)和平均绝对误差(MAE)

    MSE: Mean Squared Error 均方误差是指参数估计值与参数真值之差平方的期望值; MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度. MSE=1 ...

  2. 移动端 Retina屏border实现0.5px

    首先来看一下造成Retina边框变粗的原因 其实这个原因很简单,因为css中的1px并不等于移动设备的1px,这些由于不同的手机有不同的像素密度.在window对象中有一个devicePixelRat ...

  3. 树莓派开启SSH

    2017-04-10-raspbian-jessie默认SSH功能时关闭的 boot下新建一个ssh的空文件

  4. oracle备份信息查询

    SELECT TRIM(START_TIME || '#'),       TRIM(END_TIME || '#'),       TRIM(CASE OUTPUT_DEVICE_TYPE      ...

  5. 理解webpack之process.env.NODE_ENV详解(十八)

    在node中,有全局变量process表示的是当前的node进程.process.env包含着关于系统环境的信息.但是process.env中并不存在NODE_ENV这个东西.NODE_ENV是用户一 ...

  6. 【Codeforces 650 D】Zip-line

    题意:给一个序列以及\(n\)个查询,每一个查询是问(假装)把第\(a_i\)个数改为\(b_i\)之后原序列的最长上升子序列的长度. 思路:线段树优化\(dp\). 肯定离线做啊. 首先我们考虑\( ...

  7. Android学习之基础知识八—Android广播机制

    一.广播机制简介 Android提供了一套完整的API,允许应用程序自由的发送和接受广播,发送广播借助于我们之前学过的:Intent,而接收广播需要借助于广播接收器(Broadcast Receive ...

  8. BP浅谈

    之前一直对BP的理解不透彻,这可不行,这个可是超经典的广泛应用在ML中的求偏导的方法.本博来自<神经网络与机器学习>P86页. 在用到bp的地方我们都是为了使用梯度下降法,并求出他的偏导数 ...

  9. Luogu4774 NOI2018 屠龙勇士 ExCRT

    传送门 原来NOI也会出裸题啊-- 用multiset求出对付每一个BOSS使用的武器威力\(ATK_i\),可以得到\(m\)个式子\(ATK_ix \equiv a_i \mod p_i\) 看起 ...

  10. CF1056E Check Transcription 字符串哈希

    传送门 暴力枚举\(0\)的长度,如果对应的\(1\)的长度也是一个整数就去check是否合法.check使用字符串哈希. 复杂度看起来是\(O(st)\)的,但是因为\(01\)两个数中数量较多的至 ...