`
uule
  • 浏览: 6314957 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

struct原理

 
阅读更多

 

 一、谈到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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics