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配置信息如下:
<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>
配置信息里看出,其中中包含有与请求对应的ActionForm、Action、ActionForward、错误处理以及国际化等配置信息,这些都可以通过ActionMapping取出来。
下一篇继续。。。
转正请标明出处