在完整web开发中。springMVC主要充当了控制层的角色。它接受视图层的请求。获取视图层请求数据,再对数据进行业务逻辑处理。然后封装成视图层须要的模型数据,再将数据导向到jsp等视图界面。

在前面,我们通过对@RequestMapping和方法入參绑定的分析,完毕了视图层->控制层的数据交接,然后业务逻辑处理主要由Service层进行。那么接下来非常关键的就是,怎样将视图数据导向到特定的视图中。

广泛意义上,视图,并不是是单指前端界面如jsp\html等。我们可能须要给安卓、IOS等写后台接口、因前后端分离而放弃视图界面导向如对前端ajax请求的纯数据流输出等。

这时,我们的视图能够为json视图、xml视图、乃至PDF视图、Excel视图等

springMVC为我们提供了多种途径输出模型数据:

输出途径 功能说明
ModelAndView 将处理方法返回类型设为ModelAndView。里面封装了我们的模型数据,同一时候指明了视图导向。

@modelAttribute 方法入參标注改注解后,入參的对象就会放到数据模型中。

Map及Model 入參为org.springframework.ui.Model或org.springframework.ui.ModelMap或java.util.Map时,方法返回时会将Map中的数据自己主动加入到模型中
@SessionAttributes 将模型中的某个属性暂存到HttpSession中,以便多个请求之间完毕属性共享

以下我们主要介绍ModelAndView

ModelAndView(以下简称MAV)就像它的名字一样。既包括了模型数据又包括视图信息。我们返回一个MAV。springMVC就会将模型数据转发给相应的视图界面。

在学习ModelAndView的用法前。我们先用肢解的方法学习其两个重要组成部分

1. model

model是一个接口,我们能够简单地将model的实现类理解成一个Map,将模型数据以键值对的形式返回给视图层使用。在springMVC中,每一个方法被前端请求触发调用前,都会创建一个隐含的模型对象,作为模型数据的存储容器。

这是一个Request级别的模型数据。我们能够在前端页面如jsp中通过HttpServletRequest等相关API读取到这些模型数据。

在model中。定义有例如以下经常使用接口方法:

    /**
* 加入键值属性对
*/
Model addAttribute(String attributeName, Object attributeValue); /**
* 以属性的类型为键加入属
*/
Model addAttribute(Object attributeValue); /**
* 以属性和集合的类型构造键名加入集合属性,假设有同类型会存在覆盖现象
*/
Model addAllAttributes(Collection<?> attributeValues); /**
* 将attributes中的内容拷贝到当前的model中
* 假设当前model存在同样内容。会被覆盖
*/
Model addAllAttributes(Map<String, ?> attributes); /**
* 将attributes中的内容拷贝到当前的model中
* 假设当前model存在同样内容,不会被覆盖
*/
Model mergeAttributes(Map<String, ?> attributes); /**
* 推断是否有相应的属性值
*/
boolean containsAttribute(String attributeName); /**
* 将当前的model转换成Map
*/
Map<String, Object> asMap();

假设我们加入的属性没有指定键名。我们称之为匿名数据绑定,它们遵循例如以下规则:

1. 对于普通数据类型,我们直接以类型(第一字母小写)作为键值

2. 对于集合类型(Collection接口的实现者们,包括数组),生成的模型对象属性名为“简单类名(首字母小写)”+“List”,如List生成的模型对象属性名为“stringList”,List生成的模型对象属性名为“userModelList”。

在ModelAndView中,我们很多其它的是直接操作modelMap和Map来完毕我们的模型參数准备就可以。modelMap继承自java.util.LinkedHashMap。

它在LinkedHashMap的基础上,新增了非常多便利的构造方法如:

public ModelMap(String attributeName, Object attributeValue) {
addAttribute(attributeName, attributeValue);
}
public ModelMap addAllAttributes(Map<String, ? > attributes) {
if (attributes != null) {
putAll(attributes);
}
return this;
}

使用这些构造方法能进一步简化我们的模型数据封装。

2. view

view也是一个接口,它表示一个响应给用户的视图如jsp文件,pdf文件,html文件。

它有两个接口方法:

1. String getContentType():返回视图的内容类型

2. void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception:依据给定模型和web资源定义视图的渲染形式。

view接口有众多的实现类,例如以下图所看到的:



在spring中。通过ViewResolver来解析相应View实例的行为。 它的定义相当简单:

public interface ViewResolver {
//通过view name 解析View
View resolveViewName(String viewName, Locale locale) throws Exception;
}

spring为我们提供ViewResolver实现类用来解析不同的view:



在我们最開始配置springMVC核心文件时,就用到了InternalResourceViewResolver,它是一个内部资源视图解析器。

会把返回的视图名称都解析为 InternalResourceView 对象。 InternalResourceView 会把 Controller 处理器方法返回的模型属性都存放到相应的 request 属性中。然后通过 RequestDispatcher 在server端把请求 forword 重定向到目标 URL。

以下我们来看配置实例:

<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property><!-- 前缀,在springMVC控制层处理好的请求后,转发配置文件夹下的视图文件 -->
<property name="suffix" value=".jsp"></property><!-- 文件后缀,表示转发到的视图文件后缀为.jsp -->
</bean>

解析完Model and(和) View后,再来看我们的ModelAndView:

public class ModelAndView {

    //视图成员
private Object view; //模型成员
private ModelMap model; //是否调用clear()方法清空视图和模型
private boolean cleared = false; /**
* 空构造方法
*/
public ModelAndView() {
} /**
* 简便地使用视图名生成视图,详细解析由DispatcherServlet的视图解析器进行
*/
public ModelAndView(String viewName) {
this.view = viewName;
} /**
* 指定一个视图对象生成视图
*/
public ModelAndView(View view) {
this.view = view;
} /**
* 指定视图名同一时候绑定模型数据。这里模型数据以追加的形式加入在原来的视图数据中
*/
public ModelAndView(String viewName, Map<String, ? > model) {
this.view = viewName;
if (model != null) {
getModelMap().addAllAttributes(model);
}
} /**
* 指定一个视图对象同一时候绑定模型数据。这里模型数据以追加的形式加入在原来的视图数据中
*/
public ModelAndView(View view, Map<String, ?> model) {
this.view = view;
if (model != null) {
getModelMap().addAllAttributes(model);
}
} /**
* 简便配置:指定视图名,同一时候加入单个属性
*/
public ModelAndView(String viewName, String modelName, Object modelObject) {
this.view = viewName;
addObject(modelName, modelObject);
} /**
* 简便配置:指定一个视图对象,同一时候加入单个属性
*/
public ModelAndView(View view, String modelName, Object modelObject) {
this.view = view;
addObject(modelName, modelObject);
} /**
* 设置当前视图名
*/
public void setViewName(String viewName) {
this.view = viewName;
} /**
* 获取视图名。假设当前视图属性为view而非名字(String)则返回null
*/
public String getViewName() {
return (this.view instanceof String ? (String) this.view : null);
} /**
* 设置当前视图对象
*/
public void setView(View view) {
this.view = view;
} /**
* 获取视图,假设非view实例,则返回null
*/
public View getView() {
return (this.view instanceof View ? (View) this.view : null);
} /**
* 推断当前视图是否存在
*/
public boolean hasView() {
return (this.view != null);
} /**
* 获取模型Map。假设为空,则新建一个
*/
public ModelMap getModelMap() {
if (this.model == null) {
this.model = new ModelMap();
}
return this.model;
} /**
* 同getModelMap
*/
public Map<String, Object> getModel() {
return getModelMap();
} /**
* 加入单个键值对属性
*/
public ModelAndView addObject(String attributeName, Object attributeValue) {
getModelMap().addAttribute(attributeName, attributeValue);
return this;
} /**
* 以属性类型为键加入属性
*/
public ModelAndView addObject(Object attributeValue) {
getModelMap().addAttribute(attributeValue);
return this;
} /**
* 将Map中的全部属性加入到成员属性ModelMap中
*/
public ModelAndView addAllObjects(Map<String, ?> modelMap) {
getModelMap().addAllAttributes(modelMap);
return this;
} /**
* 清空视图模型。并设为清空状态
*/
public void clear() {
this.view = null;
this.model = null;
this.cleared = true;
} /**
* 推断是否为不含视图和模型
*/
public boolean isEmpty() {
return (this.view == null && CollectionUtils.isEmpty(this.model));
} }

springMVC4(7)模型视图方法源代码综合分析的更多相关文章

  1. WebGL或OpenGL关于模型视图投影变换的设置技巧

    目录 1. 具体实例 2. 解决方案 1) Cube.html 2) Cube.js 3) 运行结果 3. 详细讲解 1) 模型变换 2) 视图变换 3) 投影变换 4) 模型视图投影矩阵 4. 存在 ...

  2. Java基础之在窗口中绘图——使用模型/视图体系结构在视图中绘图(Sketcher 1 drawing a 3D rectangle)

    控制台程序. 在模型中表示数据视图的类用来显示草图并处理用户的交互操作,所以这种类把显示方法和草图控制器合并在一起.不专用于某个视图的通用GUI创建和操作在SketcherFrame类中处理. 模型对 ...

  3. 模型 - 视图 - 控制器(MVC)详解

    模型视图控制器(MVC)一个相当实用且十分流行的设计模式.作为一位称职码农,你不可能没听说过吧. 不幸的是它难以让人理解. 在本文中,我将给出我认为是MVC的最简单的解释,以及为什么你应该使用它. 什 ...

  4. Qt 学习之路:模型-视图高级技术

    PathView PathView是 QtQuick 中最强大的视图,同时也是最复杂的.PathView允许创建一种更灵活的视图.在这种视图中,数据项并不是方方正正,而是可以沿着任意路径布局.沿着同一 ...

  5. 【转】Qt之模型/视图

    [本文转自]http://blog.sina.com.cn/s/blog_a6fb6cc90101hh20.html   作者: 一去丶二三里 关于Qt中MVC的介绍与使用,助手中有一节模型/视图编程 ...

  6. SpringBoot系列: Spring MVC视图方法的补充

    SpringMVC 视图方法的参数, 已经在这个文章中写得非常清楚了, 链接为 https://www.cnblogs.com/morethink/p/8028664.html 这篇文章做一些补充. ...

  7. [框架模式]经典的模型视图控制器模式MVC

    参考:<设计模式> http://blog.csdn.net/u010168160/article/details/43150049 百度百科 引言: Model(模型)是应用程序中用于处 ...

  8. OpenGL模型视图变换、投影变换、视口变换的理解

    OpenGL中不设置模型,投影,视口,所绘制的几何图形的坐标只能是-1到1(X轴向右,Y轴向上,Z轴垂直屏幕向外). 产生目标场景的过程类似于用照相机进行拍照: (1)把照相机固定在三角架上,并让他对 ...

  9. MODEL-View-Controller,既模型-视图-控制器

    Swing组件采用MVC(MODEL-View-Controller,既模型-视图-控制器)设计模式,其中模型(Model)用于维护组件的各种状态,视图(View)是组件的可视化表现,控制器(Cont ...

随机推荐

  1. 2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-G.html 题目传送门 - 2018牛客多校赛第三场 G ...

  2. 001_JavaScript学习

    1,面向对象,事件驱动 2,动态,交互性 3,解释性语言,非强(弱)类型变量:不用声明,解释时检查类型 4,区分大小写,嵌入html,句尾加分号,可以独立保存为一个外部文件,但其中不能包含<sc ...

  3. Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第五集之网络配置】

    还有对第五集的补充:https://www.cnblogs.com/lirenhe/p/10405069.html 1,如果不为这个linux系统或者这台虚拟机配置IP,就不能实现通信.这样的之后安装 ...

  4. day30 网络编程 之进程,线程,协程

    进程点进去 线程点进去 协程点进去 什么是进程 进程(有时称为重量级进程)是一个执行中的程序.每个进程都拥有自己的地址空间.内存.数据栈以及其他用于跟踪执行的辅助数据.同一个程序执行两次,属于是两个不 ...

  5. <%@include>和<jsp:include>有什么不同呢

    <%@include>jsp指令先包含再处理,<jsp:include>jsp动作先处理再包含 1.执行时间上:< %@ include file=”relativeUR ...

  6. boost 正则表达式 regex

    boost 正则表达式 regex   环境安装 如果在引用boost regex出现连接错误,但是引用其他的库却没有这个错误,这是因为对于boost来说,是免编译的,但是,正则这个库 是需要单独编译 ...

  7. 问题 J: Palindromic Password ( 2018组队训练赛第十五场) (简单模拟)

    问题 J: Palindromic Password 时间限制: 3 Sec  内存限制: 128 MB提交: 217  解决: 62[提交][状态][讨论版][命题人:admin] 题目描述 The ...

  8. Stm32基础

    Stm32基础 目录 常用功能函数 跑马灯实验 蜂鸣器实验 按键实验 端口复用与重映射 常用功能函数 初始化gpio函数 作用:初始化一个或者多个io口(同一组)的工作方式和速度该函数主要是操作GPI ...

  9. Git rebase命令实战

    一.前言 一句话,git rebase 可以帮助项目中的提交历史干净整洁!!! 二.避免合并出现分叉现象 git merge操作 1.新建一个 develop 分支   2.在develop分支上新建 ...

  10. .NET控件名称缩写一览表 zz

    标准控件1 btn Button2 chk CheckBox3 ckl CheckedListBox4 cmb ComboBox5 dtp DateTimePicker6 lbl Label7 llb ...