作为一名java工程狮,大家肯定经历过很多面试,但每次几乎都会被问到什么是MVC设计模式,你是怎么理解MVC的类似这样的一系列关于MVC的问题。

【出现频率】

【关键考点】

  • MVC的含义
  • MVC的结构 

【考题分析】 

  在java Web开发中,存在两种普遍的开发模式,通常成为模式1和模式2。模式1使用JSP+JavaBean技术将页面显示和业务逻辑分开,由JSP来实现页面的显示,JavaBean对象来保存数据和实现业务逻辑。客户端直接向JSP发出请求,JSP做出相应的响应,并调用JavaBean对象,所有的数据通过JavaBean来处理,然后再返回JSP,由JSP生成最后的返回结果,模型1的结构图如下所示:

        

在模型一中,JSP往往会嵌入控制请求流程的代码和部分逻辑代码,如果把这部分代码提取出来,由一个单独的角色来承担,该角色也就是控制器,则此时就构成了    模型2,模型2就符合了MVC的设计模式,即模型--视图--控制器Model--View--Controller)。

  MVC的架构的Web程序被分割成若干逻辑部件,使得程序开发编程变的更加容易。它把对象按照功能的不同分割成3个部分,主要目的就是为了将各种对象的耦合度降到最低。被分割成的3个部分为:模型(Model),视图(View),控制器(Controller)

  • 模型(Model):代表了应用程序的数据和处理这些数据的规则。当模型发生变化时,它会通知视图,并为视图提供查询模型相关状态的能力。
  • 视图(View):用来组织模型的内容,它从模型中获取数据,然后将数据展现给客户,该角色往往又JSP承担。
  • 控制器(Controller):负责从客户端接受请求,并把这些请求转换为某种行为。这些行为往往又模型来实现,这些行为完成以后,再选择一个视图来展现给客户。   

  下面简单介绍一下最基础的开发模式(JSP-Servlet)来构建一个MVC架构模式,后来的那些框架都是在此基础上增加的,代替相应的组件实现MVC的设计模式的。

(JSP-Servlet)开发中,由Servlet来充当控制器的角色,它接受请求,根据请求信息的不同将它们分发给合适的JSP页面来作为用户的响应,同时,Servlet还需要实例化一个JavaBean对象,JSP就可以通过使用JavaBean的相关标签(如<jsp:getProterty>)来的到JavaBean的数据,结构如下图所示:

  采用模型2,可以将页面的显示,业务逻辑的处理和流程的控制很清晰的分离出来。JSP负责数据的显示,JavaBean负责业务逻辑的处理,Servlet负责流程的控制。MVC模式使得Web应用程序很容易扩展和维护,因为各个部件的功能不同,可以由不同的人进行开发和维护。例如,前端攻城狮专门负责JSP页面,充分发挥她们的美术和设计才能,后台攻城狮负责业务逻辑的实现。

Struts1框架是如何体现MVC模式的

  虽然struts1现在基本由于使用不方便基本已被struts2所替代,但许多老的项目还是用struts1写的,所以有必要对struts1的框架了解一下,毕竟它曾经也驰骋疆场数载呢,现在依然在某些项目中还能看到它的身影。

  struts1的控制器(Controller)由ActionServlet、Action和struts-config.xml组成。ActionServlet是struts的入口,所有的请求都会通过它来处理,然后由它来决定相应的Action来处理请求。Action代表了一次动作,如用户注册、购买商品等,开发者的业务逻辑代码也会在这里添加。配置文件struts-config.xml是对整个struts的配置,包括ActionServlet应该将请求转发给那个Avtion,Action负责处理完成之后,又该由那个JSP文件作为响应等。

  struts1的模型(Model)主要由ActionForm来实现,它有一点类似于JavaBean,包含了若干可读可写的属性,用于保存数据,也有数据验证的功能。一般来说,一个Action会配备一个ActionForm。

  struts1的视图(View)主要由JSP来实现。JSP显示的数据可以来自ActionForm,也可以是Action保存在作用范围(request,session,application)的数据。当然,使用struts自带的标签可以起到最大的简化作用。

  使用struts1开发Web应用程序以后,开发者的思考方式需要做一下改变,Action、ActionForm和JSP是一个整体了,每一个HTTP请求都需要它们三者协作来完成。JSP代表用户可以看到的东西,ActionForm代表的是数据,Action代表的是业务逻辑。下图所示的是struts1的MVC各个组成部分,以及它们是如何一起协调工作的。

                       

 以上就是struts1最核心的设计思想,开发人员大多数的时候只需要完成文件配置和Action,将大多数精力集中在Action中的业务逻辑实现上面。如果业务上有改动,只需要修改action即可,如果显示上有变化,也只需要修改JSP,两者实现了耦合,互不影响。下面这个图大概讲解一下Struts处理请求的过程和原理。

                                              

谈谈JAVA工程狮面试中经常遇到的面试题目------什么是MVC设计模式的更多相关文章

  1. 解决Java工程URL路径中含有中文的情况

    问题: 当Java工程路径中含有中文时,得不到正确的路径 *** 解决: 这其实是编码转换的问题.当我们使用ClassLoader的getResource方法获取路径时,获取到的路径被URLEncod ...

  2. 谈谈如何在面试中发掘程序猿的核心竞争力zz

    早两天看了知乎日报的这篇文章<什么是程序员的核心竞争力?>,caoz讲的几点是让我感同身受.这让我联想起了给程序猿的面试,其实也就是通过短暂的接触来发掘程序猿的核心竞争力.接下来我就谈谈我 ...

  3. (转)面试大总结之一:Java搞定面试中的链表题目

    面试大总结之一:Java搞定面试中的链表题目 分类: Algorithm Interview2013-11-16 05:53 11628人阅读 评论(40) 收藏 举报 链表是面试中常出现的一类题目, ...

  4. 剑指offer-第六章面试中的各项能力(圆圈中剩下的最后数字)

    import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util ...

  5. 如何准备阿里社招面试,顺谈 Java 程序员学习中各阶段的建议

    引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...

  6. 面试中关于Java你所需知道的的一切

    本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺. 1. Java中的原始数据类型都有哪些, ...

  7. JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结

    我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和 ...

  8. java工程中的.classpathaaaaaaaaaaaaaaaa<转载>

    第一部分:classpath是系统的环境变量,就是说JVM加载类的时候要按这个路径下去找,当然这个路径下可以有jar包,那么就是jar包里所有的class. eclipse build path是ec ...

  9. java工程中的.classpath<转载>

    第一部分:classpath是系统的环境变量,就是说JVM加载类的时候要按这个路径下去找,当然这个路径下可以有jar包,那么就是jar包里所有的class. eclipse build path是ec ...

随机推荐

  1. viso

  2. F.I.S初探(前端工程化)

    云笔记:http://note.youdao.com/share/?id=7c4a2dcf118f0ad7bb52a36aaee46a7a&type=note   一.初识FIS 在做项目中遇 ...

  3. ABP理论学习之异常处理

    返回总目录 本篇目录 介绍 开启错误处理 非Ajax请求 展示异常信息 UserFriendlyException Error模型 Ajax请求 异常事件 介绍 在一个web应用中,异常通常是在MVC ...

  4. Android开发学习之路-PopupWindow和仿QQ左滑删除

    这周作业,要做一个类似QQ的左滑删除效果的ListView,因为不想给每个item都放一个按钮,所以决定用PopupWindow,这里记录一下 先放一下效果图: 先说明一下这里面的问题: ①没有做到像 ...

  5. SQL中Group By的使用

    1.概述 2.原始表 3.简单Group By 4.Group By 和 Order By 5.Group By中Select指定的字段限制 6.Group By All 7.Group By与聚合函 ...

  6. Android_安卓为按钮控件绑定事件的五种方式

    一.写在最前面 本次,来介绍一下安卓中为控件--Button绑定事件的五种方式. 二.具体的实现 第一种:直接绑定在Button控件上: 步骤1.在Button控件上设置android:onClick ...

  7. Box Model,边距折叠,内联和块标签,CSSReset

    一.盒子模型(Box Model) 1.1.宽度测试 1.2.溢出测试 1.3.box-sizing属性 1.4.利用CSS画图 二.边距折叠 2.1.概要 2.2.垂直方向外边距合并计算 三.内联与 ...

  8. 谈谈php里的IOC控制反转,DI依赖注入

    理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(In ...

  9. C#设计模式系列:享元模式(Flyweight)

    当频繁地从数据源读取数据时,读出的内容存在重复,那么需要使用享元模式(Flyweight)来提高内存效率,Flyweight模式将节省更多空间,共享的Flyweight越多,空间节省越大. 1.享元模 ...

  10. android给View设置上下左右边框

    给View控件设置边框,可以动态设置上下左右.通过布局文件就能搞定 1.在drawable文件夹下新建一个shape_main_list_bg.xml文件 <layer-list xmlns:a ...