Java中ModelAndView是做啥的?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中ModelAndView是做啥的?相关的知识,希望对你有一定的参考价值。
这是MVC中的两个模块Model 是指数据模型
View是指UI视图
另外Control是指控制流
为什么要用MVC, 目前凡是涉及到UI有界面的程序,最好采用MVC模式来设计。
View: 我们要专门有一个模块,还存放所有的UI组件库, 按钮,图片,文本框,列表,菜单等等,这些东西都是死的,没有内容。 比方说文本框,你从组库中把文本框拿出来,默认里面没有任何文字。
Model: 我们的数据模型,如果是面向对象的程序,那就是一个个的数据类。如学生,老师,汽车,职员等等。他们也可以理解成数据结构。我们必须有一个专门的模块来存放这些结构。 结构也是死的,如果没有把他拿出来用,他就永远躺上该模块中。
Control: 控制者, 可以理解成一段代码, 它会根据当前的程序状态机,将合适的数据模型中的数据填充到UI视图中。也可以反过来通过监听UI组件的变化,将一部分变化写回数据模型中。
举例:
用户注册界面,
有四个 UI组件 1。文本框提示用户一些注册信息 2。两个输入型文本框可以让用户输入帐号和密码 3。一个按钮。
这里,Model是用户资料
View就是这四个UI组件
而Control需要程序加上代码:
当按钮被按下,首先生成User的实例,其实从两个输入框中分别获取字符串, 将user的id和password赋值。 保存user实例或者发送到server端。
在这个过程中,三个模块各司其职,尽可能少地相互不干涉。特别是model和view之间不干涉,而control是桥梁。
以上是对java的MVC模式的广义解说。
MVC在java的web应用中还有狭义的解说,也就是B/S中常用的MVC架构,具体可以查询这方面资料。 参考技术A
ModelAndView以org.springframework.ui.ModelMap的形式来保持模型数据,通过构造方法传入的或者通过实例方法添加的模型数据都将添加到这个ModelMap中。至于ModelMap中保持的模型数据将会在视图渲染阶段,由具体的View实现类来获取并使用。
我们需要为添加到ModelAndView的一组或者多组模型数据提供相应的键(Key),以便具体的View实现类可以根据这些键获取具体的模型数据,然后公开给视图模板。通常,模型中的数据对应的键需要与视图模板中的标志符相对应,如图所示:
基于JSP/JSTL模板的视图实现,通常是将模型数据通过HttpServletRequest的属性(Attribute)的形式公开给具体的模板。而像基于Velocity之类的通用模板引擎的视图实现,则会将ModelAndView中的模型数据复制到它们自己的数据获取上下文中,比如Velocity的Context。
但不管什么视图类型,对应的视图模板都将可以通过添加到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并显示。
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生成一个名字。
参考技术B Java web程序通常都是MVC模式来实现的,Model简称模型层,打个比方说一个学生他有姓名,性别,年龄,班级,学号这些属性。学校里面要将他的信息录入到学校的数据库里面去,用数据库语言来讲就是往数据库里插入一条语句,插入一条实体对象。模型则是由一个实体Bean来实现。实体Bean中就只有属性,set,get 方法。View简称试图层。在J2EE应用程序中,视图(View)可能由Java Server Page(jsp)组成。生成视图的代码则可能是一个servlet的一部分,特别是在客户端服务端交互的时候。 参考技术C 就是业务逻辑层和表现层,灌水…… 参考技术D Spring Web MVC 处理Http请求的大致过程:
一旦Http请求到来,DispatcherSevlet将负责将请求分发。DispatcherServlet可以认为是Spring提供的前端控制器,所有的请求都有经过它来统一分发。
在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。HandlerMapping是这样一种对象,它能够完成客户请求到Controller之间的映射。在Struts中,这种映射是通过struts-config.xml文件完成的。其中,Spring为Controller接口提供了若干实现,例如Spring默认使用的BeanNameUrlHandlerMapping。还有,SimpleUrlHandlerMapping,CommonsPathMapHandlerMapping。
Spring Controller将处理来自DispatcherServlet的请求。Spring的Controller类似于struts的Action,能够接受HttpServletRequest和HttpServletResponse。Spring为Controller接口提供了若干实现类,位于org.springframework.web.servlet.mvc包中。由于Controller需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。Controller将处理客户请求,这和Struts Action 扮演的角色是一致的。
一旦Controller处理完客户请求,则返回ModelAndView对象给DispatcherServlet前端控制器。ModelAndView中包含了模型(Model)和视图(View)。从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观角度考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型和视图。前端控制器返回的视图可以是视图的逻辑名,或者实现了View接口的对象。View对象能够渲染客户响应结果。其中,ModelAndView中的模型能够供渲染View时使用。借助于Map对象能够存储模型。
如果ModelAndView返回的视图只是逻辑名,则需要借助Spring提供的视图解析器(ViewResoler)在Web应用中查找View对象,从而将响应结果渲染给客户。
DispatcherServlet将View对象渲染出的结果返回个客户。
for(int i : x) 是做啥的? [复制]
【中文标题】for(int i : x) 是做啥的? [复制]【英文标题】:What does for(int i : x) do? [duplicate]for(int i : x) 是做什么的? [复制] 【发布时间】:2015-06-17 18:57:57 【问题描述】:我是 Java 新手。我正在阅读某人对问题的解决方案,我遇到了这个问题:
int[] ps = new int[N];
for (int i = 0; i < N; i++)
ps[i] = input.nextInt();
int[] counts = new int[1005];
for (int p : ps)
counts[p]++;
最后两行是做什么的?
【问题讨论】:
变量p
覆盖数组ps
。你可以玩一下它,看看它是如何工作的,例如在循环中打印p
的值。
这是增强的 for 循环。 p 是一个局部变量
【参考方案1】:
这是一个 for-each 循环。它将p
设置为ps
的第一个元素,然后运行循环体。然后将p
设置为ps
的第二个元素,然后运行循环体。以此类推。
大概是以下简称:
for(int k = 0; k < ps.length; k++)
int p = ps[k];
counts[p]++;
【讨论】:
【参考方案2】:For-each 循环(高级或增强型 For 循环):
Java5 中引入的 for-each 循环。主要用于遍历 数组或集合元素。 for-each 循环的优点是 它消除了错误的可能性并使代码更 可读。
语法
for(data_type variable : array | collection)
来源:Java For Each Loop
在您的情况下,此循环正在迭代 Array
没有 For Each 循环的等效代码
for (int i=0;i<ps.length;i++)
int p=ps[i];
counts[p]++;
【讨论】:
p
不是数组ps
的元素的索引
@singhakash,我试图向他解释 For-Each 循环,计数器如何递增,没有进行逻辑解释,仍在编辑它!【参考方案3】:
这是一个 for 循环。 for (int p : ps)
迭代 ps
int 数组中的整数
【讨论】:
【参考方案4】:该行正在遍历数组的每个索引,并在 p
变量的序列中取出其值。您可以通过以下方式检查
for (int p : ps) // if ps is 1,2,3
System.out.print(p+" "); // it will print 1 2 3
counts[p]++;
【讨论】:
以上是关于Java中ModelAndView是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript 与Java、Java applet都有啥区别?各是做啥的?