Struts2包中的namespace属性如何工作?

Struts2包中的namespace属性如何工作?,struts2,namespaces,Struts2,Namespaces,我仍然对如何正确使用Struts2中的namespace属性感到困惑 报告中提到: 名称空间不是路径 命名空间的层次结构与文件系统路径不同。有一个名称空间级别。例如,如果请求URL/barspace/myspace/bar.action,框架将首先查找namespace/barspace/myspace。如果/barspace/myspace中不存在该操作,则搜索将立即返回到默认命名空间“”。框架不会将名称空间解析为一系列“文件夹”。在名称空间示例中,将选择默认名称空间中的bar操作 我试过制作

我仍然对如何正确使用Struts2中的namespace属性感到困惑

报告中提到:

名称空间不是路径

命名空间的层次结构与文件系统路径不同。有一个名称空间级别。例如,如果请求URL/barspace/myspace/bar.action,框架将首先查找namespace/barspace/myspace。如果/barspace/myspace中不存在该操作,则搜索将立即返回到默认命名空间“”。框架不会将名称空间解析为一系列“文件夹”。在名称空间示例中,将选择默认名称空间中的bar操作

我试过制作一个简单的Struts2示例:


/pages/default.jsp
/pages/home1.jsp
/pages/home2.jsp
/pages/home3.jsp
其中
SampleDynamicWebProject
是上下文根

根据文档,如果我尝试

.../SampleDynamicWebProject/randomText/defaultIndex
然后,Struts2将查找
/randomText
名称空间并检查
defaultIndex
操作。如果它不存在,那么它将查找默认名称空间,即没有名称空间属性的包

但如果我尝试此URL:

.../SampleDynamicWebProject/namespace1/randomText/index2
Struts2应该查看
index2
操作的
/namespace1/randomText
名称空间,如果看不到,则应该查看默认名称空间。但是,上面的URL仍然指向
/namespace1
中的
index2
操作

当我尝试时,同样的事情也在发生

.../SampleDynamicWebProject/randomText/index1
调用根命名空间中的
index1


你能解释一下它到底是如何工作的吗?

你说得很对,文档中没有提到,如果名称空间是URL的一部分,那么就足以让整个过程正常工作

但它确实如此,下面是它的详细工作原理:

要解析URL并调用相应的命名空间和操作,Struts2使用:

ActionMapper接口提供HTTP请求和操作调用请求之间的映射,反之亦然

有不同的实现,但默认的实现是

分析URL时,将调用该方法。如果它不是默认的
或根
“/”
之一,并且
始终选择完整的命名空间
属性设置为
false
(这是默认值),则:

神奇之处在于:

如果(ns!=null
&&前缀.startsWith(ns)
&&(prefix.length()==ns.length()| prefix.charAt(ns.length())=='/')){
if(ns.length()>namespace.length()){
名称空间=ns;
}
///... 
}
name=uri.substring(namespace.length()+1);
在您的示例中:

/名称空间1/randomText/index2

prefix=/namespace1/randomText/
ns=/namespace1
在您的情况下,它不是null,URI以名称空间开始,长度不相同,但URI中
/namespace1
字符串后的字符是斜杠,然后操作映射器决定:

namespace=/namespace1
action=randomText/index2
这就是采用名称空间的原因。但是,既然操作名是
index2
,而不是
randomText/index2
,那么为什么它会起作用呢

第二个魔力在于:

if(!allowSlashesInActionNames){
int pos=name.lastIndexOf('/');
if(pos>-1&&pos
如果
allowSlashesInActionNames
属性设置为false(这是默认值),并且操作包含斜杠(如
randomText/index2
),则将所有内容剥离到最后一个斜杠,在
index2
中转换
randomText/index2

那么<强>只要你有一个URI,它从命名空间开始并以一个动作< /强>结束,不管中间是什么,它都是有效的。


它不应该使用
/randomText/namespace1/index2
,因为没有名称空间以
/randomText

开头,您希望得到什么答案?这就是S2的工作原理。您可以用<代码> strut.Mapp.AlvsStultFulnNealStEs< <代码> >代码> Struts。启用。SlashesInActionNames < /COD>常量。我认为这是有史以来最好的第一个问题。我不同意@AleksandrM的评论,文档中没有提到它应该是这样工作的;这个问题似乎绝对合法me@AndreaLigios当前位置并不是说这是一个不合法的问题。只是不确定答案是什么。@AleksandrM我知道,但文档中没有描述这种行为,我记得多年前也有过同样的疑问。这是文件上的一个真正的漏洞,伊姆霍。为什么会找到namespace1/randomText->namespace1?这就是问题所在,这不仅不是立即的,而且肯定是误导性的。它应该匹配或打破,不匹配每一个URI与垃圾在中间,而是做了什么,而不是甚至文件DeNeTyDeEAH,它总是出现,例如,也许更多。我想做点什么,谢谢!这肯定回答了我的问题,您也为我提供了如何在struts2中处理此命名空间行为的选项。