第5章 MVC风格与Struts框架_第1页
第5章 MVC风格与Struts框架_第2页
第5章 MVC风格与Struts框架_第3页
第5章 MVC风格与Struts框架_第4页
第5章 MVC风格与Struts框架_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章MVC风格与Struts框架《软件体系结构与设计实用教程》第二版5.1MVC风格模型-视图-控制器风格1979年TrygveReenskaug(挪威奥斯陆大学教授

)提出,在XeroxPARC(施乐帕克研究中心)用于Smalltalk语言

19世纪90年代末,

MVC被划为一种软件体系结构风格。从开发者的角度看,MVC的目标是,实现model与view的解耦从而简化软件体系结构,进而使源代码具有更好的灵活性和可维护性。在Java以及其他语言中,非常流行的,广泛使用关注点分离:模型(businesslogic)、视图(userinterface)和控制器,各自独立Model包含核心功能与数据,View与用户进行交互,Controller控制View的显示。Model被设计成独立于特定的输入行为和输出表示的程序,View将Model中的数据显示给用户。相同的数据可以有不同形式的显示方法,一个Model可以对应多个View。模型在其外部数据被改变时需要通知所有的视图,视图则据此更新显示信息。每个View可以拥有与之相关联的Controller。MVC体系结构风格组件:模型、视图、控制器连接件:显式调用、隐式调用、其他机制(例如:Http协议)MVC工作机制Model(模型)模型的职责负责数据存取

负责业务逻辑实现

负责数据验证

模型:模型是应用程序的核心。它封装内核数据与状态,对模型的修改将扩散到所有视图中。所有需要从模型获取信息的对象都必须注册为模型的视图。在事件驱动系统,当信息发生改变,模型通知观察者(observers)(通常是视图),从而引起视图反应。View(视图)视图的职责:获取用户输入向controller发送处理请求

接收来自Controller的反馈将model的处理结果显示给用户一个model可能有多个ViewController(控制器)控制器职责:接收来自客户的请求调用model执行

调用View显示执行结果控制器:控制器是提供给用户进行操作的接口。每个视图与一个控制器组件相关联。控制器接收用户的输入,通常是鼠标移动、键盘输入等。输入事件翻译成服务请求,送到模型或视图。用户只通过控制器与系统交互。两个主要分离:模型与界面分离控制器与视图分离优点:将各方面问题分解开来考虑,简化了系统设计,保证了系统的可扩展性。改变界面不影响应用程序的功能内核,使得系统易于演化开发,可维护性好。同一信息可以有不同的展现方式。业务逻辑更易测试

MVC的优点MVC的缺点主要用于用户界面复杂并且繁多的应用软件开发领域中。基于MVC体系结构的二手车拍卖系统CarModel封装二手车软件的业务逻辑部分,包括核心数据(待拍卖车的图片、文字介绍等);还包含了tell()方法,用于告诉视图类CarModel的状态改变了。CarGUIView类与CarBitView类是视图类,本例中是图形界面类,功能是单独显示车的图片、文字介绍以及拍卖报价等信息。在这两个类的update()方法中,调用CarModel类中待拍卖车的有关信息,然后将最新的数据更新到它们所形成的图形界面上。控制器Controller类负责根据CarAuctionGUI对象输入的客户选择信息,更新CarModel类的数据,然后选择相应的视图显示更新后的数据。模型类模型类CarModel封装二手车软件的业务逻辑部分,包括核心数据以及tell()方法(将状态的改变通知视图类)publicclassCarModel{privateString[]carNameList;privateURLimgURL;privateURLcarFileUrl;privateImageIconimgIcon;privateStringcarSelected;privateStringbitPrice;staticfinalStringCARFILES="CarFiles/";staticfinalStringCARIMAGES="CarImages/";

……

publicvoidtell(Viewview){ view.update();}}//Endofclass视图类视图类CararGUIView和CarBitView为图形界面类,在update()方法中自动调用CarModel类的有关信息,并显示在图形界面上。publicinterfaceView{publicabstractvoidupdate();}publicclassCarGUIViewextendsJFrameimplementsView{privateJEditorPaneeditorPane;privateJLabelimgLabel;privateCarModelmodel;

publicvoidupdate(){try{ URLurl=model.getCarFileURL();editorPane.setPage(url);System.out.println("Wehavebeencalled.");}catch(IOExceptione){ e.printStackTrace();

}ImageIconimIcon=model.getImageIcon();imgLabel.setIcon(imIcon);imgLabel.validate();}}publicclassCarBitViewextendsJFrameimplementsView{privateJTextAreabitText;privateCarModelmodel;……

publicvoidupdate(){System.out.println("Carbithasbeencalled.");StringsCar=model.getSelectedCar();Stringpr=model.getBitPrice();bitText.append("\nBitpricefor"+sCar+"="+pr);}}//endofclass控制器控制器Controller负责根据CarAuctionGUI对象输入的客户选择信息更新CarModel的数据。importjava.awt.event.*;importjavax.swing.*;import.URL;classControllerimplementsActionListener{privateCarAuctionGUIobjCarGui;privateCarModelcm;privateCarGUIViewciv;privateCarBitViewcb;privateStringcarPrice;privateString[]carList;publicvoidactionPerformed(ActionEvente){StringsearchResult=null;if(e.getActionCommand().equals(CarAuctionGUI.EXIT)){System.exit(1);}

if(e.getActionCommand().equals(CarAuctionGUI.SEARCH)){StringselectedCar=objCarGui.getSelectedCar();cm.setSelectedCar(selectedCar);cm.setCarFileURL();cm.setupImageIcon();

cm.tell(civ); //civ.update();}

if(e.getActionCommand().equals(CarAuctionGUI.BIT)){ carPrice=objCarGui.getBitPrice(); cm.setBitPrice(carPrice);

cm.tell(cb); //cb.update();}}}//EndofclassController主界面publicclassCarAuctionGUIextendsJPanel{privatestaticCarModelcm;privatestaticCarGUIViewciv;privatestaticCarBitViewcb;publicstaticfinalStringSEARCH="Search";publicstaticfinalStringBIT="Bit";publicstaticfinalStringEXIT="Exit";

publicCarAuctionGUI(){super(newGridLayout(1,0));setUpGUI();}privatevoidsetUpGUI(){……

JButtonsrchButton=newJButton(SEARCH);srchButton.setMnemonic(KeyEvent.VK_S);JButtonexitButton=newJButton(EXIT);exitButton.setMnemonic(KeyEvent.VK_X);JButtonbitButton=newJButton(BIT);bitButton.setMnemonic(KeyEvent.VK_X);……ControllerobjButtonHandler=newController(this,cm,civ,cb);srchButton.addActionListener(objButtonHandler);exitButton.addActionListener(objButtonHandler);bitButton.addActionListener(objButtonHandler);……

}privatestaticvoidcreateAndShowGUI(){……CarAuctionGUInewContentPane=newCarAuctionGUI();……}staticpublicvoidmain(Stringargv[]){……cm=newCarModel(); civ=newCarGUIView(cm); cb=newCarBitView(cm);createAndShowGUI();……}}组件模型类CarModel视图类CararGUIView和CarBitView控制器类Controller连接件(1)控制器类controller中的actionPerformed()方法创建模型类CarModel的对象,调用该类中的tell()方法。(2)模型类CarModel中的tell方法参数是View接口的对象,根据传入的具体子类对象,调用视图类CararGUIView或者CarBitView中的的update()方法,update()方法调用CarModel类的相关信息,并显示在图形界面上。控制器类controller调用模型类CarModel中的tell方法时,cm.tell(civ)或者cm.tell(cb)方法的参数是CararGUIView类或者CarBitView类的对象。控制器controller根据实际情况进行视图选择,显示相应的视图。其实,控制器类controller中可以直接调用视图类civ.update()或者cb.update(),显示数据信息,而不用通过tell()方法。JavaEEWEBModel1:Non-MVCJavaEEWEBModel2:MVC2.采用MVC软件体系结构的网站登录功能(1)web.xml的内容<?xmlversion="1.0"encoding="UTF-8"?><web-appversion="2.5"xmlns=/xml/ns/javaeexmlns:xsi=/2001/XMLSchema-instancexsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_2_5.xsd"><servlet><description>配置用户登录的servlet</description><display-name>loginservlet</display-name><servlet-name>loginservlet</servlet-name><servlet-class>servlet.loginservlet</servlet-class></servlet><servlet-mapping><servlet-name>loginservlet</servlet-name><url-pattern>/loginservlet</url-pattern></servlet-mapping></web-app>(2)初始用户信息录入界面<%@pagecontentType="text/html"pageEncoding="UTF-8"%><html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"><title>LoginPage</title></head><body><formmethod="post"action="loginservlet">

用户姓名:<inputtype="text"name="name"><br>

用户密码:<inputtype="password"name="pwd"><br><inputtype="submit"name="submit"value="确定"></form></body></html>(3)以teacher身份登录成功后显示的页面teacher.jsp<%@pagecontentType="text/html"pageEncoding="UTF-8"%><html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"><title>TeacherPage</title></head><body><h1>教师页面!</h1></body></html>(4)以student身份登录成功后显示的页面student.jsp<%@pagecontentType="text/html"pageEncoding="UTF-8"%><html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"><title>StudentPage</title></head><body><h1>学生页面!</h1></body></html>(5)出错界面error.jsp<%@pagecontentType="text/html"pageEncoding="UTF-8"%><html><body><h1>输入有误!</h1></body></html>(6)控制器loginservletpackageservlet;importbean.*;importjavax.servlet.*;importjavax.servlet.http.*;importjava.io.*;publicclassloginservletextendsHttpServlet{publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Stringusername=request.getParameter("name");Stringpassword=request.getParameter("pwd");

userbeanuser=newuserbean();user.setUsername(username);

user.setPwd(password);if(user.login()){request.setAttribute("user",user);if(user.username.equals(user.user1)&&user.pwd.equals(user.password1))getServletConfig().getServletContext().getRequestDispatcher("/teacher.jsp").forward(request,response);if(user.username.equals(user.user2)&&user.pwd.equals(user.password2))getServletConfig().getServletContext().getRequestDispatcher("/student.jsp").forward(request,response);}else{getServletConfig().getServletContext().getRequestDispatcher("/error.jsp").forward(request,response);}}publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doPost(request,response);}}(7)JavaBean模型userbeanpackagebean;publicclassuserbean{publicStringuser1="teacher";publicStringpassword1="teacher";publicStringuser2="student";publicStringpassword2="student";publicStringusername="";publicStringpwd="";publicvoidsetUsername(Stringusername){this.username=username;}publicStringgetUsername(){returnthis.username;}publicvoidsetPwd(Stringpassword){this.pwd=password;}

publicStringgetPwd(){ returnthis.pwd;}publicbooleanlogin(){ booleantemp=false; if(username.equals(user1)&&pwd.equals(password1)){ temp=true;}elseif(username.equals(u

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论