一、谈到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
分享到:
相关推荐
本文将深入探讨 `struct` 的基本原理,以及如何通过源码进行实践。 `struct` 在 C/C++ 中是一种复合数据类型,允许我们将多个不同类型的变量组合在一起,形成一个新的数据结构。这种数据结构可以包含整型、浮点型、...
根据给定的信息,我们可以深入探讨有关 IP 数据报结构的关键知识点。 ### IP 数据报结构 IP 数据报是互联网中传输的基本单位,它包含了控制信息(即...这些知识点对于理解互联网工作原理以及进行网络编程至关重要。
下面我们将详细讨论`struct2double`函数的用法、原理以及相关的MATLAB语言基础知识。 首先,MATLAB中的结构体是一种复杂的数据类型,可以存储各种不同类型的数据,包括数字、字符串、数组等。结构体由字段(field)...
总的来说,"struct ,spring,ejb架构原理培训"是一个全面了解Java Web开发的重要课程,涵盖了从轻量级到企业级的多种解决方案。无论你是初学者还是有经验的开发者,都能从中受益匪浅,提升自己的专业技能。
源码的提供使得用户可以深入理解框架的工作原理,并根据需要进行定制或扩展。 1. **JavaStruct框架**: JavaStruct作为一个开源框架,可能是为了解决Java开发者在处理数据结构、算法或设计模式时遇到的问题。框架...
通过对“test_x2struct.rar”压缩包内容的分析,我们将了解到如何使用这个工具进行数据转换,并了解其背后的原理和实现。 “test_x2struct.rar”包含了源码以及编译运行所需的makefile文件,这意味着我们可以通过...
本文将深入探讨MapStruct的工作原理、优点、如何集成到Spring项目中,以及如何使用它来高效地执行对象映射。 一、MapStruct的工作原理 MapStruct基于注解驱动的代码生成机制,它通过读取源对象和目标对象上的注解,...
#### MapStruct的工作原理: MapStruct基于Java的注释处理器API(JSR269),它可以集成到大多数常用的Java构建工具中(如Maven, Gradle等),并且也可以在集成开发环境(IDE)中使用,例如IntelliJ IDEA和Eclipse。...
下面我们将详细探讨Struct的原理及其在留言板中的应用。 首先,理解Struct的概念。Struct是C++、Go等编程语言中的构造,它允许我们将多个不同类型的变量组合成一个新的类型,这个新的类型就是Struct类型。在C++中,...
`ini2struct` 函数的工作原理是读取`.ini`文件的每个节(section)和键值对(key-value pairs),然后将它们组织成MATLAB中的结构体。结构体的字段名对应于`.ini`文件中的节名,而字段值则为包含键值对的细胞数组。...
在本文中,我们将详细解释 typedef struct 的用法和原理,并讨论它与 struct 的区别。 1. typedef 的基本概念 typedef 是 C 语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型...
MapStruct 是一个强大的Java库,专门用于简化对象到对象映射的过程。它的核心理念是通过...通过阅读MapStruct的参考指南,开发者可以深入理解其工作原理,掌握各种配置和高级功能,从而更好地在项目中应用这一工具。
在这个过程中,我们将详细探讨struct2mat函数的工作原理以及如何在实际应用中使用它。 首先,让我们了解结构体。结构体是由一组字段(或成员)组成的复合数据类型,每个字段可以有不同的数据类型。在MATLAB中,你...
下面我们将详细讨论`struct2string`函数的用法、工作原理以及它在实际开发中的应用。 ### 1. `struct2string`函数的基本用法 `struct2string`函数接收一个或多个结构体作为输入参数,返回一个字符串,该字符串表示...
`task_struct`在内核态堆栈中的位置对于理解Linux内核的工作原理至关重要。通过了解`task_struct`的布局和如何快速定位,可以帮助开发者更好地进行内核编程和故障排查。随着硬件技术的发展和软件需求的变化,`task_...
在编程领域,结构(Struct)和枚举(Enum)是两种...在VS2005环境下,你可以方便地调试和测试这些示例,加深对这两种数据类型工作原理的理解。通过不断练习和探索,你将能够灵活运用Struct和Enums解决实际编程问题。
下面我们将详细探讨`xls2struct`函数的工作原理以及如何在MATLAB环境中使用它。 首先,我们要理解结构数组在MATLAB中的概念。结构数组是一种特殊的数据类型,它可以包含不同类型的字段,每个字段都可以存储不同类型...
下面将详细讨论MapStruct的基本概念、其工作原理以及可能包含在压缩包中的内容。 MapStruct是一个代码生成库,它的主要目标是通过自动生成转换代码来减少样板代码。在Java中,当我们在不同对象之间进行数据转换时,...
`quiz4.c`和`main.c`可能包含了具体的结构体定义和使用结构体指针的示例代码,这将有助于你实际操作并理解它们的工作原理。`quiz4.h`可能是一个头文件,其中包含了结构体定义和其他函数原型,以便在多个源文件之间...
在这个主题中,我们将深入探讨`str2struct`的使用方法、工作原理以及相关应用。 首先,我们来了解`str2struct`的基本语法。`str2struct`函数通常接受一个字符串输入,该字符串由逗号分隔的键值对组成,然后将其转换...