zoukankan      html  css  js  c++  java
  • struts的namespace理解

    转载:

    namespace决定了action的访问路径,默认为"",可以接受所有路径的action

     namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action,/xxx/index.action,或

    者/xxx/yyy/index.action

    假设我的struts.xml配置文件中一个action配置如下:

    下面两个例子可以分析:没有设置namespace的

    [html] view plain copy
     
    1. <package name="/user" extends="struts-default">  
    2.         <action name="testMap" class="com.sh.action.MapAction" method="testMap">  
    3.             <result name="success">/index.jsp</result>          
    4.         </action>  
    5.     </package>  


    那么我直接可以通过http://localhost:8089/struts2/testMap.action进行访问,这个的访问过程是这样的,在没有定义namespace的时候,由于在struts中,我们的package继承了struts-default,也就拥有了struts的根空间,在这里我们没有指明namespace属性,但其实此时我们的namespace属性相当于namespace="",或者namespace="/"。由于我们没有指定命名空间,struts直接在根空间中寻找name=testMap的action,根空间有这个action,所以我们能访问。

    假设配置文件中action配置中加入了namespace属性值,如下:设置了namespace的:

    [html] view plain copy
     
    1. <package name="/user" extends="struts-default" namespace="/test">  
    2.     <action name="testMap" class="com.sh.action.MapAction" method="testMap">  
    3.         <result name="success">/index.jsp</result>        
    4.     </action>  
    5.    </package>  

    那么我们必须通过http://localhost:8089/struts2/test/testMap.action这个路径进行访问,如果再用http://localhost:8089/struts2/a/testMap.action或其他路径,就会出现异常。因为此时struts首先在命名空间为test中寻找,如果没有找到,会继续在根空间寻找,而现在根空间已经没有名为demo的action了。

    通俗一点:namespace就是指在浏览器输入网址的时候从这里面寻找对应的action

    每个Action对应的jsp页面的路径是配置好了的:

    即浏览器的访问:(服务器的名称端口)、(action的名字)

    因为每个action都包含了页面的路径,所以可以访问到每个jsp页面。

    所以访问一个页面的过程就是这个流程

    完整正确的工程目录应该是:http://localhost:8080/工程名/文件的完整目录(包括文件夹)例:若目标jsp文件在webContent目录下的Get文件夹下,则正确路径为:htttp://localhost:8080/ship/Get/login.jsp

    因为这里定义了访问的名称为.action

    注意:这里访问action的路径和jsp页面中访问路径的区别。

     

    struts1中是没有命名空间这个概念的,通过命名空间我们可以将所有的action配置划分为一个个逻辑单元,每个单元都有它自己的标识前缀。命名控件可以避免action命名的冲突。每个命名空间下有可以有一个叫做”help”action,并且有着各自不同的实现,当然在同一个命名空间下最好是不要出现两个名字一样的action。当命名空间的前缀出现在浏览器的URI中时,标签会意识到命名空间,因此我们不必将命名空间嵌套在表单和链接中。

    默认的命名空间是空字符串””,也就是不设置namespace属性时候的命名空间。我们在匹配一个action的时候,先到它指定的命名空间中去找,如果没有再到这个默认的命名空间中去找。Struts2还支持根命名空间(“/”),当一个request直接请求context path下面的资源时,struts2会首先到跟命名空间下去寻找匹配的action,例如请求是http://server/myapp/bar.action,那么我们首先会去”/”命名空间下去寻找这个action,下面给给出了一个namespace的样本:

    <package name="default">
        <action name="foo" class="mypackage.simpleAction>
            <result name="success" type="dispatcher">greeting.jsp</result>
        </action>
        <action name="bar" class="mypackage.simpleAction">
            <result name="success" type="dispatcher">bar1.jsp</result>
        </action>
    </package>
    <package name="mypackage1" namespace="/">
        <action name="moo" class="mypackage.simpleAction">
            <result name="success" type="dispatcher">moo.jsp</result>
        </action>
    </package>
    <package name="mypackage2" namespace="/barspace">
        <action name="bar" class="mypackage.simpleAction">
            <result name="success" type="dispatcher">bar2.jsp</result>
        </action>
    </package>

    关于如何从URI映射到一个action中我做了一些测试,发现可以遵循如下的一条规则:

    1.获得请求路径的URI,例如url是:http://server/myapp/path1/path2/path3/test.action

    2.首先寻找namespace/path1/path2/path3package,如果存在这个package,则在  

       这个package中寻找名字为testaction,若找到则执行,否则报错;如果不存在这

       package则转步骤3

    3.寻找namespace/path1/path2package,如果存在这个package,则在这个package  

       中寻找名字为testaction,若找到则执行,否则报错;如果不存在这个package

       则转步骤4

    4.寻找namespace/path1package,如果存在这个package,则在这个package中寻

       找名字为testaction,若找到则执行,否则报错;如果仍然不存在这个package

       就去namaspace为空字符串的package下面去找名字为testaction,如果还是找不

       到,页面提示找不到action

    这里有几点特殊的情况要说明一下,如下所示:

    1.如果匹配到了多个package,比如上述流程中有多个namespace/path1/path2/path3

    package,此时按照package出现的顺序从后向前的顺序查找action,直至找完为止。

    2.如果在一个package中有多个name属性相同的action,那么执行追有一个action。比如上述流程中,有一个namespace/path1/path2/path3package,它里面含有多个名字为testaction,那么选择最后一个执行。

        上面这几点是我通过多次测试总结出来的,不知道是否概括到了所有可能的情况,纰漏之处,还请指正。

  • 相关阅读:
    ubuntu下使用sudo 出现unable to resolve host 解决方法
    Ubuntu下使用mysqli-connect连接mysql时报错:ERROR 1698 (28000): Access denied for user 'root'@'localhost'
    Ubuntu下安装LNMP之独立添加php扩展模块
    Ubuntu下安装LNMP之Mysql的安装及卸载
    Ubuntu下安装LNMP之php7的安装并配置Nginx支持php及卸载php
    Ubuntu使用vim编辑器时出现上下左右键变成ABCD
    Ubuntu下安装LNMP之nginx的卸载
    Ubuntu下使用find / -name aaa* 提示“find: 路径必须在表达式之前: XXXX”
    Ubuntu下安装LNMP之nginx的安装
    ubuntu使用su切换root用户提示“认证失败”
  • 原文地址:https://www.cnblogs.com/fengli9998/p/6553339.html
Copyright © 2011-2022 走看看