在Java Web开发中MVC设计模式及其改进版的应用

减小字体 增大字体 作者:佚名  来源:www.zhonghualunwen.com  发布时间:2012-08-04 12:25:15

  1.定义阐述
  设计模式:是经过验证的,用于解决特定环境下、重复出现的特定问题的解决方案。经过验证:说明这个设计模式是相对比较优秀的方案,是可行的方案,这样才具有学习、研究和使用价值。
  MVC设计模式:是一种架构型设计模式,它本身不引入新的功能,只是指导我们把Web应用结构做的更加合理,实现逻辑与页面相分离。
  功能型设计模式:如单例(保证类的实例唯一)、工厂(选择实现)、值对象(封装数据)、DAO(屏蔽变化)等等。
  架构型设计模式:结构性的设计模式,只是让程序更具有结构化。
  Java中MVC来源思路及进化过程:Servlet=Java+HTML字符串,问题产生了,由于拼字符串太麻烦→解决方案:HTML独立出来从而得到→JSP≈HTML+Java脚本(问题又产生了,能解决Servlet问题,但是带来了页面和逻辑混杂) →解决方案:MVC(指导我们让Web应用程序结构更加合理)。
  2.MVC三部分内容及各部分功能如下
  ①Model:VO+逻辑层:可以理解为后台部分。
  功能:封装应用状态、响应状态查询、暴露应用功能。
  ②View:视图层的三大功能,典型的如修改页面,触发事件而不处理,纯jsp自己处理,提交给Controller处理。
  功能:产生HTML响应、请求模型更新、提供HTML表单用于用户请求。
  对比:纯jsp页面中事件处理与页面展示混杂在一起,MVC中事件处理由Controller承担,从而达到逻辑与页面相分离的效果。
  ③Controller:事件处理过程。
  功能:验证HTML请求的数据、将用户数据与模型更新相映射、选择用于响应的视图。
  3.MVC演化过程及示例
  ①没有使用MVC,做纯JSP应用时,结构不太合理,在JSP页面写的代码太多,尤其是控制器代码,页面和逻辑太过于混杂,因此引入一个中间层——控制器来专门处理控制器代码。
  ②标准的MVC的组件关系:
  View用户请求到控制器,控制器状态改变通知Model,Model主动通知View说Model自身已改变,View主动去Model里面去状态查询。
  下面先看个标准的MVC单机版的示例:
  Eclipse本身就是基于MVC做的,例如当我们打开Eclipse时修改编辑区的代码时,左边的Navigator视图和右边的Outline视图等都会自动更新而随着编辑区的代码改变而改变。实际上这些窗口观察的都是同一个Model,即观察XX.java代码文件的内容,这种多个View观察者观察同一个Model文件的在设计模式中也有个设计模式与其对应即观察者设计模式。
  观察者设计模式Java代码示例的如下:
  ⑴根据前面的内容抽象,首先必须有个被观察的对象,即目标对象叫做MySubject.java:
  public class MySubject extends Observable{
  private String content="";
  public String getContent() {
  return content;
  }
  public void setContent(String content) {
  this.content = content;
  //需要通知所有观察者
  this.setChanged();
  this.notifyObservers();
  }
  }
  观察者观察的为目标对象的内容Content,当内容改变了即有人setContent需要通知所有的观察者。
  ⑵其次应该有些观察者,叫做MyObserver:
  public class MyObserver implements Observer{
  private String name;
  public MyObserver(String name) {
  this.name=name;
  }
  @Override
  public void update(Observable o, Object msg) {
  //推模型
  System.out.println(name+"推过来的===="+msg);
  //拉模型
  System.out.println(name+"推过来的===="+((MySubject)o))
  }
  }
  MyObserver实现一个update回调方法,即MyObserver去观察MySubject,观察到后采取的处理即这个update方法。这里的观察者又有两种模型,一种是被观察者主动推过来的消息即推模型,另一种就是观察者主动去拉内容即拉模型。其实观察者模式也叫出版订阅模式,推模型即订报的意思,即报刊发行商将报纸送上门服务,拉模型即某个时刻大家主动去报刊亭买报的这种模型。
  ⑶客户端测试代码,Client.java:
  public class Client {
  public static void main(String[] args) {
  //创建一个被观察的目标对象
  MySubject subject=new MySubject();
  //创建观察者
  MyObserver ob2=new MyObserver("lsi");
  MyObserver ob3=new MyObserver("wwu");
  //注册观察者
  subject.addObserver(ob2);
  subject.addObserver(ob3);
  //报社出报纸
  subject.setContent("观察者模式");
  } (下转第97页)
  (上接第125页)}
  首先创建一个目标对象,然后创建三个观察者,然后注册观察者相当于订报纸,然后报社出报纸即内容改变时触发观察者,当被观察的对象改变时需要通知观察者也即对应MySubject.java。
  代码输出结果:
  wwu推过来的====null
  wwu主动去拉====观察者模式
  lsi推过来的====null
  lsi主动去拉====观察者模式
  当将Client.java文件中的MyObserver ob2=new MyObserver("lsi");、和subject.addObserver(ob2);注释掉时,输出结果中间2行随之也不显示出来,即所谓的lis退订。
  ③改进的版的MVC
  在Java WEB开发中会产生一个问题:就是为什么Model会主动通知View自身已经改变了呢?因为Java中标准的MVC起源于Swing,这种标准的MVC只能适应于单机版,在WEB开发中无法实现,因为WEB是基于请求应答模式的环境,Model不会在没有请求的情况下直接通知View自身的改变。
  改进版后的MVC一般实现方式:View用JSP来实现,Controller由Servlet来实现,Model由JavaBean来实现。
  【参考文献】
  [1][美]Robert Lafore 著.计晓云,赵研等译.Java数据结构与算法.北京:中国电力出版社, 2003.

Tags:应用

作者:佚名
  • 好的评价 如果您觉得此文章好,就请您
      0%(0)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论