`

解析MVC模式

阅读更多

  MVC模式概述

  MVC是三个单词的缩写,分别为:

  模型(Model),视图(View)和控制Controller)。

  MVC模式的目的就是实现Web系统的职能分工。

  Model层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。

  View层用于与用户的交互,通常用JSP来实现。

  Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。

  MVC模式的好处

  各施其职,互不干涉

  在MVC模式中,三个层各施其职,所以如果一旦哪一层的需求发生了变化,就只需要更改相应的层中的代码而不会影响到其它层中的代码。

  有利于开发中的分工

  在MVC模式中,由于按层把系统开,那么就能更好的实现开发中的分工。网页设计人员可以进行开发视图层中的JSP,对业务熟悉的开发人员可开发业务层,而其它开发人员可开发控制层。

  有利于组件的重用

  分层后更有利于组件的重用。如控制层可独立成一个能用的组件,视图层也可做成通用的操作界面。

  不同JSP构造的应用

  为什么要组合使用servlet & JSP?

  典型的做法:使用JSP来简化HTML内容的开发与维护

  对于简单的动态代码,使用由脚本元素调用JAVA代码来完成。

  对于稍微复杂一些的应用,则可使用脚本元素调用定制的类来完成。(即所谓的help类)

  对于比较复杂的应用,则使用JAVA BEAN和定制标签

  但,这些是不够的

  对于复杂的处理过程,从JSP开始做起会难以处理。

  JSP除了能够带来将实际的代码隔离成单独的类、bean、和定制标签的便利以外,它所隐含的假定是单个页面给出单个基本视图。

  对MVC的误解

  必须采用复杂的框架

  框架有时很有用

  Struts

  JavaServer Faces (JSF)

  但并非必需!

  对于大多简单或者适度复杂的应用来说,使用内建的RequestDispatcher就能够很好地实现MVC

  MVC影响整个系统的设计

  我们可以用MVC来处理单个请求

  可以将它认为是MVC方案,而非MVC框架。

  也被称为是模型2方案

  用RequestDispatcher实现MVC

  1. 定义用以表示数据的java bean

  2. 使用一个servlet处理请求

  servlet读取请求参数,检查数据的缺失或异常等。

  3. 填充bean

  该servlet调用业务逻辑或数据访问代码得到最终的结果。得出的结果被放在第一步中定义的bean中。

  4. 将bean存储在请求,会话或servlet的上下文中

  该servlet调用请求、会话或servlet上下文对象的setAttribute存储表达请求结果的bean的引用。

  5. 将请求转发到JSP页面

  该servlet确定哪个JSP页面适合于处理当前的情形,并使用RequestDispatcher的forward方法将控制转移到那个页面。

  6. 从bean中提取数据

  JSP页面使用jsp:useBean和与第4步匹配的位置访问之前存储的bean,然后使用jsp:getProperty输出bean的属性。

  JSP页面并不创建或修改bean;它只是提取并显示由servlet创建的数据。

  jsp:useBean在MVC中的使用与在独立JSP页面中有什么不同

  JSP页面不应该创建对象

  应该由servlet创建所有的数据对象。因此,为了保证JSP页面不会创建对象,我们应该使用<jsp:useBean ... type=“package.Class” />

  而不是<jsp:useBean ... class="package.Class" />

  JSP页面也不应该修改已有的对象

  因此,我们应该只使用jsp:getProperty,不使用jsp:setProperty。 提示:jsp:useBean的scope选项

  request

  <jsp:useBean id="..." type="..." scope="request" />

  session

  <jsp:useBean id="..." type="..." scope="session" />

  application

  <jsp:useBean id=".." type=".." scope="application" />

  page

  <jsp:useBean id=“...” type=“...” scope=“page” />

  或者仅仅使用<jsp:useBean id="..." type="..." />

  MVC (Model 2)构架不使用这个scope。

  不同数据共享方式

  向用户显示一个随机的数字。

  由于每次请求应该产生新的数字,因而基于请求的共享是恰当的。

  显示用户的姓和名

  数据要为每个客户存储,因而基于会话的共享比较适用。

  显示一个指定长度的质数。

  数据在多个客户间共享,因此,基于应用的共享比较恰当。

  基于请求的数据共享

  Servlet

  ValueObject value = new ValueObject(...);

  request.setAttribute("key", value);

  RequestDispatcher dispatcher =

  request.getRequestDispatcher("/WEB-INF/SomePage.jsp");

  dispatcher.forward(request, response);

  JSP

  <jsp:useBean id="key" type="somePackage.ValueObject"

  scope="request" />

  <jsp:getProperty name="key" property="someProperty" />

  基于会话的数据共享

  Servlet

  ValueObject value = new ValueObject(...);

  HttpSession session = request.getSession();

  session.setAttribute("key", value);

  RequestDispatcher dispatcher =

  request.getRequestDispatcher("/WEB-INF/SomePage.jsp");

  dispatcher.forward(request, response);

  JSP

  <jsp:useBean id="key" type="somePackage.ValueObject"

  scope="session" />

  <jsp:getProperty name="key" property="someProperty" />

  基于ServletContext的数据共享

  Servlet

  synchronized(this)

  {

  ValueObject value = new ValueObject(...);

  getServletContext().setAttribute("key", value);

  RequestDispatcher dispatcher =

  request.getRequestDispatcher("/WEB-INF/SomePage.jsp");

  dispatcher.forward(request, response);

  }

  JSP

  <jsp:useBean id="key" type="somePackage.ValueObject“ scope="application" />

  <jsp:getProperty name="key" property="someProperty" />

  JSP页面中的相对URL

  问题:

  使用请求分配器进行的转发对客户来说是透明的。初始的URL是浏览器惟一知道的URL。

  为什么这会比较重要?

  浏览器会如何处理类似下面的这些标签:

  <IMG SRC="foo.gif" …>

  <LINK REL=STYLESHEET

  HREF="JSP-Styles.css" TYPE="text/css">

  <A HREF="bar.jsp">…</A>

  答案:浏览器将会把它们看作是相对于servlet的URL

  最简单的解决方案:

  使用以斜杠开始的URL

  Summary

  MVC (Model 2) 方式适用于:

  单次提交会产生多个基本外观。

  几个页面拥有大量公共的处理过程。

  需要为同样的数据提供多个视图的应用程序,它很好地实现了数据层与表示层的分离,特别适用于开发与用户图形界面有关的应用程序

  构架

  由一个servlet应答初始的请求

  Servlet完成实际的数据处理并将结果存储在bean中

  Bean存储在HttpServletRequest, HttpSession, 或ServletContext中

  Servlet使用RequestDispatcher的forward方法将请求转发到JSP页面

  JSP页面通过使用jsp:useBean和相应的作用域(request, session, application)从bean中读出数

分享到:
评论

相关推荐

    精品文章 - 解析MVC模式.htm

    精品文章 - 解析MVC模式,更好的帮助你了解MVC编程的学习。

    MVC模式架构的产品可拓创新软件

    针对社会对创新产品的需求,采用可拓创新方法,同时为了确保系统高效、结构清晰以及良好的可扩展性、可维护性与代码可重用性,结合计算机技术中的MVC模式,提出了基于MVC模式的产品可拓创新软件.通过分析产品创新过程中...

    MVC设计模式视图层中的应用

    MVC设计模式视图层中的应用 内容非常详细 让mvc一目了然

    深入解析Spring+MVC与Web+Flow.pdf

    《深入解析Spring MVCgn Web Flow》是Spring MVC 和Web Flow 两个框架的权威指南,书中包括的技巧和提示可以让你从这个灵活的框架中汲取尽可能多的信息。书中包含了一些开发良好设计和解耦的Web 应用程序的最佳实践...

    MVC案例解析与传统开发的源代码比较

    MVC案例解析与传统模式开发的比较,提供源代码进行大家研究学习,适合初学者学习!@

    ExtJS4.1实现的mvc模式经典入门案例

    这是一个mvc模式实现的ExtJS案例,非常适合新手了解ExtJS的mvc模式!代码中有详细的注释解析,为大家学习提供方便。

    ASP.NET MVC_完全解析

    ASP.NET MVC_完全解析, MVC是一个许多开发者都熟悉的、标准的设计模式。一些类型的Web应用程序将从MVC框架中受益。

    Android源码设计模式解析与实战

    优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象...模式、组合模式、适配器模式、装饰模式、享元模式、外观模式、桥接模式...

    Android 源码设计模式解析与实战

    优化代码的第一步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象...模式、组合模式、适配器模式、装饰模式、享元模式、外观模式、桥接模式...

    基于PHP 二级域名系统 v1.0-qqymv1.0的毕业设计,采用MVC模式,后端框架Laravel,数据库MySQL

    本系统使用PHP作为开发语言,采用MVC模式进行开发。前端使用Bootstrap框架进行设计,后端使用PHP的框架Laravel进行开发。数据库使用MySQL进行存储。 在实现过程中,我们将系统分为用户模块、域名管理模块、域名解析...

    MVC模式开发包

    JSP标准标签的时候,需要在web项目中使用jstl-1.2、...-----jaxen-1.1-beta-6.jar用于解析XPath表达式-------dom4j-1.6.1.jardom4j用于操作XML文件----commons-logging.jar,commons-beanutils-1.8.0.jar的依赖jar包

    Android源码设计模式解析与实战PDF

    优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象...模式、组合模式、适配器模式、装饰模式、享元模式、外观模式、桥接模式...

    《Android 源码设计模式解析与实战》

    优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象...模式、组合模式、适配器模式、装饰模式、享元模式、外观模式、桥接模式...

    IOS设计模式解析及源码

    解析iOS设计模式的开山之作 优化Objective-C编程实践的必修宝典 由此迈入移动开发高手行列 本书讲述如何在代码中应用创建型模式、结构型模式和行为模式等,如何设计模式以巩固应用程序,并通过设计模式实例介绍MVC...

    基于Ajax的新MVC框架的研究与实现

    本文将Ajax技术与MVC模式紧密结合,设计了一个新的MVC框架。应用该框架后,客户端请求基本都是Ajax请求。本文首次采用了Container这一概念,并提出了Container树结构信息的表示法,设计了针对该表示法的解析及生成算法。...

    Objective-C编程之道 IOS设计模式解析

    书中应用GoF的经典设计模式,介绍了如何在代码中应用创建型模式、结构型模式和行为模式,如何设计模式以巩固应用程序,并通过设计模式实例介绍MVC在CocoaTouch框架中的工作方式。 《Objective-C编程之道:iOS设计模式...

    express-mvc:轻量级的mvc模式,用于具有最小依赖性的express框架

    用于轻量级MVC模式的Express框架,具有最小的依赖性 安装 npm install express-mvc-generate -g Express MVC generator命令将被全局安装,因此您可以在任何地方调用它以生成项目框架。 express-mvc-generate my-...

    《OBJECTIVE-C编程之道 IOS设计模式解析》电子书+源代码

    书中应用GoF的经典设计模式,介绍了如何在代码中应用创建型模式、结构型模式和行为模式,如何设计模式以巩固应用程序,并通过设计模式实例介绍MVC在CocoaTouch框架中的工作方式。 《Objective-C编程之道:iOS设计...

Global site tag (gtag.js) - Google Analytics