Struts1工作原理浅析.docx

上传人:b****2 文档编号:17388899 上传时间:2023-07-24 格式:DOCX 页数:16 大小:119.04KB
下载 相关 举报
Struts1工作原理浅析.docx_第1页
第1页 / 共16页
Struts1工作原理浅析.docx_第2页
第2页 / 共16页
Struts1工作原理浅析.docx_第3页
第3页 / 共16页
Struts1工作原理浅析.docx_第4页
第4页 / 共16页
Struts1工作原理浅析.docx_第5页
第5页 / 共16页
Struts1工作原理浅析.docx_第6页
第6页 / 共16页
Struts1工作原理浅析.docx_第7页
第7页 / 共16页
Struts1工作原理浅析.docx_第8页
第8页 / 共16页
Struts1工作原理浅析.docx_第9页
第9页 / 共16页
Struts1工作原理浅析.docx_第10页
第10页 / 共16页
Struts1工作原理浅析.docx_第11页
第11页 / 共16页
Struts1工作原理浅析.docx_第12页
第12页 / 共16页
Struts1工作原理浅析.docx_第13页
第13页 / 共16页
Struts1工作原理浅析.docx_第14页
第14页 / 共16页
Struts1工作原理浅析.docx_第15页
第15页 / 共16页
Struts1工作原理浅析.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Struts1工作原理浅析.docx

《Struts1工作原理浅析.docx》由会员分享,可在线阅读,更多相关《Struts1工作原理浅析.docx(16页珍藏版)》请在冰点文库上搜索。

Struts1工作原理浅析.docx

Struts1工作原理浅析

一、引入struts

Model1结构如图1所示:

Mode11是一个以JSP文件为中心的模式,在这种模式中JSP页面不仅负责表现逻辑,也负责控制逻辑。

专业书籍上称之为逻辑耦合在页面中,这种处理方式,对一些规模很小的项目如:

一个简单的留言簿,也没什么太大的坏处,实际上,人们开始接触一些对自己来说是新的东西的时候,比如,用JSP访问数据库时,往往喜欢别人能提供一个包含这一切的单个JSP页面,因为这样在一个页面上他就可以把握全局,便于理解。

但是,用Model1模式开发大型时,程序流向由一些互相能够感知的页面决定,当页面很多时要清楚地把握其流向将是很复杂的事情,当您修改一页时可能会影响相关的很多页面,大有牵一发而动全身的感觉,使得程序的修改与维护变得异常困难;还有一个问题就是程序逻辑开发与页面设计纠缠在一起,既不便于分工合作也不利于代码的重用,这样的程序其健壮性和可伸缩性都不好。

Model2引入了"控制器"这个概念,控制器一般由Servlet来担任,客户端的请求不再直接送给一个处理业务逻辑的JSP页面,而是送给这个控制器,再由控制器根据具体的请求调用不同的事务逻辑,并将处理结果返回到合适的页面。

因此,这个servlet控制器为应用程序提供了一个进行前-后端处理的中枢。

一方面为输入数据的验证、身份认证、日志及实现国际化编程提供了一个合适的切入点;另一方面也提供了将业务逻辑从JSP文件剥离的可能。

业务逻辑从JSP页面分离后,JSP文件蜕变成一个单纯完成显示任务的东西,这就是常说的View。

而独立出来的事务逻辑变成人们常说的Model,再加上控制器Control本身,就构成了MVC模式。

实践证明,MVC模式为大型程序的开发及维护提供了巨大的便利。

二、struts工作原理

来自客户的所有需要通过框架的请求,统一由ActionServlet接收(ActionServletStruts已经为我们写好了,只要您应用没有什么特别的要求,它基本上都能满足您的要求),根据接收的请求参数和Struts配置(struts-config.XML)中ActionMapping,将请求送给合适的Action去处理,解决由谁做的问题,它们共同构成Struts的控制器。

Action则是Struts应用中真正干活的组件,它解决的是做什么的问题,它通过调用需要的业务组件(模型)来完成应用的业务,业务组件解决的是如何做的问题,并将执行的结果返回一个代表所需的描绘响应的JSP(或Action)的ActionForward对象给ActionServlet以将响应呈现给客户。

这里要特别说明一下的是:

就是Action这个类,它不应该包含过多的业务逻辑,而应该只是简单地收集业务方法所需要的数据并传递给业务对象。

实际上,它的主要职责是:

校验前提条件或者声明

调用需要的业务逻辑方法

检测或处理其他错误

路由控制到相关视图

三、struts运行机制

Struts的工作流程:

在web应用启动时就会加载,初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到各种配置对象中,当ActionServlet接收到一个客户请求时,将执行如下流程.

(1)检索和用户请求匹配的ActionMapping实例,如果不存在就返回请求路径无效信息;

(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;

(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法;

(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象,就表示表单验证成功;

(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法;

(6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给ActionForward对象指向的JSP组件;

(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;

四、Struts1的安装与基本配置

我们主要针对Struts1.1版本进行讲解,这里假定读者已经配置好Java运行环境和相应的Web容器,本文例子所使用的是j2sdk和Tomcat4.1.27。

下面,将采用类似于stepbystep的方式介绍其基础部分。

安装Struts到http:

//jakarta.apache.org/下载Struts的安装文件,本文例子使用的是1.1版。

接下来您要进行如下几个步骤来完成安装:

1、解压下载的安装文件到您的本地硬盘

2、生成一个新的Web应用,假设我们生成的应用程序的根目录在/Webapps/mystruts目录。

在server.xml文件中为该应用新建一个别名如/mystruts

3、从第1步解压的文件中拷贝下列jar文件到/Webapps/mystruts/WEB-INF/lib目录,主要文件有如下一些。

struts.jarcommons-beanutils.jar

commons-collections.jar

commons-dbcp.jar

commons-digester.jar

commons-logging.jar

commons-pool.jar

commons-services.jar

commons-validator.jar

4、创建一个web.xml文件,这是一个基于servlet的Web应用程序都需要的部署描述文件,一个StrutsWeb应用,在本质上也是一个基于servlet的Web应用,它也不能例外。

Struts有两个组件要在该文件中进行配置,它们是:

ActionServlet和标签库。

下面是一个配置清单

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPEweb-appPUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN""

action

org.apache.struts.action.ActionServlet

config

/WEB-INF/struts-config.xml

debug

2

2

action

*.do

/WEB-INF/struts-bean.tld/WEB-INF/struts-bean.tld

/WEB-INF/struts-html.tld/WEB-INF/struts-html.tld

/WEB-INF/struts-logic.tld/WEB-INF/struts-logic.tld

上面我们在web.xml中完成了对servlet和标签库的基本配置,而更多的框架组件要在struts-config.xml中进行配置:

5、创建一个基本的struts-config.xml文件,并把它放在/Webapps/mystruts/WEB-INF/目录中,该文件是基于Struts应用程序的配置描述文件,它将MVC结构中的各组件结合在一起,开发的过程中会不断对它进行充实和更改。

在Struts1.0时,一个应用只能有一个这样的文件,给分工开发带来了一些不便,在Struts1.1时,可以有多个这样的文件,将上述缺点克服了。

需在该文件中配置的组件有:

data-sources

global-execptionsform-beansglobal-forwardsaction-mappingscontrollermessage-resourcesplug-in

配置清单如下:

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPEstruts-configPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.1//EN""http:

//jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

因为Struts是建立在MVC设计模式上的框架,你可以遵从标准的开发步骤来开发你的StrutsWeb应用程序,这些步骤大致可以描述如下:

1、定义并生成所有代表应用程序的用户接口的Views,同时生成这些Views所用到的所有ActionForms并将它们添加到struts-config.xml文件中。

2、在ApplicationResource.properties文件中添加必要的MessageResources项目

3、生成应用程序的控制器。

4、在struts-config.xml文件中定义Views与Controller的关系。

5、生成应用程序所需要的model组件

6、编译、运行你的应用程序.

五、ActionServlet

我们首先来了解MVC中的控制器。

在Struts1.1中缺省采用ActionServlet类来充当控制器。

当然如果ActionServlet不能满足你的需求,你也可以通过继承它来实现自己的类。

这可以在/WEB-INF/web.xml中来具体指定。

要掌握ActionServlet,就必须了解它所扮演的角色。

首先,ActionServlet表示MVC结构中的控制器部分,它需要完成控制器所需的前端控制及转发请求等职责。

其次,ActionServlet被实现为一个专门处理HTTP请求的Servlet,它同时具有servlet的特点。

在Struts1.1中它主要完成以下功能:

接收客户端请求

根据客户端的URI将请求映射到一个相应的Action类

从请求中获取数据填充FormBean(如果需要)

调用Action类的execute()方法获取数据或者执行业务逻辑

选择正确的视图响应客户

此外,ActionServlet还负责初始化和清除应用配置信息的任务。

ActionServlet的初始化工作在init方法中完成,它可以分为两个部分:

初始化ActionServlet自身的一些信息以及每个模块的配置信息。

前者主要通过initInternal、initOther和initServlet三个方法来完成。

我们可以在/WEB-INF/web.xml中指定具体的控制器以及初始参数,由于版本的变化以及Struts1.1中模块概念的引进,一些初始参数被废弃或者移入到/WEB-INF/struts-config.xml中定义。

下面列出所有被废弃的参数,相应地在web.xml文件中也不鼓励再使用。

application

bufferSize

content

debug

factory

formBean

forward

locale

mapping

maxFileSize

multipartClass

nocache

null

tempDir

ActionServlet根据不同的模块来初始化ModuleConfig类,并在其中以XXXconfig集合的方式保存该模块的各种配置信息,比如ActionConfig,FormBeanConfig等。

初始化工作完成之后,ActionServlet准备接收客户请求。

针对每个请求,方法process(HttpServletRequestrequest,HttpServletResponseresponse)将被调用。

该方法指定具体的模块,然后调用该模块的RequestProcessor的process方法。

protectedvoidprocess(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsIOException,ServletException{

RequestUtils.selectModule(request,getServletContext());

getRequestProcessor(getModuleConfig(request)).process(request,response);

}

RequestProcessor包含了Struts控制器的所有处理逻辑,它调用不同的processXXX方法来完成不同的处理。

下表列出其中几个主要的方法:

方法

功能

processPath

获取客户端的请求路径

processMapping

利用路径来获得相应的ActionMapping

processActionForm

初始化ActionForm(如果需要)并存入正确的scope中

processActionCreate

初始化Action

processActionPerform

调用Action的execute方法

processForwardConfig

处理Action返回的ActionForward

六、ActionForm

对于ActionForm你可以从以下几个方面来理解它:

1、ActionForm表示HTTP窗体中的数据,可以将其看作是模型和视图的中介,它负责保存视图中的数据供模型或者视图使用。

Struts1.1文档中把它比作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。

但是,聚合的代价就是复用性很差,而且难维护。

针对这个问题,在Struts1.1中提出了DynaActionForm的概念。

七、Action

我们通过继承Action类来实现具体的执行类。

具体Action类的功能一般都在execute(以前是perform方法)方法中完成,其中主要涉及到以下几个方面:

辅助ActionForm进行一些表单数据的检查。

执行必要的业务逻辑,比如存取数据库,调用实体bean等。

更新服务器端的bean数据,后续对象中可能会用到这些数据,比如在JSP中利用bean:

write来获得这些数据。

根据处理结果决定程序的去处,并以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异常。

这不是说Struts1.1在异常处理功能方面弱化了,而是为了配合Struts1.1中一个很好的功能--宣称式异常处理机制。

八、宣称式异常处理

和EJB中的宣称式事务处理概念类似,宣称式异常处理其实就是可配置的异常处理,你可以在配置文件中指定由谁来处理Action类中掷出的某种异常。

你可以按照以下步骤来完成该功能:

1、实现org.apache.struts.action.ExceptionHandler的子类,覆盖execute方法,在该方法中处理异常并且返回一个ActionForward对象

2、在配置文件中配置异常处理对象,你可以配置一个全局的处理类或者单独为每个Action配置处理类

下表就定义了一个全局的处理类CustomizedExceptionHandler,它被用来处理所有的异常。

handler="com.yourcorp.CustomizedExceptionHandler"

key="global.error.message"

path="/error.jsp"

scope="request"

type="java.lang.Exception"/>

其中具体的参数含义,可以参考ExceptionHandler.java源文件。

九、taglib

讲完了模型和控制器,接下来我们要涉及的是视图。

视图的角色主要是由JSP来完成,从JSP的规范中可以看出,在视图层可以"折腾"的技术不是很多,主要的就是自定义标记库的应用。

Struts1.1在原有的四个标记库的基础上新增了两个标记库--Tiles和Nested。

其中Tiles除了替代Template的基本模板功能外,还增加了布局定义、虚拟页面定义和动态页面生成等功能。

Tiles强大的模板功能能够使页面获得最大的重用性和灵活性,此外可以结合Tiles配置文件中的页面定义和Action的转发逻辑,即你可以将一个Action转发到一个在Tiles配置文件中定义的虚拟页面,从而减少页面的数量。

比如,下表中的Action定义了一个转发路径,它的终点是tile.userMain,而后者是你在Tiles配置文件中定义的一个页面。

--==========ActionMappingDefinitions==============================-->

--Actionmappingforprofileform-->

type="com.ncu.test.LoginAction"

name="loginForm"

scope="request"

input="tile.userLogin"

validate="true">

Tiles配置文件:

tiles-defs.xml

DOCTYPEtiles-definitionsPUBLIC

"-//ApacheSoftwareFoundation//DTDTilesConfiguration//EN"

"http:

//jakarta.apache.org/struts/dtds/tiles-config.dtd">

--=======================================================-->

--Masterdefinitions

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2