ModelAndView对象

2024-05-09 16:18
文章标签 对象 modelandview

本文主要是介绍ModelAndView对象,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

当控制器处理完请求时,通常会将包含视图名称或视图对象以及一些模型属性的ModelAndView对象返回到DispatcherServlet。

因此,经常需要在控制器中构造ModelAndView对象。ModelAndView类提供了几个重载的构造器和一些方便的方法,

让你可以根据自己的喜好来构造ModelAndView对象。这些构造器和方法以类似的方式支持视图名称和视图对象。

当你只有一个模型属性要返回时,可以在构造器中指定该属性来构造ModelAndView对象


在上篇的基础上,只修改Login类

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.itmyhome;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import org.springframework.stereotype.Controller;  
  9. import org.springframework.web.bind.annotation.RequestMapping;  
  10. import org.springframework.web.servlet.ModelAndView;  
  11.   
  12. @Controller  
  13. public class Login {  
  14.   
  15.     @RequestMapping(value="login")  
  16.     public ModelAndView login(){  
  17.         ModelAndView mav = new ModelAndView();  
  18.         mav.setViewName("welcome"); //返回的文件名  
  19.           
  20.         mav.addObject("message","hello kitty");  
  21.           
  22.         //List  
  23.         List<String> list = new ArrayList<String>();  
  24.         list.add("java");  
  25.         list.add("c++");  
  26.         list.add("oracle");  
  27.         mav.addObject("bookList", list);  
  28.           
  29.         //Map  
  30.         Map<String,String> map = new HashMap<String,String>();  
  31.         map.put("zhangsan""北京");  
  32.         map.put("lisi""上海");  
  33.         map.put("wangwu""深圳");  
  34.         mav.addObject("map",map);  
  35.           
  36.         return mav;  
  37.     }  
  38. }  

亦或如下方法来构建你的ModelAndView对象

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. @RequestMapping(value="logout")  
  2. public ModelAndView logout(){  
  3.     String message = "欢迎下次光临!";  
  4.     return new ModelAndView("logout","message",message);  
  5. }  

然后修改welcome.jsp输出数据

遍历集合可使用jstl表达式,需在jsp中引入头文件

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>  
lib下导入jstl.jar和standard.jar

首先这两个jar在哪里可以找到,当然可以在网上下载。

另外在tomcat下面就有,在\webapps\examples\WEB-INF\lib

前提是你还没有把webapps下面的一些无用项目删掉。


welcome.jsp

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <body>  
  2.    <!-- 输出普通字符 -->  
  3.    ${message } <br/>  
  4.    <!-- 输出List -->  
  5.    <p>书籍列表</p>  
  6.    <c:forEach items="${bookList}" var="node">  
  7.         <c:out value="${node}"></c:out>  
  8.    </c:forEach>  
  9.    <br/>  
  10.    <br/>  
  11.      
  12.    <!-- 输出Map -->  
  13.    <c:forEach items="${map}" var="node">  
  14.         姓名:<c:out value="${node.key}"></c:out>  
  15.         住址:<c:out value="${node.value}"></c:out>  
  16.         <br/>  
  17.    </c:forEach>  
  18. </body>  

结果如图:




ModelAndView详解


Web Servlet 应用服务器 Spring 浏览器 

ModelAndView

的构造方法有7个。但是它们都是相通的。这里使用无参构造函数来举例说明如何构造ModelAndView

实例。   
ModelAndView类别就如其名称所示,是代表了MVC Web程序中Model与View的对象,不过它只是方便您一次返回这两个对象的holder,Model与View两者仍是分离的概念。 
  最简单的ModelAndView是持有View的名称返回,之后View名称被view resolver,也就是实作org.springframework.web.servlet.View接口的实例解析,例如 InternalResourceView或JstlView等等:

ModelAndView(String viewName)


 如果您要返回Model对象,则可以使用Map来收集这些Model对象,然后设定给ModelAndView,使用下面这个版本的ModelAndView:

ModelAndView(String viewName, Map model)


 Map对象中设定好key与value值,之后可以在视图中取出,如果您只是要返回一个Model对象,则可以使用下面这个ModelAndView版本:

ModelAndView(String viewName, String modelName, Object modelObject)


 藉由modelName,您可以在视图中取出Model并显示。 
 ModelAndView类别提供实作View接口的对象来作View的参数:

ModelAndView(View view)

ModelAndView(View view, Map model)

ModelAndView(View view, String modelName, Object modelObject)


  一个例子是org.springframework.web.servlet.view.RedirectView,ModelAndView预设是使 用forward来转发请求结果至视图,使用RedirectView的话,则会使用redirect将请求重导至视图,例如:

public ModelAndView handleRequest(....) … {

    ....

   

    return new ModelAndView(new RedirectView(this.getViewPage()));

}

....


  在这边,viewPage的地址是从服务器网页根目录开始指定,而不是Web应用程序的根目录,所以您的getViewPage()传回的地址必须像是 /springapp/pages/index.htm这样的地址,其中springapp是您的Web应用程序目录。 
 使用forward的话,网址列上并不会出现被转发的目标地址,而且forward是在Web应用程序之内进行,可以访问Web应用程序的隐藏目录,像是WEB-INF,然而forward只能在Web应用程序中进行,不能指定至其它的Web应用程序地址。 
  使用redirect的话,是要求客户端浏览器重新发出一个指定的请求地址,因此网址列上会出现被重导的目录地址,重导的请求是由浏览器发出,所以不能 访问Web应用程序中的隐藏目录,像是WEB-INF,然而重导是重新要求一个网页,所以可以指定至其它的Web应用程序地址。 
  DispatcherServlet会根据传回的ModelAndView来解析View名称,并处理给予的Model。View名称的解析是委托给实 作org.springframework.web.servlet.ViewResolver接口的实例,ViewResolver接口定义如下:

public interface ViewResolver {

    public view resolveViewName(String, Locale locale) throws ServletException;

}


  ViewResolver的一个实例是InternalResourceViewResolver,名称解析完之后,实际的View绘制与Model转 换处理是交给实作org.springframework.web.servlet.View的实例,View接口如下:

public interface View {

    public void render(Map model, HttpServletResquest resquest, HttpServletResponse response) throws ServletException, IOException;

}


 View的实作之前用过org.springframework.web.servlet.view.InternalResourceView,另外也还有JstlView、TilesView、VelocityView等等的实作,分别进行不同的表现展处理 。




ModelAndView()

    这个构造方法构造出来的ModelAndView 

不能直接使用,应为它没有指定view,也没有绑定对应的model对象。当然,model对象不是必须的,但是view确实必须的。

    用这个构造方法构造的实例主要用来在以后往其中加view设置和model对象。 

    给ModelAndView

实例设置view的方法有两

个:setViewName(String viewName) 和 setView(View view)。前者是使用view

name,后者是使用预先构造好的View对象。其中前者比较常用。事实上View是一个接口,而不是一个可以构造的具体类,我们只能通过其他途径来获取

View的实例。对于view

name,它既可以是jsp的名字,也可以是tiles定义的名字,取决于使用的ViewNameResolver如何理解这个view name。

    如何获取View的实例以后再研究。

而对应如何给ModelAndView

实例设置model则比较复杂。有三个方法可以使用:

addObject(Object modelObject)

addObject(String modelName, Object modelObject)

addAllObjects(Map modelMap)

ModelAndView

可以接收Object类型的对象,ModelAndView

将它视为其众多model中的一个。当使用Object类型的对象的时候,必须指定一个名字。ModelAndView

也可以接收没有明显名字的对象,原因在于ModelAndView

将调用spring自己定义的Conventions 类的.getVariableName()方法来为这个model生成一个名字。显然,对model而言,名字是必须的。

Conventions.getVariableName()生成名字的规则是使用对象的类名的小写模式来作model名字。当这个model是集合或数组的时候,使用集合的第一个元素的类名加s来作model的名字。

ModelAndView

也可以接收Map类型的对象,ModelAndView

将这个Map中的元素视为model,而不是把这个Map本身视为model。但是其他的集合类可以用本身作为model对象。

实际上,ModelAndView

对model的支持来自于类ModelMap,这个类继承自HashMap。

完整的例子

Java代码   收藏代码
  1. <span style="font-size: small;">public ModelAndView handleRequestInternal(  
  2.         HttpServletRequest request,  
  3.         HttpServletResponse response) throws Exception {  
  4.           
  5.   
  6. ModelAndView mav = new ModelAndView("hello");//实例化一个VIew的ModelAndView实例  
  7.   
  8. mav.addObject("message""Hello World!");//添加一个带名的model对象  
  9.   
  10.   
  11.         return mav;          
  12.       
  13.   
  14. }  
  15. </span>  

这篇关于ModelAndView对象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/973877

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

API-环境对象

学习目标: 掌握环境对象 学习内容: 环境对象作用 环境对象: 指的是函数内部特殊的变量this,它代表着当前函数运行时所处的环境。 作用: 弄清楚this的指向,可以让我们代码更简洁。 函数的调用方式不同,this指代的对象也不同。【谁调用,this就是谁】是判断this指向的粗略规则。直接调用函数,其实相当于是window.函数,所以this指代window。

Python分解多重列表对象,isinstance实现

“”“待打印的字符串列表:['ft','bt',['ad',['bm','dz','rc'],'mzd']]分析可知,该列表内既有字符对象,又有列表对象(Python允许列表对象不一致)现将所有字符依次打印并组成新的列表”“”a=['ft','bt',['ad',['bm','dz','rc'],'mzd']]x=[]def func(y):for i in y:if isinst

Java面试题:内存管理、类加载机制、对象生命周期及性能优化

1. 说一下 JVM 的主要组成部分及其作用? JVM包含两个子系统和两个组件:Class loader(类装载)、Execution engine(执行引擎)、Runtime data area(运行时数据区)、Native Interface(本地接口)。 Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)装载class文件到Runtim

Class 对象在执行引擎中的初始化过程

一个 class 文件被加载到内存中需要经过 3 大步:装载、链接、初始化。 装载 装载是指 Java 虚拟机查找 .class 文件并生成字节流,然后根据字节流创建 java.lang.Class 对象的过程。 链接 链接过程分为 3 步:验证、准备、解析。 验证: 初始化 这是 class 加载的最后一步,这一阶段是执行类构造器方法的过程,并真正初始化类变量。 1.文件格式检验:检

添加一个对象到集合中时,集合里面存放的是对象的引用还是对象本身?

问题:添加一个对象到集合中时,集合里面存放的是对象的引用还是对象本身?   答:对象的引用。以下代码可以证明: Java代码   import java.util.ArrayList;   import java.util.List;      public class Test5 {       public static void main(String args[])

java中匿名对象分析

转自:xiazdong http://blog.csdn.net/xiazdong/article/details/6723101 一、两种实例化方式: String str = “abc”; String str = new String("abc"); 一个字符串就是String的匿名对象。 "hello".equals(str)    一

双层嵌套json字符串(即json对象内嵌json数组)解析为Map

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。 之前我层写过一篇文章,介绍了json与map的相互转化,但当时只涉及到单一的json对象或json数组,对json对象内嵌套这json数组的json字符串无法处理,这篇文章主要解决这个问题。 之前的那篇文章址:http://blo

【Web APIs】DOM 文档对象模型 ⑤ ( 获取特殊元素 | 获取 html 元素 | 获取 body 元素 )

文章目录 一、获取特殊元素1、获取 html 元素2、获取 body 元素3、完整代码示例 本博客相关参考文档 : WebAPIs 参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/APIgetElementById 函数参考文档 : https://developer.mozilla.org/zh-CN/docs/We

JavaScripts数组里的对象排序的24个方法

1. 使用 Array.prototype.sort() 这是最基本、也是最常用的方法。sort() 方法会原地修改数组,并返回排序后的数组。你需要传入一个比较函数来定义排序逻辑。 const array = [{ name: 'Alice', age: 25 },{ name: 'Bob', age: 22 },{ name: 'Charlie', age: 30 }];// 按照年龄升序