在J2EE企业级系统开发中,Struts框架占据了很重要的地位,熟练使用Struts框架可以大大地缩短开发周期,提高开发效率。本文将通过具体的代码实例和流程图对Struts框架的工作原理进行论述。


关键词:J2EE,Struts,系统开发框架



  在J2EE企业级系统开发中,Struts框架占据了很重要的地位,熟练使用Struts框架可以大大地缩短开发周期,提高开发效率。本文将通过具体的代码实例和流程图对Struts框架的工作原理进行论述。


  关键词


  J2EE Struts 系统开发框架


  引言


  学习Struts框架普遍会遇到的问题是搞不清它的具体工作原理。整个Struts应用是一个分工明确的有机整体,各个组件各司其职,在控制中心的统一指挥下,按部就班地完成各个部门的处理工作。


  1.接收HTTP请求转到Struts控制器


  

struts的架构 struts框架原理_客户端


  图1 :Struts工作原理流程


  在如图1所示的工作原理流程中描述了客户端浏览器从发出请求到获得响应的整个处理过程:


  从图1中可以看出,服务器首先对接受到的客户端请求进行过滤:属于Struts处理范围的请求被自动提交给Struts控制器处理,否则将按照传统的方式作出响应。具体说来,在Web应用程序中,凡是“*.do”格式的页面请求URI(Uniform Resource Indicator,统一资源指示符)均属于Struts处理范围,将由一个名为ActionServlet的Servlet负责处理,Struts实现这一控制逻辑并没有引入新的机制,来看Web应用下web.xml的一段代码:


 

  上述代码片段中使用标准格式配置了名为action的控制器Servlet,并在<servlet-mapping>元素中将所有“.do”结尾的页面请求URI映射到该Servlet。类型org.apache.struts.action.ActionServlet是Struts API 中定义的最重要组件类之一,该类继承了javax.servlet.http.HHttpServlet,因此其对象可以被作为 Servlet使用。

<servlet> 

  <servlet-name>action</servlet-name> 

  <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> 

  </servlet> 

  <servlet-mapping> 

  <servlet-name>action</servlet-name> 

  <url-pattern>*.do</url-pattern> 

  </servlet-mapping>


  2.FormBean分发请求


  控制器Servlet开始工作,它先使用一个制定的JavaBean来自动接收客户端请求中包含的表单数据,这在Struts配置文件struts-config.xml中可以找到,声明该JavaBean的代码为:

<form-beans> 

  <form-bean name=”loginForm” type="com.struts.from.UserForm" /> 

  </form-beans> 

  为了实现属性的自动填充功能,该JavaBean必须是org.apache.struts.action. 

  ActionForm类型(实际上是其子类)的对象。 
论文格式

。指定使用该Bean的代码同样位于文件struts-config.xml中:


<action-mappings> 

  <action input="/login.jsp" name="loginForm"path="/login" scope="request" type="com.struts.action.LoginAction"> 

   </action> 

  <action path=”/regist” forvard=”/regist.jsp”> 

  </action-mapping>

  上述代码片段的作用是,使用<action-mapping>元素的子元素<action>来事先约定控制器(ActionServlet对象)分发HTTP请求的规则:


  (1)如果请求的页面URI是login.do,则使用先前说明过的loginForm来自动接收请求表单中的数据,并将该请求分发给一个LoginAction类型的实例来处理。该实例起到类似于java程序中事件监听器的作用,要求其所属类型必须是org.apache.struts.action.Action的子类。


  同样地,控制器Servlet对象有时也被称为“AectionServlet对象”。和使用JavaBean的情形类似,如果找不到该Action对象(第一次用到时),则系统会自动实例化一个。


  (2)如果请求的页面URI是reqist.do,则直接转向到“/regist.jsp”页面做出响应。此时对应的是图2-9中的一条“短路”流程“1->7->9”。论文格式。


  显然,如果需要还可以在<action-mapping>中定义更多的<action>子元素,来实现多分支效果。


  3.执行execute()方法


  Action对象接收到分发来的请求和先前由ActionServlet对象填充过的表单Bean(以及一些其他相关信息)后,会调用其execute()方法进行处理,execute()方法返回一个封装了下一目标页面信息的AoctionForvard对象给控制器ActionServlet。此时,mapping对象调用findForward()方法查找的是配置文件中<forward>元素所包含的映射信息:

<global-forwards> 

   <forwardname="failed" path="/error.jsp"/> 

   <forwardname="successed" path="/right.jsp"/> 

   </global-forwards> 

  最终的效果是,身份验证通过则由ActionServlet将原客户端HTTP请求再次转发至/error.jsp页面,否则转发至right.jsp页面。论文格式。



  4.归纳Struts应用程序的基本原理


  (1)ActionServlet接收客户端HTTP请求,使用ActionForm自动接收请求表单信息,然后将请求分发给相应的Action对象。


  (2)Action对象调用execute()方法处理请求,然后返回ActionForward对象给ActionServlet


  (3)根据AoctionForward对象封装的信息,ActionForward将HTTP请求再次转发给其它页面,最终发送响应回客户端。



参考文献


1. 《Struts Kick Start》 作者: (美)比德尔 (美)特纳 


译者: 孙勇 电子工业出版社


2.《精通Struts:基于MVC的Java Web设计与开发》