ImageVerifierCode 换一换
格式:DOCX , 页数:87 ,大小:688.02KB ,
资源ID:8498103      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8498103.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第7章 Struts 与MVC 设计模式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第7章 Struts 与MVC 设计模式.docx

1、第7章 Struts 与MVC 设计模式第7章 Struts 与MVC 设计模式7.1. Struts 与Java Web 应用Java Web 应用的核心技术是Java Server Page 和Servlet 。此外,开发一个完成的Java Web 应用还设计以下概念和技术: JavaBean 组件 EJB 组件 自定义JSP 标签 XML Web 服务器和应用服务器图 7-1:Java Web 应用的结构7.1.1. Web 组件的三种关联Web 应用程序如此强大的原因之一是他们能彼此链接和聚合信息资源。Web 组件之间存在三种关联关系: 请求转发 URL 重定向 包含存在以上关联关系的

2、Web 组件可以是JSP 或Servlet,对于Struts 应用,则还包含Action 。这些Web 组件都可以访问HttpServletRequest 和HttpServletResponse 对象,具有处理请求、生成响应结果的功能。7.1.1.1. 请求转发请求转发允许把请求转发给同一应用程序中的其他Web 组件。这种技术通常用于Web 应用控制层的Servlet 流程控制器,它检查Http 请求数据,并讲请求转发到合适的目标组件,目标组件执行具体请求处理操作,并生成响应结果。下图显示了一个Servlet 把请求转发给另一个JSP 组件的过程。图 7-2 :请求转发Sevlet 类使用j

3、avax.servlet.RequestDispatcher.forward() 方法来转发它所收到的HTTP 请求。转发目标组件将处理该请求并生成响应结果,或者将请求继续转发到另一个组件。最初请求的ServletRequest 和ServletResponse 对象被传递给转发目标组件,这使得目标组件可以访问整个请求上下文。值得注意的是,只能把请求转发给同一Web 应用中的组件,而不能转发给其他Web 应用组件。如果当前的Servlet 组件要把请求转发给一个JSP 组件,如hello.jsp ,可以在Servlet 的service() 方法中执行以下代码:RequestDistpathe

4、r rd = request.getRequestDispather(“hello.jsp”); /Forward to requested URL rd.forward(request.response); 在JSP 页面中,可以使用 转发请求,例如: 对于请求转发,转发的资源组件和目标组件共享request 范围内的共享数据。7.1.1.2. 请求重定向请求重定向类似请求转发,但也有一些重要区别: Web 组件可以将请求重定向到任一URL ,而不仅仅是统一应用中的URL 。 重定向的资源组件和目标组件之间不共用一个HttpServletRequest 对象,因此不能 共享request 范

5、围内的共享数据。下图显示了一个Serlet 把请求重定向给另一个JSP 组件的过程。图 7-3 :请求重定向如果当前应用的Servlet 组件要把请求转发给URL“http:/jakarta.apache.org/struts”,可以在Servlet 的service() 方法中执行以下代码:response.sendRedirect(“http:/jakarta.apache.org/struts”); 从上图中可以看出,HttpServletResponse 的sendRedirect() 方法向浏览器返回包含重定向信息,浏览器根据这一信息发送出一个新的HTTP 请求,请求访问重定向目标组

6、件。7.1.1.3. 包含包含关系允许一个Web 组件聚集来自同一个应用中其他Web 组件的输出数据,并使用被聚集的数据来创建响应效果。这种技术通常用于模板处理器,它可以控制网页的布局。模板中每个页面区域的内容来自不同的URL,conger 组成单个页面。这种技术能够为应用程序提供一致的外观和感觉。包含关系的源组件和目标组件共用同一个HttpServletRequest 对象,因此他们共享request 范围内的共享数据。下图显示了一个Servlet 包含另一个JSP 组件的过程。图 7-4:Web 组件的包含关系Servlet 类使用javax.servlet.RequestDispathe

7、r.include() 方法包含其他Web 组件。例如,如果当前的Servlet 组件包含了3 个JSP 文件:header.jsp 、main.jsp 和footer.jsp,则可以在Servlet 的service() 方法中执行以下代码: RequestDispatcher rd;rd = req.getRequestDispatcher(“/header.jsp”);rd.include(req,res); rd = req.getRequestDispatcher(“/main.jsp”);rd.include(req,res); rd = req.getRequestDispatc

8、her(“/footer.jsp”);rd.include(req,res); 在JSP 文件中,可以通过 指令来包含其他Web 资源,例如: 7.1.2. MVC 概述模型-视图-控制器(MVC )是80 年代Smalltalk-80 出现的一种软件设计模式,现在已经被广泛的使用。开发模式上采用Model-View-Controller(MVC )模式,MVC 模式将程序代码整理切割为三部份,Model 部分是业务与应用领域( Business domain ) 相关逻辑、管理状态之对象,Controller 部分接收来自 View 所输入的资料并与Model 部分互动,是业务流程控制( F

9、low Control ) 之处,View 部分则负责展现资料、接收使用者输入资料。 模型(Model)模型是应用程序的主体部分。模型表示业务数据,或者业务逻辑. 视图(View )视图是应用程序中用户界面相关的部分,是用户看到并与之交互的界面。 控制器(controller) 控制器工作就是根据用户的输入, 控制用户界面数据显示和更新model 对象状态。图 7-5:MVC 设计模式7.1.2.1. MVC 的优点可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。视图与控制器的可接插性,允许更换视

10、图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。7.1.2.2. MVC 的不足之处增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然

11、,这样就妨碍了他们的独立重用。视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。目前,一般高级的界面工具或构造器不支持MVC 模式。改造这些工具以适应MVC 需要和建立分离的部件的代价是很高的,从而造成使用MVC 的困难。7.1.2.3. MVC 的应用范围使用MVC 需要精心的计划,由于它内部原理比较复杂,所以需要花费一些时间去理解它。将MVC 运用到应用程序中会带来额外的工作量,增加应用的复杂性,所以MVC 部适合小型应用程序。但是对于开发存在大量用户界面上,并且业务逻辑复杂的大型应用程序,MV

12、C 将会使软件在健壮性、代码重用喝结构方面上一个新台阶。尽管在最初构建MVC 框架时会花费一定工作量,但从长远的角度来看,它会大大提供后期软件开发效率。7.1.3. JSP Model1 和JSP Model2 SUN 在JSP 出现早期制定了两种规范,称为Model1 和Model2 。图 7-6:JSP Model 1 Model 1 它是以页面为中心的。适用于完成简单的应用程序。实现这个模式的应用程序有一系列的Jsp 页面,在这些页面里用户程序运行从一个页面到另一个页面。因为它的简单容易。Model 1 应用的主要问题是难以维护,并且毫无灵活性可言。另外,由于开发人员已经同时被卷入到了页

13、面开发和商业逻辑的编码中,这个架构模式在页面设计人员和web 开发人员之间很难实现劳动分工。图 7-7:JSP Model 2 JSP Model1 和JSP Model2 的本质区别在于处理用户请求的位置不同。在Model1 体系中,JSP 页面负责响应用户请求并将处理结果返回用户。JSP 既要负责具体业务流程控制,又要负责提供表示层数据,同时充当视图和控制器,未能实现这两个模块之间的独立和分离。尽管Model1 体系十分适合简单应用的需要,它却不适合开发复杂的大型应用程序。不加选择的使用Model1,会导致JSP 页内嵌入大量Java 代码。尽管这对Java 程序员不是多大的问题,但如果J

14、SP 页面由网页设计人员开发并进行维护的(大量的实际项目中情况确实是这样的),这个问题就会变得十分突出。从根本上讲,将导致角色定义不清和职责分配不明,会给项目管理带来很大的麻烦。JSP Model2 体系结构是一种联合使用JSP 和Servlet 来提供动态内容服务的方法。它吸取了JSP 和Servlet 两种技术各自的突出优点,用JSP 生成表示层的内容,让Servlet 完成深层次的处理任务。在这里,Servlet 充当控制器的角色,负责处理用户请求,创建JSP 页需要使用的JavaBean 对象,根据用户请求选择使用的JSP 页返回给用户。在JSP 页内没有处理逻辑,它仅负责检索原先由S

15、ervlet 创建的JavaBean 对象,从Servlet 中提取动态内容插入静态模板。这是一种有突破性的软件设计方法,它清晰地分离了表达和内容,明确角色定义以及开发者与网页设计者的分工。事实上,项目越复杂,使用Model2 的好处越大,越容易体现。7.1.4. Struts 概述Struts 实质上就是在JSP Model2 的基础上实现一个MVC 框架。在Struts 框架中,模型由实现业务逻辑的JavaBean 或EJB 组件构成,控制器由ActionServlet 和Action 来实现,视图由一组JSP 文件构成。图 7-8:Struts 实现的MVC 框架7.1.4.1. Mod

16、el Struts 没有定义具体的Model 层的实现,Model 层通常是和业务逻辑紧密相关的,还通常有持续化的要求,Struts 目前没有考虑到这一层,但是,不管在开源世界还是商业领域,都有一些都别优秀的工具可以为Model 层次的开发提供便利,例如优秀的O/R Mapping 开源框架Hibernate 。7.1.4.2. View 通常,Web 应用的UI 由以下文件组成: HTML JSP 而JSP 中通常包含以下组件: 自定义标签 DTO(Data Transfer Object 数据传输对象) 在Struts 中,还包含了以下两种常用的组件: Struts ActionForms

17、 资源绑定(java resource bundle s),例如将标签的显示内容,错误提示的内容通过配置文件来配置,这样可以为实现国际化提供基础。 由此可见,Struts 对于传统的Web UI 所作的扩充就是Struts ActionForms 和资源绑定,接下来对其进行进一步描述。 7.1.4.3. Controller J2EE 的前端控制器(Front Controller)设计模式中利用一个前端控制器来接受所有客户请求,为应用提供一个中心控制点,在该控制点上,可以很方便地添加一些全局性的,如加密、国际化、日志等通用操作。Controller的实现机制正是建立在前端控制器的设计模式基础

18、上。 前面我们介绍过,Struts 的控制器拥有一些职责,其中最主要的是以下几个: 1. 1. 接收客户请求。 2. 2. 映射请求到指定的业务操作。 3. 3. 获取业务操作的结果并以有效的方式提供给客户。4. 4. 根据业务操作的结果和当前的状态把不同的UI 推向给客户。 在Struts 框架中,控制器中不同的组件负责不同的控制职责,下图是Struts 框架中关于控制器部分的一个组件图: 图 7-9 :控制器组件在上图中,很明显地可以看出,ActionServlet 处于核心位置,那么,我们就先来了解一下ActionServlet。 org.apache.struts.action.Act

19、ionServlet 在Struts 应用程序中扮演接收器的角色,所有客户端的请求在被其它类处理之前都得通过ActionServlet 的控制。 当 ActionServlet 的实例接收到一个HTTP 请求,不管是通过get 方法或post 方法,ActionServlet 的process( )方法被调用并用以处理客户请求。process( )方法实现显示如下: protected void process(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletExceptio

20、n RequestUtils.selectApplication( request, getServletContext( ) ); getApplicationConfig( request ).getProcessor( ).process( request, response ); 该方法的实现很简单, RequestUtils.selectApplication( request, getServletContext( ) );语句是用来根据用户访问的上下文路径来选择处理的应用,如果你只有一个Struts 配置文件,就表示你只有一个Struts 应用。getApplicationCon

21、fig( request ).getProcessor( ).process( request, response ); 语句用来获取一个处理器,并将客户请求提交给处理器处理。 7.1.4.4. Struts 初始化处理流程根据在web.xml 中配置的初始化参数,Servlet 容器将决定在在容器的第一次启动,或第一次客户请求ActionServlet 的时机加载ActionServlet ,不管哪种方式加载,和其它Servlet 一样,ActionServlet 的init( )方法将被调用,开始初始化过程。让我们来看看在初始化过程中将发生些什么,理解了这些,对于我们debug 和扩展自己

22、的应用更加得心应手。 5. 1. 初始化框架的内部消息绑定,这些消息用来输出提示,警告,和错误信息到日志文件中。org.apache.struts.action.ActionResources 用来获取内部消息; 6. 2. 加载web.xml 中定义的不同参数,用以控制ActionServlet 的不同行为,这些参数包括config, debug, detail, and convertNull ; 7. 3. 加载并初始化web.xml 中定义的servlet 名称和servlet 映射信息。通过初始化,框架的各种DTD 被注册,DTD 用来在下一步校验配置文件的有效性; 8. 4. 为默

23、认应用加载并初始化Struts 配置文件,配置文件即初始化参数config 指定的文件。默认配置文件被解析,产生一个ApplicationConfig 对象存于ServletContext 中。可以通过关键字org.apache.struts.action.APPLICATION 从ServletContext中获取ApplicationConfig; 9. 5. Struts 配置文件中指定的每一个消息资源都被加载,初始化,并存在ServletContext的合适区域(基于每个message-resources 元素的key 属性),如果key 属性没有设置,则为org.apache.str

24、uts.action.MESSAGE; 10. 6. Struts 配置文件中声明的每一个数据源被加载并且初始化,如果没有配置数据源,这一步跳过; 11. 7. 加载并初始化Struts 配置文件中指定的插件。每一个插件的init()方法被调用; 当默认应用加载完成,init()方法判断是否有应用模块需要加载,如果有,重复步骤47 步成应用模块的加载。7.1.4.5. Struts 工作流程图 7-10:Struts 工作流程上图是Struts 的工作流程,前边我们提到,所有的请求都提交给ActionServlet 来处理。 ActionServlet 是一个FrontController,它

25、是一个标准的Servlet,它将request 转发给RequestProcessor 来处理。ActionMapping 是ActionConfig 的子类,实质上是对struts-config.xml 的一个映射,从中可以取得所有的配置信息。 RequestProcessor 根据提交过来的url,如*.do,从ActionMapping 中得到相应的ActionForn 和Action。然后将request 的参数对应到ActionForm 中,进行form 验证。如果验证通过则调用Action 的execute()方法来执行Action,最终返回ActionFoward。 Action

26、Foward 是对mapping 中一个foward 的包装,对应于一个url。 ActionForm 使用了ViewHelper 模式,是对HTML 中form的一个封装。其中包含有validate 方法,用于验证form 数据的有效性。ActionForm 是一个符合JavaBean 规范的类,所有的属性都应满足get 和set 对应。对于一些复杂的系统,还可以采用DynaActionForm(Struts1.1)来构造动态的Form,即通过预制参数来生成Form。这样可以更灵活的扩展程序。 ActionErrors 是对错误信息的包装,一旦在执行action 或者form.validat

27、e 中出现异常,即可产生一个ActionError 并最终加入到ActionErrors。在Form 验证的过程中,如果有Error 发生,则会将页面重新导向至输入页,并提示错误。Action 是用于执行业务逻辑的RequsestHandler。每个Action 都只建立一个instance。Action 不是线程安全的,所以不应该在Action中访问特定资源。一般来说,应改使用Business Delegate 模式来对Business tier 进行访问以解除耦合。 Struts 提供了多种Action 供选择使用。普通的Action 只能通过调用execute 执行一项任务,而Dispa

28、tchAction 可以根据配置参数执行,而不是仅进入execute()函数,这样可以执行多种任务。如insert,update 等。LookupDispatchAction 可以根据提交表单按钮的名称来执行函数。 当ActionServlet 接收到一个客户请求时,将执行如下流程: 图 7-11:Struts 响应用户请求的工作流程1) 检索和用户请求匹配的ActionMapping 实例,如果不存在, 就放回用户请求路径无效的信息。 2) 如果ActionForm 实例不存在,就创建一个ActionForm 对象, 把客户提交的表单数据保存到ActionForm 对象中。 3) 根据配置信

29、息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate() 方法。 4) 如果ActionForm 的validate() 方法返回null 或者一个不包含ActionMessage 的ActionErrors 对象,就表示表单验证成功。验证不成功则发送给用户提交表单的JSP 组件,或者转向其他组件。这样Action 对象不会被创建。 5) ActionServlet 根据ActionMapping 实例包含的映射信息决定将请求转发给哪个Action 。如果相应的Action 实例不存在,就先创建这个实例, 然后调用Action 的execute() 方法。6) A

30、ction 的execute() 方法返回一个ActionForward 对象,ActionServlet 再把客户请求转发给ActionForward 对象只想JSP 组件。 7) ActionForward 对象指向JSP 组件生成动态网页,返回给客户。7.2.从helloapp 开始Struts 应用7.2.1.helloapp 的需求helloapp 的需要非常简单,主要是体验Struts 开发过程,其内容如下: 接收用户输入姓名 ,然后返回字符串“Hello !”。 如果用户没有输入姓名就提交表单,将返回错误信息,提示用户首先输入姓名。 如果用户输入姓名为“Monster”, 将返回

31、出错信息, 拒绝向“Monster”say hel lo。 为了演示模型组件的功能,本应用使用模型组件来保护用户输入的姓名。 7.2.2. 组建Struts 框架Helloapp 应用的各个模块组成: JavaBean 组件:PersonBean,有一个userName 属性,代表用户输入的名字。提供了get/set 方法。这里可以预留save()方法,将数据保存到数据库中(JavaBean 组件可以作为EJB 或者Web 服务前端组件)。 视图:hello.jsp,提供用户界面,接收用户输入的姓名。视图还包括一个ActionFormBean,它用来存放表单数据,并进行表单验证。 控制器:Action 类HelloAction,主要任务有,一、进行业务逻辑验证,如果用户输入姓名为“Monster”,将返回错误消息;二、调用模型组件PersonBean 的save()方法,保存用户输入的名字;三、决定将合适的视图组件返回给用户。 除了以上的模块,我们还要创建Struts

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1