- 浏览: 118630 次
- 性别:
- 来自: 成都
文章分类
MVC设计模式概述
MVC是Model—View—Controler的简称。即模型—视图—控制器。最近几年被业界推荐为SUN公司的J2EE平台的设计模式。受到越来越多的WEB开发者的欢迎。MVC是一种设计模式,它强制性的把应用程序的输入、处理和输出分开。MVC中的模型、视图、控制器它们分别担负着不同的任务。
视图:视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。
模型:模型表示业务数据和业务处理。相当于JavaBean。一个模型能为多个视图提供数据。这提高了应用程序的重用性
控制器:当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求。然后根据处理的结果调用相应的视图来显示处理的结果。
MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。可进行以下类比:凶杀案发生了(用户点击提交按钮)视图--->公安部门进行刑事侦察,找出主凶(控制器)---->交给法院案件审理判刑(模型)---->对主凶执行伏法(视图)。
MVC的优点
1:MVC设计模式强制性的把用户的输入、业务逻辑的处理、数据结果的显示分开。提高了Web应用程序的可维护性。比如:改动模型的业务逻辑代码不会影响到视图和控制器。由于MVC三个模块相当于独立,改变 任何一个不会影响其它两个从而实现的程序的松耦合。
2:由于多个视图可以共享同一个模型,所以大大提高了Web应用程序的重用性。
3:MVC设计模式可以与xml配置文件有机的结合在一起。在改变三个模块间的工作方式,不需要修改源代码,直接修改配置文件就行了。从而提高了Web应用程序的灵活性。
struts的体系结构
1:用来实现mvc设计模式的框架有很多,比如:webwork,struts等。struts是在j2ee中用来实现mvc模式的主流 框架。后来webwork与struts合并成为struts2.0版本。也即是最高版本。struts的体系结构的实现如图:
ActionServlet是一个FrontController,是struts的核心控制器。它是一个标准的Servlet,继承自HttpServlet类,该控制器负责拦截所有Http请求,然后把拦截的用户请求根据用户需要,它将request转发给 RequestProcessor来处理, ActionMapping是ActionConfig的子类,实质上是对struts-config.xml的一个映射,从中可以取得所有的配置信息 ,转发给相应的Action类进行处理。
RequestProcessor根据提交过来的url,如*.do,从ActionMapping 中得到相应的ActionForn和Action。然后将request的参数对应到ActionForm中,进行form验证。如果验证通过则调用 Action的execute()方法来执行Action,最终返回ActionFoward。
ActionFoward是对mapping中一个foward的包装,对应于一个url 。
ActionForm使用了ViewHelper模式,是对HTML中form的一个封装。其中包含有validate方法,用于验证form数据的有 效性。ActionForm是一个符合JavaBean规范的类,所有的属性都应满足get和set对应。对于一些复杂的系统,还可以采用 DynaActionForm来构造动态的Form,即通过预制参数来生成Form。这样可以更灵活的扩展程序。
ActionErrors是对错误信息的包装,一旦在执行action或者form.validate中出现异常,即可产生一个ActionError并 最终加入到ActionErrors。在Form验证的过程中,如果有Error发生,则会将页面重新导向至输入页,并提示错误。
Action是用于执行业务逻辑的RequsestHandler。这个类通常由用户来提供,该控制器负责接收来自于ActionServlet的请求,并根据该请求调模式的业务逻辑方法处理请求,并将处理的结果返回给jsp页面显示。每个Action都只建立一个instance。Action不是线程安全的,所以 不应该在Action中访问特定资源。一般来说,应改使用 Business Delegate 模式来对Business tier进行访问以解除耦合。
Struts提供了多种Action供选择使用。普通的Action只能通过调用execute执行一项任务,而DispatchAction可以根据配置参数执行,而不是仅进入execute()函数,这样可以执行多种任务。如insert, update等。LookupDispatchAction可以根据提交表单按钮的名称来执行函数。
struts组件的MVC实现
View部分:由jsp页面实现,并且struts提供了丰富的标签库,通过使用struts标签库可以快速实现view部分,当然也可以不用struts标签库,而用普通的jsp页面
Controler:有两个控制器。
A:核心控制器(ActionSerlvet,只有一个,由struts自动创建)
B:业务逻辑控制器(Action,有多个,由用户自己创建)。业务逻辑控制器负责处理用户请求,它本身不具备处理能力,而是调用Model来完成处理。
Model部分:由ActionForm和JavaBean组成。其中ActionFrom用于封装用户在jsp页面中所填写的数据。所有的用户填写的数据由系统自动封装成ActionFrom对像。该对像被ActionServlet转发给ction。Action根据从ActionFrom中取得用户所填写的数据,交给JavaBean进行处理。ActionFrom实际上也是一个普通的JavaBean。它对应于jsp页面中各个输入数据项 。
struts工作流程
1.客户端填写完jsp页面的数据之后单击提交按钮向服务器发出http请求,客户端所有的请求都被 ActionSerlvet拦截。
2.ActionServlet根据用户的请求在struts-conifg.xml配置文件中查找与之对应的Action,同时把用户的数据填 充给对应的ActionForm,然后把ActionForm一起分发给Action进行处理。
3.Action会自动调用excute方法,在该方法里面Action将从ActionForm里面获取用户填写的数据,并调用模型(javaBean)进行相应的处理,然后把处理的结果显示在其它的视图(jsp页面)
struts-config.xml:struts的配置文件.
上面讲到每一个用户的请求是通过ActionSerlvet来处理和转发的那么ActionSerlvet如何决定把用户请求转发给那一个Action呢?这就需要一个配置文件来保存一个struts中所有的Action。而struts-config.xml这个配置文件就是用来实现以上配置的 。
配置ActionSerlvet拦截用户请求
1:ActionSerlvet是核心控制器,是由struts框架自动产生的,它像过滤器一样会拦截所有用户的请求。但是这个过滤器必须要在web.xml文件中进行配置才能够发挥它的作用。幸运的是这些配置struts已经帮我们自动配置好,但是有必要进行了解.
<servlet-name>action</servlet-name> --ActionServlet的名字对应实例对应的类
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
........
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern> --定义ActionServlet过滤的通配符。必须要以do结尾。当然可以修改
</servlet-mapping>
配置ActionForm接受用户输入的数据
1)ActionForm实际上就是一个非常简单的javaBean。在它里面有许多的get,set方法,它的目的就是为了封装 从用户输入的数据。因此ActionForm通常与表单页面对应,每个表单对应一个ActionForm。表单中的输入项对应ActionForm的一个属性.
2)Struts要求ActionForm必须要继承自org.apache.struts.action.ActionForm基类。
3)必须保证ActionForm中的属性名一定要与表单中元素名一致
4)所有的ActionForm必须要在Struts-config.xml中进行配置。配置节如下:
<form-beans>
<form-bean name="loginActionForm" type="org.chen.struts.loginForm" />
<form-bean name="shopActionForm" type="org.chen.struts.loginForm" />
........
<form-bean name="shopActionForm" type="org.chen.struts.loginForm" />
</form-beans>
5)一个ActionForm必须至少指定两项。
name:该项用于标识ActionForm的Id,以便于传递给Action进行使用
type:ActionForm的实现类
6)在eclipse中添加一个ActionForm的步骤如下:
A:右击--->new--->other--->myeclipse--->webstruts-->struts1.1 form
B:在弹出的对话框中
name中输入ActionForm的标识id
superclass指定ActionForm的父类名。一般选择org.apache.struts.action.ActionForm
formtype指定ActionForm的类名,因为它是一个javaBean。相当于为类取一个名字
formProperty选项卡中输入ActionForm的属性。
Action的创建与配置
1)Action是系统的业务控制器,它用于接收从ActionServlet转发过来的请求,并触发execute方法,我们可以 在execute方法里面调用模型进行数据处理
2)struts要求Action必须继承自org.apache.struts.action.Action基类
3)所有的Action必须要在struts-config.xml中进行配置。配置节如下:
<action name="loginActionForm"
path="/loginAction" scope="request"
type="org.chen.struts.loginAction">
<forward name="scuess" path="/scuess.jsp" />
<forward name="error" path="/error.jsp" />
</action>
说明:
A)name:并不是Action本身的名字,而是与之关联的ActionForm的名称
B)path:非常重要的属性。ActionSerlvet将用户的请求转发与之同名的Action.同名的意思是将请求 的".do"后缀去掉。匹配Action的path属性值
C)struts-config.xml中只要遇到path属性都要加"/"表示相当于WebRoot根目录而言
D)type:Action的类名
E)forward:将Action的转发映射到实际的jsp页面,在实际编程时应该用逻辑名进行转发
F)一个Action可以有ActionForm,也可以没有ActionForm。如果是post提交的一般会有ActionForm。比如:<form id="frm1" action="loginAction.do">,如果是通过get提交则不会有ActionForm,但是Action总是会有的,因为要处理业务逻辑。比如:<a href="shopAddAction.do">
G)关于超链接与Action路径的问题(******************)
[1]对于表单中的Action而言,不存在路径问题,只要Action在classes下都可以定位比如: 1.jsp页面在WebRoot下面,但Action在ht.netBook.Action下面。在表单中提交时
<html:form action="insertTalkAction.do">可以直接指定Action名就可以了。或者2.jsp页面在WebRoot下面的page下面,都可以正确定位。
[2]但对于超链接而言,则不一样。如果 超链接所在的页面1.jsp在WebRoot下面,
则可以<a href="insertTalkAction.do>进入</a>直接指定Action名, 但是如果超链接所在的页面1.jsp在WebRoot下面的page下面的话,则通过"/"表示,项目目录 <a href="/WebRoot/insertTalkAction.do>让struts回到WebRoot下面再去找。
[3]如果是servlet的话,不管是对于表单还是对于超链接,都必须要找到web.xml文
件在它下面有。取出"servlet/loginSer"就行了,注意不是"/servlet/loginSer",即不要加"/"。如果超链接所在的页面就在WebRoot的下面,则可以直接使用<a href="servlet/loginSer"> 如果在超链接所在的页面在WebRoot下面的Page下面,则把则要把路径回退一级<a href="..\servlet\loginSer>让struts回到WebRoot下面再去找
<servlet-mapping>
<servlet-name>loginSer</servlet-name>
<url-pattern>/servlet/loginSer</url-pattern>
</servlet-mapping>
[4]对于forward中的<forward name="error" path="/error.jsp" />中的path而言"/"表示在WebRoot下面去找,但是对于jsp而言"/"表示项目目录。
如果要在WebRoot下面的page文件夹里面的error.jsp则修改成为<forward name="error" path="/page/error.jsp" />
举例:
1)创建一个Action名为loginAction放入ht.OA.Action下面
2)创建一个login.jsp页面放入WebRoot根目录下面
3)创建一个index.jsp与error.jsp放入WebRoot的page文件夹下面
4)创建一个servlet放入ht.OA.servlets下面
5)完成登录页面的struts的测试
Forward的定义转向配置
1)前面说过ActionServlet把请求转发给Action,Action会触发excute方法,在此方法中调用JavaBean进行业务逻辑处理,处理完毕之后,要把处理的结果显示到其它的jsp页面中。而这些经过Action处理之后要进入的jsp页面就是Forward配置节的任务
2)Forward在struts-config.xml中配置格式如下:
<forward name="scuess" path="/scuess.jsp" />
<forward name="error" path="/error.jsp" />
3)每一个Forward相当于一个ActionForward对像,所以struts中的
ActionSerlvet,Action,ActionForwad构成了struts的核心
说明:
A)name:用来指定forward逻辑名,以便在编程中来使用
B)path:实际要转发到的jsp页面。注意要加"/"
Action的excute方法
1)ActionServlet接受到用户的"XXXXX.do"请求,通过struts-config.xml配置文件找到与之匹配的Action配置节,通过Action的name属性找到与之对应的ActionForm然后把用户输入的数据填写到该ActionForm中去,最后把请求连同ActionForm转发给Action,然后触发Action的execute方法。
2) execute方法里面有几个参数:
A)mapping:
1:用来获取与Action对应的forward定义转向。
2:通过mapping.findForward(name)来进行实际页面的转发
B)form:是填充了用户输入数据的ActionForm。在实际编程时,往往需要向子类转换
LoginActionForm loginActionForm=(LoginActionForm)form,得到loginActionForm之后可以通过get方法得到用户填写的数据
C)request:得到用户的请求。事实上要得到用户输入的数据也可以通过request.getParameter方法,但是那样就失去了struts的作用,所以一般都会有ActionForm去得到用户所输入的数据,但是request.getParameter方法却可以得到get方法提交过来的数据,这是非常重要的。
D)response:得到用户的响应
E)execute方法会返回一个ActionForward实例,而mapping.findForward(name)正好可以返回这个实例。
本文主要摘自:
1.《开源web框架-Struts工作流程》http://hi.baidu.com/pursuit_on/blog/item/f8b3ef957ecb534bd0135e6d.html
2.《Struts天下》
http://blog.programfan.com/blog.asp?blogid=3274&columnid=6785
发表评论
-
eclipselink-DDL Schema Generation的四种方式
2016-10-12 00:17 554persistence.xml文件配置: < ... -
Java开发中的23种设计模式
2016-09-28 00:40 528设计模式(Design Patterns) ... -
ManyToOne 双向一对多关系
2016-08-05 01:38 490双向一对多关系,一是关系维护端(owner side),多是 ... -
理解RESTful架构
2016-06-22 00:33 546原文:http://www.ruanyifen ... -
foreach循环
2016-05-31 22:23 445这种有冒号的for循环叫做foreach循环,foreach语 ... -
java几种常用设计模式简单示例
2016-05-19 23:02 486PART A:前言 平常我们都在敲代码,为了要实现一些我们 ... -
iText PdfPCell内容水平垂直居中
2016-01-14 00:13 11812先调用Cell.setUseAscender(true);再调 ... -
深入理解 hash 函数、HashMap
2015-12-15 00:52 607http://www.2cto.com/kf/201409/3 ... -
iText的showTextAligned方法
2015-12-06 16:47 5353java使用itext的showTextAligned方法给 ... -
iText PdfTemplate的使用
2015-12-06 02:32 1354在开发系统时,需要在PDF上写入总页数。于是在网上搜索到 ... -
iText表格 分页
2015-11-30 23:31 5129前言 在上一节中,通过listing 4.16产生的表格拥 ... -
iText生成PDF文档部分页面横置
2015-11-27 02:02 5469整个PDF文档页面设置 Rectangle rect ... -
iText生成PDF格式设置
2015-11-27 00:52 2460import java.io.ByteArrayOutputS ... -
Spring中的IOC和AOP
2015-11-19 00:47 471IOC,依赖倒置的意思,所谓依赖,从程序的角度看,就是比如A要 ... -
【转载】纯Java获得本地MAC地址
2015-07-29 21:18 5671 import java.net.*; 2 3 clas ... -
Java笔试题
2014-05-25 21:53 5261. float型float f=3.4是否正 ... -
单例模式的常见应用场景
2014-05-25 21:30 813单例模式(Singleton)也叫单态模式,是设计模式中最 ... -
深入Java单例模式
2014-05-25 21:29 531在GoF的23种设计模式中,单例模式是比较简单的一种。然而 ... -
java 异常捕捉 ( try catch finally )
2014-05-25 21:15 535前言:java 中的异常处理机制你真的理解了吗?掌握了吗?c ... -
多线程的实现
2014-05-15 02:11 498http://www.cnblogs.com/rollenho ...
相关推荐
Struts框架的工作原理和实现机制后,应用Struts框架开发养老保险管理系统中 的参保人信息管理的子系统。针对占系统很大比例的数据的增、删、查、改操作中 抽象出了一个数据操作通用框架,此框架是使用数据访问对象...
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的...
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的...
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的...
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的...
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的...
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的...
本文将Ajax技术与MVC模式紧密结合,设计了一个新的MVC框架。应用该框架后,客户端请求基本都是Ajax请求。本文首次采用了Container这一概念,并提出了Container树结构信息的表示法,设计了针对该表示法的解析及生成算法。...
Struts2 是一个非常优秀的MVC框架,基于Model2 设计模型 由传统Struts1和WebWork两个经典框架发展而来 Struts2框架=Struts2+XWork Strust2 核心功能 允许POJO(Plain Old Java Objects,简单... 2.MVC模式的轻量级Web应
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的...
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的...
2.1.1 MVC模式的设计思想 2.1.2 MVC模式的处理过程 2.2 Model规范 2.2.1 Model1规范 2.2.2 Model2规范 2.3 使用MVC的优劣 2.3.1 使用MVC模式的好处 2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发...
2.1.1 MVC模式的设计思想 2.1.2 MVC模式的处理过程 2.2 Model规范 2.2.1 Model1规范 2.2.2 Model2规范 2.3 使用MVC的优劣 2.3.1 使用MVC模式的好处 2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发...
Struts——an open-source MVC implementation This article introduces Struts, a Model-View-Controller implementation that uses servlets and JavaServer Pages (JSP) technology. Struts can help you control...
2.1.1 MVC模式的设计思想 2.1.2 MVC模式的处理过程 2.2 Model规范 2.2.1 Model1规范 2.2.2 Model2规范 2.3 使用MVC的优劣 2.3.1 使用MVC模式的好处 2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发...
通过使用Struts框架,该系统实现了MVC(模型-视图-控制器)设计模式,将业务逻辑、数据访问和用户界面分离,使得代码更易于维护和扩展。此外,该系统还提供了良好的错误处理和异常处理机制,确保了系统的稳定性和...
企业级应用开发中比较流行的Struts开源框架就是基于Model 2模式的MVC思 想的典型应用。Struts 可以使开发者使用统一的模式进行系统开发,简化系统 后期的维护工作量,适合于大型系统的开发。 虽然 Struts 解决了...
ThinkPHP是一个开源的PHP框架,早期的思想架构来源于Struts,后来经过不断改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了 Struts的Action和Dao思想和JSP的TagLib...
4.13. struts2.0的mvc模式?与struts1.0的区别? 13 4.14. struts的处理流程。 13 4.15. Struts/webwork 的工作机制,它有哪些标签 18 3 Spring部分 18 4.1. spring工作机制 18 4.2. 使用Spring的好处 19 4.3. spring...
<br/>5、Struts工作原理 MVC即Model-View-Controller的缩写,是一种常用的设计模式。MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。MVC的工作原理,如下图1所示: <br/> ...