zoukankan      html  css  js  c++  java
  • Struts2之配置文件中Action的详细配置

    在Struts2之配置一文中,我们知道一个struts配置文件可以分为三部分:常量配置    包含其他配置文件的配置    Action配置  。

    这其中 常量配置  和 包含其他配置文件的配置  二者的变化不多  相对来说比较简单,而Action的配置 相对来说比较复杂。

    当我们写好了一个Action类之后  我们就要想着该Action类为哪个URL的请求提供服务,这就需要配置 。

    1.包和命名空间   

    Struts2利用包(<package>)来组织Action,将Action配置(<Action >)放在包定义之下。

    也就是总体是这样:

    <package  >
         <action  >

         </action>
    </package>

    其中包的定义(<package>)有如下属性可以指定:

    name :   必需属性    该包的名称

    extends  :可选属性  该属性指定该包继承了哪个包  。继承其他包,可以继承其他包中的Action定义,拦截器定义。

    namespace: 可选属性  该属性指定指定该包的命名空间

    abstract:   可选属性   指定该包是不是抽象包。抽象包中不能有Action定义  。

    其中比较难理解的是命名空间(namespace)属性 。

    假设某个应用叫  bookshop 该应用中Action配置如下 :

    <package  name="book"    namespace="/book">
        <action  name="getBook"  class="org.lingtong.web.action.BookAction"  >
               <result   name="myBook">/myBook.jsp</result>

        </action>

    </package> 

    其中的Action可以服务的请求是   http://localhost:8080/bookshop/book/getBook.action      即  应用名 + 命名空间名  +  Aciton名.action

    同一个命名空间(同一个包下)不允许出现具有相同name的Action,否则就会造成 一个请求链接  对应多个Action 的混乱状况。

    不同命名空间(不同包下)  允许出现和和另外一个包中具有相同name的Action   ,  因为请求链接 是由  应用名 ,命名空间名 ,Action名三者拼接而成的。

    这里我们也应该知道如何划分一个包:根据命名空间

    如:这里有三个Action类 :

    BooKAction类       它服务的  请求地址是  http://localhost:8080/bookshop/book/getBook.action

    CheckBookAction类      它服务的  请求地址是 http://localhost:8080/bookshop/book /checckBook.action

    AllBookAction类           它服务的  请求地址是 http://localhost:8080/book/allBookAction.action

    它们三个Action应该配置在同一个命名空间(同一个包下),即namespace="/book"的包下     ,因为三者的请求链接的命名空间  均是book

    如果一个包(<package>)没有配置namespace属性   那么这个包具有默认命名空间  

      <package  name="book" >

             <action  name="getBook"  class="org.lingtong.web.action.BookAction">

            </action>
      </package>

      意味BooKAction可以处理任何请求的Action名是  getBook.action的请求        (bookshop是应用名)

      http://localhost:8080/bookshop/getBook.action         ---没有命名空间的请求链接

      http://localhost:8080/bookshop/book/getBook.action   ---命名空间是/book的  请求链接 

      http://localhost:8080/bookshop/mybook/getBook.action  ----命名空间是/mybook 的请求链接

      http://localhost:8080/bookshop/mybook/allbook/getBook.action   ----命名空间是/mybook/allbook 的请求链接

            

    如果一个包(<package>)如果配置了namespace="/"  那么这个包具有的是根命名空间    

    <package  name="book"   namespace="/" >

             <action  name="getBook"  class="org.lingtong.web.action.BookAction">

            </action>  

    </package>

    意味着BookAction类   只能处理这一种 (其中bookshop是应用名)   http://localhost:8080/bookshop/getBook.action         ---没有命名空间的请求链接

    这里综合看一个例子 

    假设有这样是一个 请求链接   http://localhost:8080/bookshop/myBook/allBook/getAllBook.action 

    struts的配置文件片段 

    <package  name="book" >                                                                         ----1号    具有默认命名空间的包

             <action  name="getBook"  class="org.lingtong.web.action.BookAction">

            </action>  

    </package>

    <package  name="book" namespace="/">                                               ------2号    具有根命名空间的包

             <action  name="getBook"  class="org.lingtong.web.action.BookAction">

            </action>  

      </package>

     <package  name="book"  namespace="/myBook/allBook">                     ------3号     具有/myBook/allBook命名空间的包

             <action  name="getBook"  class="org.lingtong.web.action.BookAction">

            </action>

      </package>

     <package  name="book"  namespace="/myBook">                                -------4号   具有/myBook 命名空间的包  

             <action  name="getBook"  class="org.lingtong.web.action.BookAction">

            </action>

      </package>

    流程:

    首先系统自动分析出  请求链接中的命名空间是 /myBook/allBook  (去除应用名 和 Action名.action 之后的 字符串全是命名空间名)      直接在命名空间是/myBook/allBook的2号包中找  Action名是getBook的Action  , 如果找到了直接服务   ,如果没有找到  就去 具有默认命名空间的1号包 中找Action名 是getBook的Action  ,如果找到了  直接服务  ,没找到 ,到此为止 就会报错 。

    此处注意  找完/myBook/allBook命名空间的包之后 如果没找到 ,并不会到/myBook命名空间的4号包去找 。“命名空间只有一个级别,要么全匹配 ,要么不匹配,去默认命名空间的包中找 ,不存在部分匹配的情况”。

    2.<Action>元素的配置  

      <Action>有三个属性

       name属性        --------必需属性    Action 名  对应于 请求链接中的  xxxx.action

       class属性         -------可选属性   对应的Action类    如果不写  表示默认使用ActionSupport类来处理请求

       method属性     --------可选属性   表示使用Action类的哪个方法来处理请求   如果不写  表示默认用execute()方法来处理请求

    注意点:一般情况下name属性中没有“/”,如果希望name属性中可以出现“/”,可以通过常量配置struts.enable.SlashesInActionNames的常量值为true.

               不要在name属性中使用“.”或“-”,否则会引发一些未知异常。

    关于动态方法调用与method属性的设置:

      我们知道一个Action类,我们默认会提供一个execute()方法,但是我们还可以在Action类中定义其他的方法,通过为 请求链接指定调用的方法 和在Action元素配置中设置method属性来 ,进行动态方法调用。

    如:

     请求链接  :http://localhost:8080/bookshop/myBook/allBook/getBook!getBookByName       规则 “actionName!methodName”

    Action配置 :

    <aciton  name="getBook" class="org.lingtong.web.action.BookAction"  method="getBookByName">

    </action>

    Action类: 提供 getBookByName方法

    使用动态方法调用前必须通过常量设置Struts2允许使用动态方法调用     设置struts.enable.DynamicMethodInvocation 常量的值为 true。

    3.配置默认Action  

      当用户请求在struts.xml文件中找不到对应的Action配置时,我们可以指定一个Action来处理这些找不到Action的用户请求   

    在具有默认命名空间的包(package)之下,配置如下:

    <default-action-ref  name="defaultAction" />

    <action name="defaultAction"  class="org.org.lingtong.web.action.DefaultAction">             //找不到对应Action配置的请求,都交给DefaultAction类处理

    </action>

        

  • 相关阅读:
    CentOS(RedHat) 6.2 Samba share权限拒绝访问
    Android NDK调试C++源码(转)
    linux du命令: 显示文件、目录大小
    网络游戏的同步
    游戏开发辅助库
    Unity3D 200个插件免费分享
    C#UDP同步实例
    C#UDP(接收和发送源码)源码完整
    C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)
    内置函数及匿名函数
  • 原文地址:https://www.cnblogs.com/wangliyue/p/4117271.html
Copyright © 2011-2022 走看看