原理概述:
1、服务端接受到客户端请求,交由actionServlet处理,会把客户端的表单数据封装到actionForm里面
2、actionServlet会根据web.xml里面的配置去匹配拦截路径,一般都是拦截所有的.do,到指定的配置文件struts-config.xml里面查找对应的action对象
3、主要有几个属性,name对应封装的actionform,input匹配拦截的路径和方法,type匹配action的实现类
4、action对象处理完业务逻辑,会返回一个actionFoward对象给actionServlet处理
5、actionServlet根据配置文件里面的forward标签,跳转到具体页面,给客户端
缺点:
1、因为forward都是返回到具体的jsp页面,每一个forward对应配置文件的一个forward标签,每一次改动配置文件都要重启Tomcat
2、 struts1里的action是单例模式的,供多个请求共享,所以不是线程安全的。
解释:
(1)、看过源码,请求到达ActionServlet的doGet或doPost方法,最终由processActionCreate方法去返回一个具体的实例
(2)、根据类名去map里面匹配action,存在则返回,不存在则创建,使用了synchronized关键字,action用到的所有的资源都必需统一同步
解决方法:使用局部变量,不使用成员变量
详解:
1、服务器接收到客户浏览器请求后,使用ActionForm自动填充客户送来的表单数据到ActionForm Bean对象中,在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>3</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>3</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
ActionForm 的实现非常简单,该类只是一个普通的JavaBean,只要为每个属性提供对应的setter 和getter 方法即可,在web.xml中每个ActionForm 对应一个form-bean 元素
<!-- 用于定义所有的ActionForm --> <form-beans> <!-- 定义ActionForm,至少指定两个属性: name , type--> <form-bean name="loginForm" type="lee.LoginForm" /> </form-beans>
2、拦截所有.do请求,读取struts_config.xml中的配置信息
<action attribute="addressMapForm" input="/addressMapForward.do?operation=add" name="addressMapForm" parameter="operation" path="/addressMap" validate="true" scope="request" type="com.netmanager.struts.action.AddressMapAction"/>
3、将请求分发给相应的Action对象处理
public class AddressMapAction extends DispatchActionSupport implements BaseAction { public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { …… return mapping.findForward("addressmaplist"); } }
4、并返回ActionForward对象给ActionSerlvet对象;根据ActionForward对象的信息(目标页面),ActionServlet再次将Http请求导航到目标页面,并发送到客户端
<forward name="addressmaplist" path="/WEB-INF/page/addressmap/addressMap.jsp"/>