注: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类型的数组对象中
数组对象 封装了方法的形参的信息
(2)method = clazz.getMethod(name, types);//将方法封装到method中
5.Object args[] = {mapping, form, request, response};
(3)forward = (ActionForward) method.invoke(this, args);
//this就是调用name方法的对象,也就是UserAction
//args 是一个存放了实参对象的 Object 类型的数组对象
必须造型成ActionForward 类型将其返回