struts2提供了一个命名空间的概念,可以通过package的namespace属性来设置,使用它可以避免action的名字冲突,同时也可以在逻辑上给action分类。关于namesapce的很多信息,可以参考strtus的官方文档,地址是:http://struts.apache.org/2.2.3.1/docs/namespace-configuration.html。
个人觉得,这个里面还是很多信息没有表达清楚。例如该文档最后有一段话如下:
Namespace are not hierarchical like a file system path. There is one namespace level. For example if the URL /barspace/myspace/bar.action is requested, the framework will first look for namespace /barspace/myspace. If the action does not exist at /barspace/myspace, the search will immediately fall back to the default namespace "". The framework will not parse the namespace into a series of "folders". In the Namespace Example, the bar action in the default namespace would be selected.
大概意思就是说,如果在某个命令空间下没有找到对应的action,然后就直接去缺省的命名空间下。但事实真的如此吗?
通过一些测试,发现似乎遵循如下的规则:
1.假设请求路径的URI,例如url是:http://www.netingcn.com/path1/path2/test.do
2.首先寻找namespace为/path1/path2的package,如果存在这个package,则在这个package中寻找名字为test的action,若找到则执行,否则转步骤5;如果不存在这个package则转步骤3。
3.寻找namespace为/path1的package,如果存在这个package,则在这个package中寻找名字为test的action,若找到则执行,否则转步骤5;如果不存在这个package则转步骤4。
4. 寻找namespace为/的package,如果存在这个package,则在这个package中寻找名字为test的action,若找到则执行,转步骤5;如果不存在转步骤5。
5. 如果存在缺省的命名空间,就在该package下查找名字为test的action,若找到则执行,否则页面提示找不到action;否则提示面提示找不到action。
上述一个很重要的地方就是一旦找到对应的namespace的package就停止向上级路径查找了,另外缺省命名空间(package中没有指明namespace属性或namespace属性值为空)的package的可以不存在。
以前一直比较困惑的是,当访问http://www.netingcn.com/test.do成功,那类似http://www.netingcn.com/x/test.do,http://www.netingcn.com/x/y/test.do也能正常访问,而且执行的同一个action。而上述的试验结果可以很好的解释这个疑惑了。但是个人觉得这样的设计不是太好,决定去源码看个究竟,在org.apache.struts2.dispatcher.mapper.DefaultActionMapper找到关于如何在namespace中查找action的操作,有如下代码:
protected void parseNameAndNamespace(String uri, ActionMapping mapping, ConfigurationManager configManager) { String namespace, name; int lastSlash = uri.lastIndexOf("/"); if (lastSlash == -1) { namespace = ""; name = uri; } else if (lastSlash == 0) { // ww-1046, assume it is the root namespace, it will fallback to // default // namespace anyway if not found in root namespace. namespace = "/"; name = uri.substring(lastSlash + 1); } else if (alwaysSelectFullNamespace) { // Simply select the namespace as everything before the last slash namespace = uri.substring(0, lastSlash); name = uri.substring(lastSlash + 1); } else {
注意到其中alwaysSelectFullNamespace这个信息,原来它属于struts.properties常用配置的一项,其作用是控制是否一直在最后一个slash之前的任何位置选定namespace。由于struts2默认是设置是false,所以导致按照上述试验结果成功,当把alwaysSelectFullNamespace在strtus.properties中设置为true时,此时struts2查找action就不会递归路径去查找package,而是直接找路径对应的package,如果没有找到就去默认命名空间下查找,这就是官方文档中所采用的说法。
个人建议把alwaysSelectFullNamespace设置为true,明确指定action在属于命名空间的package中,不会操作url路径随便输入的问题,同时执行效率也会略有提高。
相关推荐
Struts2是一个强大的Java web应用程序框架,它基于Model-View-Controller...通过深入学习和实践`Struts2_0200_Namespace`中的代码,初学者可以更好地理解如何在实际项目中运用Namespace来构建清晰、可维护的Web应用。
深入Struts2框架,我们需要了解...总结来说,深入理解Struts2需要掌握其配置文件结构、Action的定义与执行、命名空间的作用、结果映射以及数据绑定和异常处理机制。这些知识对于构建高效、健壮的Java web应用至关重要。
深入理解Struts2的核心配置文件——`struts.xml`,对于掌握Struts2框架具有重要意义。`struts.xml`不仅负责定义框架的行为,还控制着框架如何与应用交互,是Struts2框架的灵魂所在。 #### 二、包配置详解 包配置是...
在提供的“struts2 demo”压缩包中,你可以找到这些概念的具体实现,包括Action类、视图页面、配置文件等,通过分析和运行这些示例,你可以深入理解Struts2的工作原理和用法。这个压缩包对于初学者来说是一个很好的...
通过了解和掌握Struts2的模块化设计,开发者可以更高效地组织和管理代码,降低项目的复杂性,并提高团队协作效率。此外,模块化的应用也有利于后期的维护和升级,降低了软件的生命周期成本。在实际项目中,合理地...
在深入理解Struts2配置时,我们首先需要了解其核心组件,包括Action和拦截器(Interceptor)。Action是业务逻辑的载体,而拦截器则是执行特定任务的中间层,比如日志记录、权限验证等。Struts2通过包(package)来...
深入理解Struts2的核心概念和配置对于开发高效、可维护的web应用至关重要。 1. **配置文件**:Struts2的配置主要集中在`struts.xml`文件中,这是整个框架的配置中心。它定义了Action、拦截器和其他关键元素,使得...
跟随作者一道深入Struts 2,聆听大量来之不易的经验之谈,你对Struts 2开发框架的理解和应用水平都将更上一层楼。本书适合Java Web 程序员阅读和参考 第1章 Model 2应用程序 1 1.1 Model 2概览 1 1.2 带servlet...
在深入讲解Struts2的知识点之前,让我们先了解如何开始一个Struts2项目。 首先,要开发Struts2应用,你需要从Apache官方网站下载Struts2的最新版本,通常是struts-2.x.x-all.zip。解压缩后,找到lib目录下的jar文件...
深入理解MVC思想对于优化Struts2应用至关重要,因为MVC分离了模型、视图和控制器,使得代码更易于管理和测试。 **七、Namespace** Namespace用于区分具有相同Action名称的请求,它决定了Action的访问路径。默认的...
理解并掌握这些步骤是Java EE开发中必不可少的一部分,它为你后续深入学习Struts2和构建复杂Web应用打下基础。在实际开发中,你可能还需要了解更多关于Struts2的特性,如拦截器、插件、国际化、异常处理等内容。
本文将深入探讨Struts2的核心概念,包括Namespace、标签、Action以及它们在实际开发中的应用。 一、Namespace Namespace在Struts2中主要用于组织和隔离Action,它决定了Action的访问路径。默认情况下,Namespace为...
深入理解Struts2的FileUploadInterceptor,可以让我们更好地控制文件上传的过程,包括文件类型检查、大小限制、错误处理等。此外,还可以通过自定义拦截器扩展其功能,满足特定的业务需求。 总的来说,Struts2的...
Struts2是一个基于MVC设计模式的Java web框架,它极大地简化了企业级应用的开发。以下是关于Struts2的一些核心知识点的详细...通过深入理解和实践这些知识点,开发者能更好地掌握Struts2框架,高效地构建Java web应用。
这个"Struts2小程序源代码"提供了丰富的学习资源,帮助开发者深入理解Struts2的核心概念和技术。 首先,我们来看看标题提到的"Struts2小程序源代码"。这通常意味着包含了一系列小型的、独立的示例程序,这些程序...
### Struts2学习心得:深入理解Struts2框架的基本配置与初学者指南 #### Struts2框架概述 Struts2是Struts框架的升级版本,它继承了Struts1的优点并在此基础上进行了改进,提供了更丰富的功能和更好的性能。Struts...
在这个"Struts2项目案例"中,我们可以通过学习和实践来深入理解Struts2框架如何与数据库进行交互。 首先,让我们详细了解Struts2的核心概念: 1. **Action类**:在Struts2中,Action类是业务逻辑处理的主要载体。...
深入理解Struts2的内核解析有助于我们更好地利用这个框架,提高开发效率并优化应用性能。 在用户发起一个URL请求时,Struts2容器开始执行一系列操作: 1. **过滤器Dispatcher**:Struts2的核心是`FilterDispatcher...