一、struts1的工作原理
(1) 初始化:struts框架总控制器(ActionServlet)是一个servlet,在web.xml中配置成自动启动的servlet。读取配置文件(struts-config.xml)的配置信息。为不同的struts模块初始 化 相应的ModuleConfig对象
配置web.xml
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<span style="white-space:pre"> </span><param-name>config</param-name>
<span style="white-space:pre"> </span><param-value>/WEB-INF/struts-config.xml</param-value>
<span style="white-space:pre"> </span></init-param>
<span style="white-space:pre"> </span><load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
配置strust-config.xml
<struts-config>
<form-beans>
<form-bean name="usersForm" type="com.hygj.web.form.UsersForm"/>
</form-beans>
<global-forwards>
</global-forwards>
<action-mappings>
<action path="/users" type="com.hygj.web.action.UsersAction" name="usersForm" scope="request" parameter="method">
<forward name="succ" path="/succ.jsp"/>
<forward name="succ" path="/succ.jsp"/>
<forward name="succ" path="/succ.jsp"/>
<forward name="succ" path="/succ.jsp"/>
</action>
</action-mappings>
</struts-config>
(2) 接收请求:用户提交表单或通过URL向WEB服务器提交请求,请求的数据用HTTP协议传给web服务器。
http://127.0.0.1:8080/Test01/loginAction.do?operAtt=login
(3) form填充:struts的总控制器ActionServlet在用户提交请求时将数据放到对应的form对象中的成员变量中。如果对应的Action且这个Action有一个相应的ActionForm, ActionForm被实例化并用HTTP请求的数据填充其属性,并且保存在ServletContext中,(或request或者session中),这样他就可以被其他的Action对象或者jsp页 面 调用。
(4) 派发请求:控制器根据配置信息对象ActionConfig将请求派发到具体的Action,对应的formBean一并传给这个Action中的excute()方法。
(5) 返回响应:Action将业务处理的不同结果返回一个目标响应对象给总控制器。总控制器根据Action处理业务返回的目标响应对象,找到对应的资源对象,将结果展现给用户。
二、struts1的核心组件
(1) ActionServlet
1、是struts方法的唯一入口
2、他继承自HttpServlet,只存在一个实例
3、在web.xml中配置
strust框架通过ActionServlet来截取所有的请求然后进行转发,ActionServlet继承了HttpServlet所以它本身也是一个Servlet,通过他的配置文件可以看出它之所以可以拦截所有的请求是因为它的映射方式配置了*.do,只要是以.do 结尾请求都会通过ActionServlet来截取,然后再去struts的配置文件中去匹配对应的行动方案。当然如果你喜欢你也可以配置为.a.,.b这个可以随便更改。所以虽然我们不经常看到ActionServlet,它只在we.xml中露了一次脸,但是它绝对是struts最核心的一个组件。
(2) Action
1、他是继承Action,复写父类的一个public 返回值为ActionForward 的execute 方法。
2、Action 它并不是一个Servlet,但是Struts框架只会创建一个Action实例,因次它是非线程安全的组件。
3、它是我们业务逻辑处理的关键类。
其实在实际业务中,我们更习惯继承DispathAction,因为DispathAction允许多次重写exeute方法,可以处理多个请求,只要你在struts配置文件中的action配置,多配一个paramenter属性就可以了,然后通过这个属性它可以找到对应的方法名。其实DispathAction是Action的一个子类,他也是继承了Action,只不过他再一次对Action做了一个封装。请求的方式为“action标识.do?paramenter属性名=Action中的方法名” 。
(3) ActionMaping
- 它是一个配置对象,在struts-config.xml中配置
- 一个ActionMaping实例就对应一对<action>
- <action>标签的写法:
<action path="/行动方案的标识" type="由哪一个Action来处理请求(类路径)" scope="request/session" name="formBean的内部名"
attribute="formBean的共享名" validate="true/false" input="/验证错误返回的页面" <forward name= "内部转发名"path="/转发路径"
rediret="true/false" /> </action>
- 如果有input必定有validate,如果有validate,必定有name。
所谓mping其实就是映射,ActionMaping就是对你系统的中的Action类做一个映射,和servlet在系统中的映射是一个道理。通过它可以让你的系统找到你的Action实例。比方说你的请求是XX.do那么XX就是你Action映射后的名字,俗称“行动方案标识”。在Action类中可以通过ActionMaping的实例对象获取配置文件中<action-maping>中的相关属性。
(4) ActionForm
4.1、相对动态ActionFrom而言的静态ActionFrom
- 它是一个javabean,继承ActionForm。
- 属性名与请求中的key一致,同时提供get,set方法。
- 创建之后需要在struts-config.xml中配置。
- 配置方式:
<form-beans> <form-bean name="formBean的共享名" type="ActionForm实体类的全路径" /> </form-beans> |
4.2 动态ActionForm (DynaActionForm)
- 它是struts内置的ActionForm,不需要认为的创建实体类,只需要在struts-config.xml进行配置
- 配置方法
<form-bean name="formBean的共享名" type="org.apache.struts.action. DynaActionForm"> <form-property name="属性名(和页面表单中的对象的name值一样)" type="属性的数据类型(java.lang.String)"/> </form-bean> |
在struts中有个ActionForm的概念,它可以对你页面中是数据做自动收集,只要你写一包涵页面数据属性的一个javaBean提供get set 方法并继承ActionForm即可,它为什么可以做数据的自动收集呢,其实在ActionForm中他对request.getParamenter()方法做了封装。只要你在你的Action中配置了ActionForm,在做页面数据提交的时候,它就会去匹配你页面中的属性,有相同的属性它就通过request.getParamenter()方法来获取数据并set给你的ActionForm,这也就是为什么在你写ActionForm的时候需要将其属性名和你页面中的组件属性name值一致。其实为了ActionForm能做自动封装数据。ActionForm在收集完数据之后会返回给你的Action,这时你就可以在你的Action中通过ActionForm来获取你的页面值,而不需要通过request.getParamenter()方法。另外如果你觉得自己去写一个ActionForm比较麻烦,struts还提供了一个动态ActionForm,所谓动态ActionForm其实就是struts本身提过的一个写好的ActionForm,叫DynaActionForm,他也是ActionForm的子类,只不过他不需要你创建这样的一个ActionForm类,只需要你在Struts的配置文件中配置即可,具体配置可参考如下:
<form-bean name="dynaUserAcionForm" type="org.apache.struts.action. DynaActionForm"> <form-property name="userNmae" type="java.lang.String"/> <form-property name="password" type="java.lang.String"/> </form-bean> </form-beans> |
同样,在配置其form-property属性的时候name值必须和页面组件元素的name值一致。使用动态ActionForm的好处就是减少了ActionForm实体类的创建,只需配置即可,取值方式和普通ActionForm是一致的。
(5) ActionForward
- 它是一个配置对象,在struts-config.xml中配置。
- 每个ActionForward实例都对应一个<forward>。
- 定义在<action> 中称为局部转发,只能由一个行动方案适用。
- 定义在<global-forward>中的称为全局转发,可以在所有的行动方案中使用。
ActionForward主要是用于转移控制权,说白了就是做跳转,为什么它可以做跳转?我们可以先看一下它在strust中是如何配置的:
<forward name="succ" path="/succ.jsp" redirect="false"/> |
我们配置一个name值,一个path值,它就可以做跳转,同时他还有一个redirect重定向属性。这使我想到了,我们之前在 servlet中的网页重定向方法。其实在ActionForward就是封装了两种页面跳转方式,分别是网页重定向:response.sendRedirect(“页面路径”) 和请求转发:request.getRequestDispatcher("页面路径").forward(request,response)这个两个方法,如果你redirect="false",他就会采用请求转发的方式,反之采用网页重定向。如果我们不再配置文件中配置< forward >是不是就不能跳转了呢,其实你完全可以不用配置,你可以在Action里面创建一个ActionForward实例对象,然后通过实例对象一样可以做跳转,如: new ActionForward("/succ.jsp",false);其实不论是ActionForward还是ActionForm都是对我们以前servlet中的方法做了封装,使你使用起来更加的简便。