一、谈到Struts,就不得不提到MVC设计模式。MVC即Model-View-Controller的缩写,它是web应用当中的常用的设计模式。MVC减弱了业务逻辑接口和数据接口之间的耦合,同时让视图层更富于变化。Struts是MVC的一种实现,它很好的结合了Jsp,Java Servlet,Java Bean,Taglib等技术。
1.控制:在Struts中,承担MVC中Controller角色的是一个Servlet,叫ActionServlet。ActionServlet是一个通用的控制组件。这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点。它截取和分发这些请求到相应的动作类(这些动作类都是Action类的子类)。另外控制组件也负责用相应的请求参数填充 Action Form(通常称之为FromBean),并传给动作类(通常称之为ActionBean)。动作类访问核心商业逻辑,即访问Java Bean或调用EJB。最后动作类把控制权传给后续的JSP文件,由JSP文件生成视图。所有这些控制逻辑利用Struts-config.xml文件来配置。
2.视图:主要由JSP生成页面完成视图,Struts提供丰富的JSP标签库: Html,Bean,Logic,Template等,这有利于分开表现逻辑和程序逻辑。
3.模型:模型以一个或多个Java Bean的形式存在;在Struts中,主要存在三种Bean,分别是:Action,ActionForm,EJB或者Java Bean。Action Form通常称之为FormBean,封装了来自于Client的用户请求信息,如表单信息。Action通常称之为ActionBean,获取从ActionSevlet传来的FormBean,取出FormBean中的相关信息,并做出相关的处理,一般是调用Java Bean或EJB等。
4. 流程:在Struts中,用户的请求一般以*.do(这个后缀是可以自由配置的)作为请求服务名,所有的*.do请求均被指向ActionSevlet,ActionSevlet根据Struts-config.xml中的配置信息,将用户请求封装成一个指定名称的FormBean,并将此FormBean传至指定名称的ActionBean,由ActionBean完成相应的业务操作,如文件操作,数据库操作等。每一个*.do均有对应的FormBean名称和ActionBean名称,这些在Struts-config.xml中配置。
核心:Struts的核心是ActionSevlet,ActionSevlet的核心是Struts-config.xml。
因此Struts可以为Web应用的开发和维护带来诸多的好处,其优点表现在以下几个方面:
利用Struts提供的taglib可以大大节约开发时间;
表现与逻辑分离;
维护扩展比较方便;
便于团队开发;
可以提高系统的可维护性和可重用性。
其缺点是大量的使用标签,对于初学者难度较大。
二、struts原理:
struts的核心类是ActionServlet,其可以接收所有.do结尾的请求。核心配置文件是struts-config.xml文件说明url与Action及ActionForm的对应关系,url不可以重复。在web.xml中说明ActionServlet、其可以接收所有以do结尾的请求;说明struts-config.xml所在位置,以参数的形式传给ActionServlet。
当启动容器时,容器(tomcat、weblogic)实例化ActionServlet,初始化ActionServlet,在初始化ActionServlet时加载struts-config.xml文件。
当客户通过url.do将请求发给ActionServlet,ActionServlet将处理转发给助手RequestProcessor,RequestProcess通过struts-config.xml找到对应的actionForm及action,如果有ActionForm用已有的,没有通过类的反射实例化一个新的ActionForm,放置到作用域对象,通过反射将表单域的值填充到actionForm中。如果有Action用已有的,没有产生一个新的,通过反射调用action的execute方法,在执行前将actionForm通过参数注入到execute方法中,execute方法执行结束前通过actionMapping找到actionForward转发到另一个页面。
三、
对于Struts 如何控制、处理客户请求,让我们通过对struts的四个核心组件介绍来具体说明。这几个组件就是:ActionServlet。Action Classes,Action Mapping(此处包括ActionForward),ActionFrom Bean。
Struts ActionServlet控制器对象
ActionServlet继承自javax.servlet.http.HttpServlet类,其在Struts framework中扮演的角色是中心控制器。它提供一个中心位置来处理全部的终端请求。控制器ActionServlet主要负责将HTTP的客户请求信息组装后,根据配置文件的指定描述,转发到适当的处理器。
按照Servelt的标准,所有得Servlet必须在web配置文件(web.xml)声明。同样,ActoinServlet必须在Web Application配置文件(web.xml)中描述,有关配置信息如下。
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
</servlet>
全部的请求URI以*.do的模式存在并映射到这个servlet,其配置如下:
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
Struts Action Classes
ActionServlet把全部提交的请求都被控制器委托到RequestProcessor对象。RequestProcessor使用struts-config.xml文件检查请求URI找到动作Action标示符。
一个Action 类的角色,就像客户请求动作和业务逻辑处理之间的一个适配器(Adaptor),其功能就是将请求与业务逻辑分开。这样的分离,使得客户请求和Action类之间可以有多个点对点的映射。而且Action类通常还提供了其它的辅助功能,比如:认证(authorization)、日志(logging)和数据验证(validation)。
public ActionForward execute(ActionMapping mapping,
ActionForm form,
javax.servlet.ServletRequest request,
javax.servlet.ServletResponse response)
throws java.io.IOException,javax.servlet.ServletException
当Controller收到客户的请求的时候,在将请求转移到一个Action实例时,如果这个实例不存在,控制器会首先创建,然后会调用这个Action实例的execute()方法。Struts Framework为应用系统中的每一个Action类只创建一个实例。因为所有的用户都使用这一个实例,所以你必须确定你的Action 类运行在一个多线程的环境中。
控制器如何知道什么样的信息转发到什么样的Action类呢?这就需要一些与动作和请求信息相对应的映射配置说明。在struts 中,这些配置映射信息是存储在特定的XML文件(比如struts-config.xml)。
这些配置信息在系统启动的时候被读入内存,供struts framework在运行期间使用。在内存中,每一个<action>元素都与org.apache.struts.action.ActionMapping类的一个实例对应。下表就显示了一个登陆的配置映射。
<action-mappings>
<action path="/logonAction" type="com.test.LogonAction" name="LogonForm" scope="request" input="logoncheck.jsp"
validate="false">
<forward name="welcome" path="/welcome.jsp"/>
<forward name="failure" path="/logon_failure.jsp "/>
</action>
</action-mappings>
<form-beans>
<form-bean name="LoginForm" type="com.test.LoginForm"/>
</form-beans>
上面的配置表示:当可以通过/logonAction.do(此处假设配置的控制器映射为*.do)提交请求信息的时候,控制器将信息委托com.test.LogonAction处理。调用LogonAction实例的execute()方法。同时将Mapping实例和所对应的LogonForm Bean信息传入。其中name=LogonForm,使用的form-bean元素所声明的ActionForm Bean。有关form-bean的申明如下显示。
使用ActionForward导航
元素<forward>则表示了当Action实例的execute()方法运行完毕或,控制器根据Mapping可将响应信息转到适当的地方。如上面现实,如果客户登陆成功,则调用welcome forward,将成功信息返回到/welcome.jsp页面。在你的execute()方法的结尾可以使用下面的实例代码而返回welcome forward。当然你的welcome forward必须在action元素属性中定义,正如上面所声明的那样。
return (mapping.findForward("welcome"));
ActionForward对象是配置对象。这些配置对象拥有独一无二的标识以允许它们按照有意义的名称如“success”,“failure”等来检索。
- 大小: 14.2 KB
分享到:
相关推荐
Hive中支持多种数据类型除了常用的TINYINT、SMALLINT、INT、BIGINT、BOOLEAN、FLOAT、DOUBLE、STRING、BINARY、TIMESTAMP、DECIMAL、DATE、VARCHAR...,当然还包含一些复杂的数据类型(array、map、struct、union)...
struct ,spring,ejb架构原理培训以及相关源码,程秀野
详细介绍sizeof(struct)的方法和原理,一看就懂
struct练习源码 博文链接:https://lcy0202.iteye.com/blog/1518556
linux驱动程序结构框架及工作原理与struct _file_operations
demo内创建了了一个简单的关于Mapstruct的示例,使用此demo可以初步学习MapStruct的用法,初探MapStruct的原理。
可以很快的了解extjs和struct的工作原理。可以作为一个学习的例子。
struts1.2的执行原理的总结以及关于struts MVC原理的总结
公司项目需要,搭建了SSM框架,当初想更好的熟悉SSM框架的架构及其原理,所以未使用maven,资源中包括所有的jar包,能直接运行在tomcat服务器,框架中使用了Spring的自动扫描,注解注入,AOP异常日志记录,AOP事务,...
编译原理实验 实现简单的词法分析 中间代码生成四元式
通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。 实验要求 采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。 ...
typedef struct WordAnalysisList { struct WordAnalysisList *last; char index;//以字母作为标号 其index为在endSign中对应的元素 char value[128];//对应值字符串 struct WordAnalysisList *next; }...
svm-struct-matlab-1.2 已mex版本,不需要再重新mex,方便使用!
struts1入门第一关 学习要掌握其流程 知道运作的原理
map 和 bean 之间的转换,可以利用反射的原理实现
linux课程资源in_size=sizeof(struct sockaddr_in); if((new_fd=accept(sockfd,(struct sockaddr *)(&client;_addr),&sin;_size))==-1) { fprintf(stderr,"Accept error:%s\n\a",strerror(errno)); exit(1); } ...
#include #include #include #include #include #define de(x) cout ...struct T //转换表 项目集转换 { int begin; int next; char ch; }; struct project //项目集 { int num; int now; //小数点位置
struct option{ int Class; char* value; int address; char f[20]; }s[1000]; struct fuhao{ char* name; }biao[1000]; void main() { char fname[20]; FILE *fp; do{ printf("Input the filename:"); ...
工作原理(简短概述) 使用 structr 生成架构创建本地类查询和使用您的数据##Step-by-Step 注意:这些步骤不显示如何使用结构体或如何创建架构。 此示例基于 Android。 ###使用 Structr 生成数据模式首先使用 struct...
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 二、实验要求: 1.对给定的程序通过词法分析器弄够识别一个...