第二节struts1的处理流程及配置文件详解

     通过第一节内容我们了解了struts1的简单处理过程.在处理的过程中我们使用到了struts1中的struts-config.xml配置文件,那么这一小节我们就针对其action配置的属性详细解析Action配置中属性含义及其使用。

 
1、首先我们来简单总结以下struts1的处理流程
    首先:由视图层发出请求,当 ActionServlet 接收到 HTTP 请求后,在 doGet 或 doPost 方法中都会调用process()方法处理请求
    其次:在ActionServlet 的 process() 方法中一旦选择了正确的子应用模块,就会调用RequestProcessor实例的process()方法来处理请求。在ActionServlet调用这个方法时,会把当前的request和response对象传给它
    然后:RequestProcessor实例的process()方法调用ProcessActionCreate()方法,先判断是否在 Action 缓存中存在Action实例,如果不存在,就创建一个Action实例,把它保存在 Action 缓存中
    最后:RequestProcessor实例的process()方法调用Action实例的execute()方法 并返回相应的试图界面
 
2、简单了解struts1的处理流程之后那么我们就来了解一下struts1配置文件中action的常用属性
首先列举action的属性代码如下:
         <action path="URL"
               type="ActionClass"
               name="userForm"
               scope="request"
               attribute="key"
               input="/register.jsp"
               forward="/index.jsp"
               include="/index.jsp"
               unknown="true"
               parameter="test"
               className="mappingclass"
               validate="true">
               <forward name="" path=""></forward>
       </action> 
下面就对其属性解析
    a path : 代表请求的 Action 的名称 , 无需指明后缀 struts1 自动处理
       例如上一节中的/Register 就是从视图中提交的Action请求 此请求有的方式是:
         <form action="${pageContext.request.contextPath}/Register.do" method="post">....</form>
       当其点击此提交时后缀名称为.do,(由于我们在会web.xml配置*.do的处理),所以经过mapping的地址映射,交给ActionServlet按照struts1的处理流程处理提交Action的请求。
 
    b type: 代表请求的的 Action 交给那个 Action 处理 , 注意此类的名称一定是类的全名称 ( 包括包名 )
 
c name :代表的是请求参数封装的 ActionForm 的名称。
备注:此名称与<form-beans><form-bean name=" 名称 Form" type=" Form 类的全名"></form-bean></form-beans>中" 名称 Form"一致,并通过此form-bean中的type来指定封装的ActionForm类。
 
    d scope :代表把 formbean 的参数封装到那个作用域中 , 默认的作用域为 session
    备注:当我们没有指定formbean的作用域时,在type指定的Action类中还可以通过以下代码获取:
          /**  获取 ActionForm 中的对象 并强制造型为 UserForm  此获取方式为通过传递的 ActionForm 参数直接获取 , 开发中就是用此方式  */
        // UserForm userForm = (UserForm) form;
        /**
        *  由于在 Action 的属性配置中的 scope 属性指定了 userForm 的作用域 当采用的是默认值 (session) ,
        *  也可以直接从作用域中获取代码如下:
        */
       UserForm userForm = (UserForm) request.getSession().getAttribute( "userForm" );
      
       System. out
              .println( " 用户名称: "  + userForm.getUsername() +  用户密码: "
                     + userForm.getUserpass() +  "    用户邮箱: "
                     + userForm.getUseremail());
       /** 备注:
由于在开发的过程中为了节省 ActionForm 占用的内存空间 , 我们一般不采用默认值 , 而是采用 scope=”request” 配置 , 因此我们也可以采用一下的方式获取 */
UserForm userForm = (UserForm) request.getAttribute("userForm");
 
   注意:由于在aciton的配置中我们没有配置 attribute="key"  此属性时 , Action 中获取的关键字采用默认的值及 name 的名称 , 当配置了 attribute="key" 此属性是必须通过 "key" 获取 . 如果你不明白看下面的介绍。
 
   E attribute  指定 formbean 存储的 key, 不设默认为 name 属性的值。
    举例:如果我们在 action 的配置中配置了 attribute=”uform” 的话 , 那么我们在 Action 中获取的方式就应该为:
 /**  通过方法参数中传递的 ActionForm 获取 ActionForm 中的对象
并强制造型为 UserForm */
UserForm userForm = (UserForm) form;
/** 由于在 action 的配置中我们指明了 attribute 的属性及属性值 , 因此我们应该采用以下方式获取 */
       UserForm userForm = (UserForm) request.getAttribute( "uform" );
       System. out
              .println( " 用户名称: "  + userForm.getUsername() +  用户密码: "
                     + userForm.getUserpass() +  "    用户邮箱: "
                     + userForm.getUseremail());
  备注:在指明了attribute属性后,我们如果还采用d中介绍方式即直接从作用域通过name的属性值获取的话,会出现javax.servlet.ServletException: java.lang.NullPointerException异常信息.
 
F、 input="/register.jsp"  指定 formbean 的数据是由哪个页面提供的。
说明:提供此属性的目的在于 formbean 校验失败时,程序方便 跳回 formbean 的输入页面 , 通过 struts1 错误信息标签 , 显示校验失败信息。
G forward="/index.jsp" 指定收到请求时,跳转到相应的jsp页面
强调:如果配置了此属性,则action将不再被调用,即接受到此action时,直接调至到index.jsp页面。
H include="/index.jsp"  定收到请求时,进行页面包含
I unknown="true"  如果 action 把该属性设置为 true ,则它可以处理客户机发出的所有无效的 .do 请求,默认值为 false
举例:如果在配置文件中添加如下的 action 配置 ,
<action path="/**" forward="/index.jsp" unknown="true"/>
   当如果在地址栏中发出请求为:
http://localhost:8080/20110105struts1_2/regi.do
   如果在此配置文件中找不到 regi.do的Action就会处理上面配置的action直接跳转到index.jsp页面 (备注:与此action中path名称无关,但必须配置一个path属性).
J parameter="test" 配置 action 参数 , 调用 actioMapping.getParameter 方法可以获得这里配置的参数 ( 后续会详细介绍 )
K className="mappingclass <action> 标签和所有的配置信息使用哪个对象封装,默认值为 ActionMapping 对象。这是 struts1 的作者考虑 , 开发者使用自己开发的 Mapping 类提供的配置 .
L validate="true"  请求参数封装到 formbean 中后,是否让 struts 自动调用 formbean validate 方法进行数据校验。默认 true( 后续会详细介绍 )
除此之外还用一些属性配置 , 我只做了常用属性的介绍 .
3、forward标签
action 配置中 , 还有一些其他的标签配置 , 在上面种我们看到了 <forward name="" path=""></forward> 即在处理完此 action 之后我们可以在 Action 中的 execute 方法中通过此标签的 name 属性获取此 action, 并跳转到相应的 path 地址中去 .
举例:如果在 action 内部我们配置了 forward 标签的代码如下:
<forward name="message" path="/message.jsp"></forward>
  那么我们可以再 Action 返回值中做如下处理:
/**  获取跳转的地址并返回 ActionForward */
        return  mapping.findForward( "message" );
通过以上配置 , 在处理完此 action ,struts1 经过处理后就会跳转到 /message.jsp 视图层 .
 
 

你可能感兴趣的:(第二节struts1的处理流程及配置文件详解)