Struts是一个基于MVC架构的框架(框架实现了某些领域通用完备功能的底层服务),它主要用于开发Web应用程序,帮助我们减少了用MVC开发Web应用的时间,简化了开发过程,使开发更具模块化、灵活性和重用性。可以说Struts把MVC的设计思想发挥到了极致,尤其在Controller层。
在用Struts开发项目直接接触的有这么几个类:ActionMapping、ActionServlet、ActionForm、Action和ActionForward,这五个类各司其职,使上有老下有小的Controller层接近完美。因Struts是面向对象设计,掌握了这几个类,也就基本掌握了Struts的用法,下面按照这几个类的执行流程举例说明他们在Struts中的具体用法。下图为Struts的一个大致流程图:
这里不考虑各个对象的创建细节,单从工作的流程分析各个类的作用。
ActionServlet
客户端向服务器(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
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取出来。
下一篇继续。。。