一、Struts控制器的组件
前端控制器 ActionServlet:
init方法初始化Struts的配置文件(ModuleConfig)。
接收用户的.do请求交给请求处理器
请求处理器RequestProcessor:调用process()方法,
创建ActionFrom,封装好请求参数数据,(执行验证)。
创建或查找到Action,调用execute()方法。返回ActionForward。
业务控制器Action:回调方法execute(),在这个方法中去调用业务逻辑类处理用户的请求控制器组件
执行流程
1. struts应用程序在被web容器加载时,自动初始化ActionServlet
2. ActionServlet初始化时,调用init()方法,在init方法中它加载struts配置文件并解析成一个ModuleConfig
3. 用户提交一个http://.../xxx.do请求,ActionServlet截获。调用相应的doGet或doPost,在这两个方法中都调用了一个process()方法,在process方法中要是调用RequestProcessor类的process()方法。
4. RequestProcessor类的process()方法
processPath(req, res) -->/xxx
processMapping(/xxx) --> ModuleConfig找到ActionMapping(代表一个<action>)
processActionForm() -->查找或创建对应的ActionForm对象。
processPopulate() -->把用户提交的请求数据封装到对应的ActionForm对象。
processValidate() -->调用对应ActionForm对象中的validate()方法对表单数据进行验证。 前提<action>标记的validate="true"
//processForward() -->如果<action>标记配置了forward属性。那么它就调用这个方法进行请求转发
processActionCreate() -->创建或找到相应的Action实例。
processActionPerform() -->调用相应Action实例中的execute()回调方法来进行业务操作。
processForwardConfig() -->根据Action实例的execute()方法的返回值来做跳转。
二、分析Struts源代码中的控制器部分
三、ActionServlet:
注意它在web.xml中的配置
修改了一次struts的配置文件,就要重部署一次项目。
四、Action类: public ActionForward execute(ActionMapping mapping,ActionForm form,.)
1.参数: ActionMapping对象-->对应配置文件中的<action>标记。
1) <action>标记的参数:
path: 配置此Action要处理的路径. 以/开头,不带扩展名
type: 指定此Action类的全限定名
name: 指定此Action类对应的ActionForm。 name属性要和<form-bean>标记name值相同
scope: 指定和此Action类对应的ActionForm的存储范围。默认session
//attribute: 指定存放ActionForm的名。request.setAttribute(attribute, actionForm);
//unknown: 为true时,表示这个Action用来处理无效的URL.默认为false
//forward: 指定要转发到的路径。这个action专门用来做请求转发。不能和type一起使用
validate: true表示要验证表单(调用ActionForm中的validate()方法),false不验证.默认true
input: 验证失败时的转发路径。
parameter: 指定Action的配置参数。一般用来跟DispatchAction配合使用。
2)ActionMapping的常用方法:
public ActionForward mapping.findForward("逻辑名");
public ActionForward mapping.getInputForward();
2. 返回值:ActionForward对象 -->代表一个转发路径. 对应<forward>标记
1) <forward>的常用属性:
name: 指定转发路径的逻辑名
path: 指定路径的URL。以/开头
redirect: 为true,表示采用重定向。为false,表示采用请求分派。默认false
2)在Action的execute()方法中用actionMapping.findForward("逻辑名");来获取
3)也可以使用它的构造方法来创建
Forward(String path);
Forward(String name, String path, boolean redirect);
4)如果要在转发路径上添加动态参数,怎么办?
a. ActionForward forward = actionMapping.findForward("逻辑名");
forward.setPath(forward.getPath() +"?参数名=" + 参数值);
return forward;
b. ActionForward forward = new ActionForward("xxx.jsp?参数名" + 参数值);
return forward;
五. DispatchAction类的使用:对于同一组类似的业务操作,使用DispatchAction可以减少Action的数量: 如针对同一个实体的CRUD
1. <action>标记一定要加上parameter="xxx"
2. 用户的请求参数中一定要带上<action>标记parameter属性指定的参数:
如xx.do?xx=xx
3. 你写的Action类要继承自DispatchAction,且要有名字跟<action>标记parameter属性指定的参数值相同的方法。其它跟execute()一样。
六.ForwardAction:只是简单做请求转发。用得少.