简述modelandview_ModelAndView

简述modelandview_ModelAndView当控制器处理完请求时,通常会将包含视图名称或视图对象以及一些模型属性的ModelAndView对象返回到DispatcherServlet。因此,经常需要在控制器中构造ModelAndView对象。ModelAndView类提供了几个重载的构造器和一些方便的方法,让你可以根据自己的喜好来构造ModelAndView对象。这些构造器和方法以类似的方式支持视图名称和视图对象。当

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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

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

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

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

[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_ModelAndView

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代码  

<span style="font-size: small;">public ModelAndView handleRequestInternal(  
        HttpServletRequest request,  
        HttpServletResponse response) throws Exception {  
          
  
ModelAndView mav = new ModelAndView("hello");//实例化一个VIew的ModelAndView实例  
  
mav.addObject("message", "Hello World!");//添加一个带名的model对象  
  
  
        return mav;          
      
  
}  
</span>  






版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187874.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于yolov4的目标检测_yolov5预训练模型

    基于yolov4的目标检测_yolov5预训练模型1项目的克隆和必要的环境依赖1.1项目的克隆YOLOv5的代码是开源的,因此我们可以从github上克隆其源码。不得不说GitHub的确是全球最大的男性交友网站,里面的人个个都是人才,yolov5发布才一年左右的时间,YOLOv5就已经更新了5个分支了,分别是yolov5.1-yolov5.5分支。该项目就是利用的yolov5.5分支来作为讲解。首先打开yolov5的github的https://github.com/ultralytics/yolov5/tree…

    2022年8月29日
    6
  • Idea激活码最新教程2023.2.6版本,永久有效激活码,亲测可用,记得收藏

    Idea激活码最新教程2023.2.6版本,永久有效激活码,亲测可用,记得收藏Idea 激活码教程永久有效 2023 2 6 激活码教程 Windows 版永久激活 持续更新 Idea 激活码 2023 2 6 成功激活

    2025年5月27日
    5
  • 阿里云centOS安装图形界面

    阿里云centOS安装图形界面阿里云默认的centOS是不带图形界面的。为了便于查看和操作,我们需要手动安装centOS的GnomeGUI包。主要记录以下几步:(1)首先安装X系统组件#yumgroupinstall"XWindowSystem"(2)安装Gnome包#yumgroupinstall"GNOMEDesktop""GraphicalAdministrationTool…

    2022年6月9日
    37
  • java可重入锁与不可重入锁

    java可重入锁与不可重入锁所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。synchronized和  ReentrantLock都是可重入锁。可重入锁的意义在于防止死锁。实现原理是通过为每个锁关联一个请求计数器和一个占有它的线程。当计数为0时,认为锁是未被占有的;线程请求一个未被占有的锁时,JVM将记录锁的占有者,并且将请求计数器置为1…

    2022年6月26日
    28
  • Linux驱动编程中EXPORT_SYMBOL()介绍

    Linux驱动编程中EXPORT_SYMBOL()介绍一、查看内核驱动代码你会发现很多的函数带有EXPORT_SYMBOL()宏定义。二、那么EXPORT_SYMBOL的作用是什么?      EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。三、使用方法 

    2022年7月12日
    17
  • IE主页被https://hao.360.cn/?a1004劫持,如何解决

    IE主页被https://hao.360.cn/?a1004劫持,如何解决最近IE主页被https://hao.360.cn/?a1004劫持了,不管如何杀毒,更换主页地址,都是不行,包括306、火绒等工具,它就是那么的顽强,不让你更改。但是发现一个现象,那就是如果你在C:\ProgramFiles(x86)\InternetExplorer里找到iexplore.exe,直接打开,会跳转到自己设置的主页,如果你把ie“固定到开始屏幕”,然后在开始屏幕里打开,还是被劫持,那如何解决呢?解决方案:1、IE的主页里先设置自己需要的地址;2、卸载360安全卫士;

    2022年7月26日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号