Action和DispathAction

注:command:请求当中参数值为方法名的参数名

DispathAction和Action的不同点:
1、DispathAction没有execute()方法,它是用方法来区分不同的请求,且方法的参数和返回值必须和execute()方法一模一样
2、DispathAction在配置文件里增加了parameter属性
3、发请求时通过参数传递方法名

1、作用:用一个action类处理所有请求,减少配置量
2、使用DispathAction的前提:它是用方法来区分不同的请求,且方法的参数和返回值必须和execute()方法一模一样
3、action标签中的配置(command=“调用的方法名” 注意:不能是execute或perform)

   <action path="/user/usermaint
            type="com.bjsxt.drp.web.usermgr.actions.UserAction"
            name="userForm"
           scope="request"
          parameter="command”
    >
    <forward name="add_success" path="/user/usermaint.do?command=list" redirect="true"/>
</action>

4、DispathAction中的unspecified方法的含义:在 DispathAction中如不存在请求的方法,则执行该方法

创建一个类 UserAction extends DispatchAction
对UserAction 的要求:
1.不能轻易复写父类的excute方法(若要复写,在需要完成请求验证拦截时可以复写,以此替代拦截器Filter)
2.类里面所有的方法的返回值类型和参数签名必须和 excute() 一致
eg:public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)

执行过程:
通过action提交给struts,通过截取的协议头/usermaint
找到对应的action-mappings 通过name找到ActionForm,创建表单bean 然后通过action的type找到Action(UserAction extends DispatchAction)调用excute() 但是由于UserAction 没有复写父类DispatchAction 的excute() ,所以调用DispatchAction的excute();将请求根据commend把父类的请求映射到UserAciton 的对应的方法上去,

在DispatchAction的excute()的内部源码
1.String parameter = mapping.getParameter();
在请求对应的配置信息里拿到 parameter对应的存放方法名参数的参数名,就是拿到command,它将作为从请求里拿到方法参数值的参数名

2.`String name = getMethodName(mapping, form, request, response, parameter);
拿到commend的参数名 del 也就是方法名(方法名不允许excute 或 perform ,会和源码冲突)

3.return dispatchMethod(mapping, form, request, response, name);
//分发方法 进入 ActionForward dispatchMethod(….)

4.判断name是否null,是就调用 this.unspecified();
不是null就通过方法反射调用此方法,把方法封装到method,通过method 调用,
在DispatchAction如何通过方法反射调用 需要的方法
(1)首先找到调用DispatchAction的del这个方法的对象的反射对象,也就是

Class clazz = this.getClass();

再然后

protected Class[] types ={ActionMapping.class,ActionForm.class,
HttpServletRequest.class,HttpServletResponse.class};

将方法形参类型的反射对象 放在一个class类型的数组对象中
数组对象 封装了方法的形参的信息

2method = clazz.getMethod(name, types);//将方法封装到method中

5.Object args[] = {mapping, form, request, response};
(3forward = (ActionForward) method.invoke(this, args);

//this就是调用name方法的对象,也就是UserAction
//args 是一个存放了实参对象的 Object 类型的数组对象
必须造型成ActionForward 类型将其返回

猜你喜欢

转载自blog.csdn.net/Pluto__lxh/article/details/82119858