剖析Struts1中的五个对象(一)

Struts是一个基于MVC架构的框架(框架实现了某些领域通用完备功能的底层服务),它主要用于开发Web应用程序,帮助我们减少了用MVC开发Web应用的时间,简化了开发过程,使开发更具模块化、灵活性和重用性。可以说Struts把MVC的设计思想发挥到了极致,尤其在Controller层。

在用Struts开发项目直接接触的有这么几个类:ActionMapping、ActionServlet、ActionForm、Action和ActionForward,这五个类各司其职,使上有老下有小的Controller层接近完美。因Struts是面向对象设计,掌握了这几个类,也就基本掌握了Struts的用法,下面按照这几个类的执行流程举例说明他们在Struts中的具体用法。下图为Struts的一个大致流程图:

剖析Struts1中的五个对象(一)_第1张图片

这里不考虑各个对象的创建细节,单从工作的流程分析各个类的作用。

   ActionServlet

剖析Struts1中的五个对象(一)_第2张图片

客户端向服务器(Tomcat)发起请求,通过在web.xml中的配置,请求直接进入ActionServlet,从命名就可以看出这是一个Servlet,此类是不需要我们显式去创建的,Struts框架已对它做了实现。请求继续调用ActionServlet的doGet/doPost方法,实际上这个两个方法共同调用了RequestProcess类的process方法,process方法才是真正的核心,在process方法中,通过调用processPtah方法截取Request中传递过来的URL,然后调用processMapping方法根据截取的URL取得相应的ActionMapping。

在web.xml中的配置代码如下:

  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>2</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>2</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

从上面配置不难看出,ActionServlet在Tomcat启动时,就已经创建好了,只要是以do结尾的请求都会被ActionServlet拦截下来,然后它将不同的请求转发给对应的Action对象,让Action进一步处理客户端的请求。因此ActionServlet肩负着中央控制器角色,是Struts的核心。下面介绍的各个类中,依旧会看到ActionServlet的影子。

  ActionMapping

剖析Struts1中的五个对象(一)_第3张图片

ActionServlet调用processMapping方法,此方法首先会调用moduleConfig.findActionConfig(path),获取对应的ActionMapping对象。Struts框架将核心配置文件struts-config.xml解析并放入了ActionMapping对象里。

等返回ActionMapping对象后,processMapping方法把ActionMapping设置到Request或Session中方便后面其他地方的使用,体现了面向对象封装的好处。struts-config.xml配置信息如下:

<struts-config>
	<form-beans>
		<form-bean name="itemForm" type="com.snail.drp.web.forms.ItemActionForm"/>
	</form-beans>
	
	<global-exceptions>
		<exception key="errors.detail" type="com.snail.drp.AppException" path="/error.jsp"/>
	</global-exceptions>
	 
	<action-mappings>
		<action path="/item"
				type="com.snail.drp.web.actions.ItemAction"
				name="itemForm"
				scope="request"
				parameter="command"
				>
			<forward name="list" path="/WEB-INF/jsp/item_maint.jsp"/>	
			<forward name="show_add" path="/WEB-INF/jsp/item_add.jsp"/>	
			<forward name="item_index" path="item.do" redirect="true"/>
			<forward name="show_modify" path="/WEB-INF/jsp/item_modify.jsp"/>
			<forward name="show_detail" path="/WEB-INF/jsp/item_detail.jsp"/>
			<forward name="show_upload" path="/WEB-INF/jsp/item_upload.jsp"/>
		</action>
	</action-mappings>
    <message-resources parameter="MessageResources"/>
</struts-config>

配置信息里看出,其中中包含有与请求对应的ActionForm、Action、ActionForward、错误处理以及国际化等配置信息,这些都可以通过ActionMapping取出来。

  下一篇继续。。。

你可能感兴趣的:(mvc,struts,servlet,action,Path)