Struts1工作原理浅析_第1页
Struts1工作原理浅析_第2页
Struts1工作原理浅析_第3页
Struts1工作原理浅析_第4页
Struts1工作原理浅析_第5页
已阅读5页,还剩10页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

一、引入STRUTSMODEL1结构如图1所示MODE11是一个以JSP文件为中心的模式,在这种模式中JSP页面不仅负责表现逻辑,也负责控制逻辑。专业书籍上称之为逻辑耦合在页面中,这种处理方式,对一些规模很小的项目如一个简单的留言簿,也没什么太大的坏处,实际上,人们开始接触一些对自己来说是新的东西的时候,比如,用JSP访问数据库时,往往喜欢别人能提供一个包含这一切的单个JSP页面,因为这样在一个页面上他就可以把握全局,便于理解。但是,用MODEL1模式开发大型时,程序流向由一些互相能够感知的页面决定,当页面很多时要清楚地把握其流向将是很复杂的事情,当您修改一页时可能会影响相关的很多页面,大有牵一发而动全身的感觉,使得程序的修改与维护变得异常困难;还有一个问题就是程序逻辑开发与页面设计纠缠在一起,既不便于分工合作也不利于代码的重用,这样的程序其健壮性和可伸缩性都不好。MODEL2引入了“控制器“这个概念,控制器一般由SERVLET来担任,客户端的请求不再直接送给一个处理业务逻辑的JSP页面,而是送给这个控制器,再由控制器根据具体的请求调用不同的事务逻辑,并将处理结果返回到合适的页面。因此,这个SERVLET控制器为应用程序提供了一个进行前后端处理的中枢。一方面为输入数据的验证、身份认证、日志及实现国际化编程提供了一个合适的切入点;另一方面也提供了将业务逻辑从JSP文件剥离的可能。业务逻辑从JSP页面分离后,JSP文件蜕变成一个单纯完成显示任务的东西,这就是常说的VIEW。而独立出来的事务逻辑变成人们常说的MODEL,再加上控制器CONTROL本身,就构成了MVC模式。实践证明,MVC模式为大型程序的开发及维护提供了巨大的便利。二、STRUTS工作原理来自客户的所有需要通过框架的请求,统一由ACTIONSERVLET接收(ACTIONSERVLETSTRUTS已经为我们写好了,只要您应用没有什么特别的要求,它基本上都能满足您的要求),根据接收的请求参数和STRUTS配置STRUTSCONFIGXML中ACTIONMAPPING,将请求送给合适的ACTION去处理,解决由谁做的问题,它们共同构成STRUTS的控制器。ACTION则是STRUTS应用中真正干活的组件,它解决的是做什么的问题,它通过调用需要的业务组件(模型)来完成应用的业务,业务组件解决的是如何做的问题,并将执行的结果返回一个代表所需的描绘响应的JSP(或ACTION)的ACTIONFORWARD对象给ACTIONSERVLET以将响应呈现给客户。这里要特别说明一下的是就是ACTION这个类,它不应该包含过多的业务逻辑,而应该只是简单地收集业务方法所需要的数据并传递给业务对象。实际上,它的主要职责是校验前提条件或者声明调用需要的业务逻辑方法检测或处理其他错误路由控制到相关视图三、STRUTS运行机制STRUTS的工作流程在WEB应用启动时就会加载,初始化ACTIONSERVLET,ACTIONSERVLET从STRUTSCONFIGXML文件中读取配置信息,把它们存放到各种配置对象中,当ACTIONSERVLET接收到一个客户请求时,将执行如下流程1检索和用户请求匹配的ACTIONMAPPING实例,如果不存在就返回请求路径无效信息2如果ACTIONFORM实例不存在,就创建一个ACTIONFORM对象,把客户提交的表单数据保存到ACTIONFORM对象中3根据配置信息决定是否需要表单验证如果需要验证,就调用ACTIONFORM的VALIDATE方法4如果ACTIONFORM的VALIDATE方法返回NULL或返回一个不包含ACTIONMESSAGE的ACTUIBERRORS对象,就表示表单验证成功5ACTIONSERVLET根据ACTIONMAPPING所包含的映射信息决定将请求转发给哪个ACTION,如果相应的ACTION实例不存在,就先创建这个实例,然后调用ACTION的EXECUTE方法6ACTION的EXECUTE方法返回一个ACTIONFORWARD对象,ACTIONSERVLET在把客户请求转发给ACTIONFORWARD对象指向的JSP组件7ACTIONFORWARD对象指向JSP组件生成动态网页,返回给客户四、STRUTS1的安装与基本配置我们主要针对STRUTS11版本进行讲解,这里假定读者已经配置好JAVA运行环境和相应的WEB容器,本文例子所使用的是J2SDK和TOMCAT4127。下面,将采用类似于STEPBYSTEP的方式介绍其基础部分。安装STRUTS到HTTP/JAKARTAAPACHEORG/下载STRUTS的安装文件,本文例子使用的是11版。接下来您要进行如下几个步骤来完成安装1、解压下载的安装文件到您的本地硬盘2、生成一个新的WEB应用,假设我们生成的应用程序的根目录在/WEBAPPS/MYSTRUTS目录。在SERVERXML文件中为该应用新建一个别名如/MYSTRUTS3、从第1步解压的文件中拷贝下列JAR文件到/WEBAPPS/MYSTRUTS/WEBINF/LIB目录,主要文件有如下一些。STRUTSJARCOMMONSBEANUTILSJARCOMMONSCOLLECTIONSJARCOMMONSDBCPJARCOMMONSDIGESTERJARCOMMONSLOGGINGJARCOMMONSPOOLJARCOMMONSSERVICESJARCOMMONSVALIDATORJAR4、创建一个WEBXML文件,这是一个基于SERVLET的WEB应用程序都需要的部署描述文件,一个STRUTSWEB应用,在本质上也是一个基于SERVLET的WEB应用,它也不能例外。STRUTS有两个组件要在该文件中进行配置,它们是ACTIONSERVLET和标签库。下面是一个配置清单ACTIONORGAPACHESTRUTSACTIONACTIONSERVLETCONFIG/WEBINF/STRUTSCONFIGXMLDEBUG22ACTIONDO/WEBINF/STRUTSBEANTLD/WEBINF/STRUTSBEANTLD/WEBINF/STRUTSHTMLTLD/WEBINF/STRUTSHTMLTLD/WEBINF/STRUTSLOGICTLD/WEBINF/STRUTSLOGICTLD上面我们在WEBXML中完成了对SERVLET和标签库的基本配置,而更多的框架组件要在STRUTSCONFIGXML中进行配置5、创建一个基本的STRUTSCONFIGXML文件,并把它放在/WEBAPPS/MYSTRUTS/WEBINF/目录中,该文件是基于STRUTS应用程序的配置描述文件,它将MVC结构中的各组件结合在一起,开发的过程中会不断对它进行充实和更改。在STRUTS10时,一个应用只能有一个这样的文件,给分工开发带来了一些不便,在STRUTS11时,可以有多个这样的文件,将上述缺点克服了。需在该文件中配置的组件有DATASOURCESGLOBALEXECPTIONSFORMBEANSGLOBALFORWARDSACTIONMAPPINGSCONTROLLERMESSAGERESOURCESPLUGIN配置清单如下因为STRUTS是建立在MVC设计模式上的框架,你可以遵从标准的开发步骤来开发你的STRUTSWEB应用程序,这些步骤大致可以描述如下1、定义并生成所有代表应用程序的用户接口的VIEWS,同时生成这些VIEWS所用到的所有ACTIONFORMS并将它们添加到STRUTSCONFIGXML文件中。2、在APPLICATIONRESOURCEPROPERTIES文件中添加必要的MESSAGERESOURCES项目3、生成应用程序的控制器。4、在STRUTSCONFIGXML文件中定义VIEWS与CONTROLLER的关系。5、生成应用程序所需要的MODEL组件6、编译、运行你的应用程序五、ACTIONSERVLET我们首先来了解MVC中的控制器。在STRUTS11中缺省采用ACTIONSERVLET类来充当控制器。当然如果ACTIONSERVLET不能满足你的需求,你也可以通过继承它来实现自己的类。这可以在/WEBINF/WEBXML中来具体指定。要掌握ACTIONSERVLET,就必须了解它所扮演的角色。首先,ACTIONSERVLET表示MVC结构中的控制器部分,它需要完成控制器所需的前端控制及转发请求等职责。其次,ACTIONSERVLET被实现为一个专门处理HTTP请求的SERVLET,它同时具有SERVLET的特点。在STRUTS11中它主要完成以下功能接收客户端请求根据客户端的URI将请求映射到一个相应的ACTION类从请求中获取数据填充FORMBEAN(如果需要)调用ACTION类的EXECUTE方法获取数据或者执行业务逻辑选择正确的视图响应客户此外,ACTIONSERVLET还负责初始化和清除应用配置信息的任务。ACTIONSERVLET的初始化工作在INIT方法中完成,它可以分为两个部分初始化ACTIONSERVLET自身的一些信息以及每个模块的配置信息。前者主要通过INITINTERNAL、INITOTHER和INITSERVLET三个方法来完成。我们可以在/WEBINF/WEBXML中指定具体的控制器以及初始参数,由于版本的变化以及STRUTS11中模块概念的引进,一些初始参数被废弃或者移入到/WEBINF/STRUTSCONFIGXML中定义。下面列出所有被废弃的参数,相应地在WEBXML文件中也不鼓励再使用。APPLICATIONBUFFERSIZECONTENTDEBUGFACTORYFORMBEANFORWARDLOCALEMAPPINGMAXFILESIZEMULTIPARTCLASSNOCACHENULLTEMPDIRACTIONSERVLET根据不同的模块来初始化MODULECONFIG类,并在其中以XXXCONFIG集合的方式保存该模块的各种配置信息,比如ACTIONCONFIG,FORMBEANCONFIG等。初始化工作完成之后,ACTIONSERVLET准备接收客户请求。针对每个请求,方法PROCESSHTTPSERVLETREQUESTREQUEST,HTTPSERVLETRESPONSERESPONSE将被调用。该方法指定具体的模块,然后调用该模块的REQUESTPROCESSOR的PROCESS方法。PROTECTEDVOIDPROCESSHTTPSERVLETREQUESTREQUEST,HTTPSERVLETRESPONSERESPONSETHROWSIOEXCEPTION,SERVLETEXCEPTIONREQUESTUTILSSELECTMODULEREQUEST,GETSERVLETCONTEXTGETREQUESTPROCESSORGETMODULECONFIGREQUESTPROCESSREQUEST,RESPONSEREQUESTPROCESSOR包含了STRUTS控制器的所有处理逻辑,它调用不同的PROCESSXXX方法来完成不同的处理。下表列出其中几个主要的方法方法功能PROCESSPATH获取客户端的请求路径PROCESSMAPPING利用路径来获得相应的ACTIONMAPPINGPROCESSACTIONFORM初始化ACTIONFORM(如果需要)并存入正确的SCOPE中PROCESSACTIONCREATE初始化ACTIONPROCESSACTIONPERFORM调用ACTION的EXECUTE方法PROCESSFORWARDCONFIG处理ACTION返回的ACTIONFORWARD六、ACTIONFORM对于ACTIONFORM你可以从以下几个方面来理解它1、ACTIONFORM表示HTTP窗体中的数据,可以将其看作是模型和视图的中介,它负责保存视图中的数据供模型或者视图使用。STRUTS11文档中把它比作HTTP和ACTION之间的防火墙,这体现了ACTIONFORM具有的过滤保护的作用,只有通过ACTIONFORM验证的数据才能够发送到ACTION处理。2、ACTIONFORM是与一个或多个ACTIONCONFIG关联的JAVABEAN,在相应的ACTION的EXECUTE方法被调用之前,ACTIONFORM会自动利用请求参数来填充自己(初始化属性)。3、ACTIONFORM是一个抽象类,你必须通过继承来实现自己的类。ACTIONFORM首先利用属性的GETTER和SETTER方法来实现初始化,初始化完毕后,ACTIONFORM的VALIDATE方法被调用,你可以在其中来检查请求参数的正确性和有效性,并且可以将错误信息以ACTIONERRORS的形式返回到输入窗体。否则,ACTIONFORM将被作为参数传给ACTION的EXECUTE方法以供使用。ACTIONFORMBEAN的生命周期可以设置为SESSION(缺省)和REQUEST,当设置为SESSION时,记得在RESET方法中将所有的属性重新设置为初始值。由于ACTIONFORM对应于HTTP窗体,所以随着页面的增多,你的ACTIONFORM将会急速增加。而且可能同一类型页面字段将会在不同的ACTIONFORM中出现,并且在每个ACTIONFORM中都存在相同的验证代码。为了解决这个问题,你可以为整个应用实现一个ACTIONFORM或者至少一个模块对应于一个ACTIONFORM。但是,聚合的代价就是复用性很差,而且难维护。针对这个问题,在STRUTS11中提出了DYNAACTIONFORM的概念。七、ACTION我们通过继承ACTION类来实现具体的执行类。具体ACTION类的功能一般都在EXECUTE(以前是PERFORM方法)方法中完成,其中主要涉及到以下几个方面辅助ACTIONFORM进行一些表单数据的检查。执行必要的业务逻辑,比如存取数据库,调用实体BEAN等。更新服务器端的BEAN数据,后续对象中可能会用到这些数据,比如在JSP中利用BEANWRITE来获得这些数据。根据处理结果决定程序的去处,并以ACTIONFORWARD对象的形式返回给ACTIONSERVLET。提示由于在ACTION和ACTIONFORM中都可以实现验证方法,那么如何来安排它们之间的分工呢一般来说,我们秉着MVC分离的原则,也就是视图级的验证工作放在ACTIONFORM来完成,比如输入不能为空,EMAIL格式是否正确,利用VALIDATORFORM可以很轻松地完成这些工作。而与具体业务相关的验证则放入ACTION中,这样就可以获得最大ACTIONFORM重用性的可能。前面我们提到过,我们主张将业务逻辑执行分离到单独的JAVABEAN中,而ACTION只负责错误处理和流程控制。而且考虑到重用性的原因,在执行业务逻辑的JAVABEAN中不要引用任何与WEB应用相关的对象,比如HTTPSERVLETREQUEST,HTTPSERVLETRESPONSE等对象,而应该将其转化为普通的JAVA对象。关于这一点,可以参考PETSTORE中WAF框架的实现思路。此外,你可能还注意到EXECUTE与PERFORM的一个区别EXECUTE方法简单地掷出EXCEPTION异常,而PERFORM方法则掷出SERVLETEXCEPTION和IOEXCEPTION异常。这不是说STRUTS11在异常处理功能方面弱化了,而是为了配合STRUTS11中一个很好的功能宣称式异常处理机制。八、宣称式异常处理和EJB中的宣称式事务处理概念类似,宣称式异常处理其实就是可配置的异常处理,你可以在配置文件中指定由谁来处理ACTION类中掷出的某种异常。你可以按照以下步骤来完成该功能1、实现ORGAPACHESTRUTSACTIONEXCEPTIONHANDLER的子类,覆盖EXECUTE方法,在该方法中处理异常并且返回一个ACTIONFORWARD对象2、在配置文件中配置异常处理对象,你可以配置一个全局的处理类或者单独为每个ACTION配置处理类下表就定义了一个全局的处理类CUSTOMIZEDEXCEPTIONHANDLER,它被用来处理所有的异常。其中具体的参数含义,可以参考EXCEPTIONHANDLERJAVA源文件。九、TAGLIB讲完了模型和控制器,接下来我们要涉及的是视图。视图的角色主要是由JSP来完成,从JSP的规范中可以看出,在视图层可以“折腾“的技术不是很多,主要的就是自定义标记库的应用。STRUTS11在原有的四个标记库的基础上新增了两个标记库TILES和NESTED。其中TILES除了替代TEMPLATE的基本模板功能外,还增加了布局定义、虚拟页面定义和动态页面生成等功能。TILES强大的模板功能能够使页面获得最大的重用性和灵活性,此外可以结合TILES配置文件中的页面定义和ACTION的转发逻辑,即你可以将一个ACTION转发到一个在TILES配置文件中定义的虚拟页面,从而减少页面的数量。比如,下表中的ACTION定义了一个转发路径,它的终点是TILEUSERMAIN,而后者是你在TILES配置文件中定义的一个页面。TILES配置文件TILESDEFSXML而NESTED标记库的作用是让以上这些基本标记库能够嵌套使用,发挥更大的作用。十、COMMONSLOGGING接口所谓的COMMONSLOGGING接口,是指将日志功能的使用与日志具体实现分开,通过配置文件来指定具体使用的日志实现。这样你就可以在STRUTS11中通过统一的接口来使用日志功能,而不去管具体是利用的哪种日志实现,有点于类似JDBC的功能。STRUTS11中支持的日志实现包括LOG4J,JDKLOGGINGAPI,LOGKIT,NOOPLOG和SIMPLELOG。你可以按照如下的方式来使用COMMONSLOGGING接口(可以参照STRUTS源文中的许多类实现)PACKAGECOMFOO/IMPORTORGAPACHECOMMONSLOGGINGLOGIMPORTORGAPACHECOMMONSLOGGINGLOGFACTORY/PUBLICCLASSFOO/PRIVATESTATICLOGLOGLOGFACTORYGETLOGFOOCLASS/PUBLICVOIDSETBARBARBARIFLOGISTRACEENABLEDLOGTRACE“SETTINGBARTO“BARTHISBARBAR/而开启日志功能最简单的办法就是在WEBINF/CLASSES目录下添加以下两个文件COMMONSLOGG

温馨提示

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

评论

0/150

提交评论