今天在看一个 Struts 代码时,发现 Action 类继承的父类为 DispatchAction ,于是找了找资料研究了下 DispatchAction 类,现总结如下:
DispatchAction 是 Struts1.1 中的一个类,它的父类是 Action ,它的作用就在于将多个功能相似的业务逻辑放在同一个 Action 中实现,各个业务逻辑通过传入不同的参数来决定执行哪个操作方法
通常在 Action 中我们都是通过 execute 方法来处理业务逻辑及页面转向,一个 Action 只能完成一种业务逻辑处理 , 当然我们也可以在页面插入一个隐藏的变量,然后在 Action 的 execute 方法中通过判断这个隐藏变量的值来决定调用哪个方法,也可以达到同一个 Action 来处理多种业务逻辑,可是这样的话想一想肯定会造成页面代码的增加及影响页面代码的可读性 .
看一看 DispatchAction 是如何实现的
比如对一个用户对象来说,存在增加,删除,修改的操作,首先创建一个继承 DispatchAction 的 UserAction 类,
然后将 addUser,delUser,updateUser 这些方法写在这个类里面,代码如下:
package com.why.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import com.why.Constant;
import com.why.struts.form.AddUserForm;
import com.why.struts.form.LoginForm;
public class UserAction extends DispatchAction
{
public ActionForward addUser (ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response) throws Exception
{
// 增加用户业务的逻辑
return mapping.findForward(Constant. FORWARD_ADD );
}
public ActionForward delUser(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response) throws Exception
{
// 删除用户业务的逻辑
return mapping.findForward(Constant. FORWARD_SUCCESS );
}
public ActionForward updateUser(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response) throws Exception
{
// 更新用户业务的逻辑
return mapping.findForward(Constant. FORWARD_SUCCESS );
}
}
如何实现这些不同方法的调用呢 ? 那就是要在 struts-config.xml 文件中更改 action-mapping 的配置,如下:
< action-mappings >
< action
attribute = "addUserForm"
input = "/addUser.jsp"
name = "addUserForm"
parameter="method"
path = "/addUser"
scope = "request"
type="com.why.struts.action.UserAction" >
</ action >
< action
attribute = "delUserForm"
input = "/delUser.jsp"
name = "delUserForm"
parameter="method"
path = "/delUser"
scope = "request"
type="com.why.struts.action.UserAction" />
< action
attribute = "updateUserForm"
input = "/updateUser.jsp"
name = "updateUserForm"
parameter="method"
path = "/updateUser"
scope = "request"
type="com.why.struts.action.UserAction" />
</ action-mappings >
可以看到每个 <action /> 中都增加了 parameter=" " 项,这个值可以随便命名,如上面命名为 metho d ,用来接收页面传来的参数
如下为页面的提交, 注意:对应 <action /> 中的 parameter 值 , 对应 UserAction 类中的方法名
AddUser.jsp
<html:link href="addUser.do?method=addUser">Add User</html:link>
DelUser.jsp
<html:link href="delUser.do?method=delUser">Add User</html:link>
UpdateUser.jsp
<html:link href="updateUser.do?method=updateUser">Add User</html:link>
Struts1的工作流程如下:
1、当web应用启动时开始加载初始化struts的总控制器ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把他们保存在各种配置对象中,例如:Action的映射信息存放在ActionMapping对象中;
2、当用户以HTTP方式发送请求到服务器端时,ActionServlet接受请求;
3、ActionServlet接受请求后查找struts-config.xml文件来确定服务器端是否有用户请求的操作,如果没有,则返回一个用户请求无效的错误信息;
4、当ActionServlet找到用户请求的Action后,首先将用户提交的表单信息打包成一个ActionForm对象;
5、ActionServlet根据struts-config.xml中的配置信息决定是否要需要对表单信息进行验证,如果需要验证则执行ActionForm对象中的validate()方法,如果validate方法返回null或一个不包含ActionMessage的ActionErrors对象, 就表示表单验证成功,继续下一步,如果验证失败则返回;
6、系统生成一个用户请求的Action的实例对象,将ActionForm里的参数传递给它,并且运行它的execute()方法;
7、execute()方法执行结束后会生成一个ActionForward对象,并将它返回给Actions,ActionServlet再根据配置信息将用户请求的结果转发给ActionForward所指向的JSP组件;
8、JSP组件生成动态的网页返回给客户。
一个简单的Struts1工作流程就是这样的,如果要学习Struts1,这个流程一定要熟悉,并且对每一步的实现方式都清楚。