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

相关文章

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

PHP7扩展开发之对象方式使用lib库

前言 上一篇文章,我们使用的是函数方式调用lib库。这篇文章我们将使用对象的方式调用lib库。调用代码如下: <?php $hello = new hello(); $result = $hello->get(); var_dump($result); ?> 我们将在扩展中实现hello类。hello类中将依赖lib库。 代码 基础代码 这个扩展,我们将在say扩展上增加相关代码。sa

hibernate修改数据库已有的对象【简化操作】

陈科肇 直接上代码: /*** 更新新的数据并并未修改旧的数据* @param oldEntity 数据库存在的实体* @param newEntity 更改后的实体* @throws IllegalAccessException * @throws IllegalArgumentException */public void updateNew(T oldEntity,T newEntity