转载:

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

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

者/xxx/yyy/index.action

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

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

  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的:

  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/path3的package,如果存在这个package,则在

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

个package则转步骤3;

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

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

则转步骤4;

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

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

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

到,页面提示找不到action。

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

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

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

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

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

struts的namespace理解的更多相关文章

  1. 谈谈你对 Struts 2 的理解

    谈谈你对Struts的理解. struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是ActionServlet的子 ...

  2. 使用Struts 拦截namespace进行权限控制

    有时候我需要在几个包下都需要进行同一个权限控制.如在购物网站中,我们需要进入个人中心.下订单.评价商品等等都需要进行登录权限控制,但是这几个模块并不是位于同一个package下.Struts提供的拦截 ...

  3. 对Java框架spring、hibernate、Struts的粗浅理解

    对 Struts 的理解:1. struts 是一个按 MVC 模式设计的 Web 层框架,其实它就是一个大大的 servlet,这个Servlet 名为 ActionServlet,或是 Actio ...

  4. django中app_name以及namespace理解

    在写django的时候,html中反向解析经常会用到app_name 但有时候又是namespace,具体的区别如下: 大部分情况 这两者有其一就可以了. 并且两者(可以简化理解)无区别 只要一种情况 ...

  5. Struts ActionForm简单理解

    要想明确struts的控制流程以及它核心API的实现原理(比方 Action/DispatchAction/ActionForm的实现原理),玩转struts1.2的关键就是可以玩转 ActionFo ...

  6. 【Web】Struts之namespace

    ZZ:struts2学习:配置篇之namespace 在struts1中是没有命名空间这个概念的,通过命名空间我们可以将所有的action配置划分为一个个逻辑单元,每个单元都有它自己的标识前缀.命名控 ...

  7. Struts, Namespace用法

    最近在用SSH框架做一个项目,在使用Struts 的namespace时遇到不少问题,现在就对struts namespace 做一个简单的介绍吧.(本文从项目结构展开叙述) (第1次写博客, 写的不 ...

  8. struts的package的name与namespace

    <struts> <constant name="struts.devMode" value="true"></constant& ...

  9. 【SSH 基金会】SSH框架--struts进一步的详细解释(两)

    继上篇博客 既然我们知道了不使用struts给我们带来这么多弊端,那么以下我们来看看struts是怎样封装的.怎么解决我们出现的问题的? 先来说一下struts的基本流程,帮助大家理解以下的代码: S ...

随机推荐

  1. python循环综合运用

    循环很重要,计算机很蠢,唯一的优势就是按照指令不停的执行,所以决定在说一下. break语句,用在循环体中,迫使循环立即终止,即跳出所在循环体,继续执行循环体后面的语句. sum=0 i=1 whil ...

  2. [leetcode-921-Minimum Add to Make Parentheses Valid]

    Given a string S of '(' and ')' parentheses, we add the minimum number of parentheses ( '(' or ')', ...

  3. 团队冲刺——Four

    今日计划: 司宇航:网页生成桌面图标.如何将web项目上线部署到公网.测试与优化其他功能. 季方 :处理爬虫获取的数据. 马佳慧:研究css模板. 王金萱:登录注册界面. 遇到的问题:季方:爬虫获取的 ...

  4. struts2返回List json

    利用struts2-json-plugin 之前一直输出null.... 按网上的配也不行 后来不知道怎么突然可以了 赶紧记录一下 private List<Shop> moneyshop ...

  5. 作业6 团队项目之需求 (NABCD模型)

     N A B C D模型分析 WorkGroup:NewApps 组员:欧其锋(201306114305  http://www.cnblogs.com/ouqifeng/) 吕日荣(20130611 ...

  6. 防止DDoS攻击,每5分钟监控本机的web服务,将目前已经建立连接的IP计算出来,且实现top5。再此基础上,将并发连接超过50的IP禁止访问web服务

    netstat -lntupa | grep ":80" | grep ESTABLISHED | awk '{print $5}' | awk -F: '{print $1}' ...

  7. 结队第二次作业——WordCount进阶需求

    结队第二次作业--WordCount进阶需求 博客地址 051601135 岳冠宇 博客地址 051604103 陈思孝 博客地址 Github地址 具体分工 队友实现了爬虫功能,我实现了wordco ...

  8. beta 发布的相关评论

    1. 礼物挑选小工具 飞天小女警      这个项目的创意独具匠心,贴近实际,令人耳目一新,网站的页面也是玫红色的,配色让人感到很温馨,对礼物的筛选方式很有趣,使用的记录特殊日子的方法来提醒自己挑选礼 ...

  9. Python入门:学会创建并调用函数

    这是关于Python的第4篇文章,主要介绍下如何创建并调用函数. print():是打印放入对象的函数 len():是返回对象长度的函数 input():是让用户输入对象的函数 ... 简单来说,函数 ...

  10. centos6.7 安装JDK

      1.卸载JDK 查看系统是否已安装JDK.一般的linux都默认使用了开源的openJDK.显示JDK版本信息,已经安装JDK,否则没有安装.命令行: [root@localhost ~]# ja ...