Struts1_03_控制器组件

一、Struts控制器的组件
  前端控制器ActionServlet:
        init方法初始化Struts的配置文件(ModuleConfig)。
        接收用户的.do请求交给请求处理器
  请求处理器RequestProcessor:调用process()方法,
创建ActionFrom,执行验证。
        创建Action,调用execute()方法。返回ActionForward。
  业务控制器Action:回调方法execute(),在这个方法中去调用业务逻辑类处理用户的请求


二、分析Struts源代码中的控制器部分
执行流程 
 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()方法的返回值来做跳转。


三、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);
               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="method"
   2. 用户的请求路径URL一定要带上<action>标记parameter属性指定的参数:
          如xx.do?method=xxx
   3. 你写的这个类要继承自DispatchAction,且要有名字跟<action>标记parameter属性指定的参数值相同的方法。其它跟execute()一样。
       public ActionForward xxx(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res){ ...}


阅读更多
个人分类: 课堂笔记
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭