Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java struts正则表达式变量点_Java_Url_Struts2_Action Mapping - Fatal编程技术网

Java struts正则表达式变量点

Java struts正则表达式变量点,java,url,struts2,action-mapping,Java,Url,Struts2,Action Mapping,我试图在struts 2中的动态url模式中包含点(.),但它不起作用 我对动态url的struts 2配置如下 <struts> <constant name="struts.enable.SlashesInActionNames" value="true"/> <constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/> <constant name="struts.

我试图在struts 2中的动态url模式中包含点(.),但它不起作用

我对动态url的struts 2配置如下

<struts>
<constant name="struts.enable.SlashesInActionNames" value="true"/>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
<constant name="struts.patternMatcher" value="regex" />
<package name="api" extends="struts-default" namespace="/">
    <action name="api/v1/{sid}/function/{id}/version/{ver}" class="com.test.Main" method="test">
        <param name="sid">{sid}</param>
        <param name="id">{id}</param>
        <param name="ver">{ver}</param>
    </action>
</package>

{sid}
{id}
{ver}

如果我给触发器一个url中没有任何点的url,它就工作了

/api/v1/test/function/1234/version/1

但如果我用点来表示,它是404

/api/v1/test/function/1234/version/1.1

为什么它不起作用?
如何使其工作?

URL中的点
表示文件扩展名分隔符。当您在URL中使用数据时,应该对其进行编码。点的编码值为
%2E

将数据与动作名称中的参数一起使用并不是Struts2的问题,但某些字符如果编码不正确,则具有特殊意义。有关URL规范的详细说明,请参阅

保留:

许多URL方案保留某些字符以表示特殊含义: 它们在URL的特定于方案的部分中的外观有一个
指定语义。如果八位字节对应的字符是
在方案中保留,必须对八位字节进行编码。字符“;”, “/”、“?”、“:”、“@”、“=”和“&”是可能是
在方案中保留特殊含义。不得使用其他字符 在方案中保留

通常,当八位字节为
由字符表示,并在编码时使用。然而,这不是
保留字符为true:对保留字符进行编码
特定方案可能会更改URL的语义

因此,只有字母数字、特殊字符“$-+!*”()、”和 可使用用于保留目的的保留字符
在URL中未编码

另一方面,不需要编码的字符
(包括字母数字)可在特定方案内编码
URL的一部分,只要它们不是用于保留的
目的


URL中的点
表示文件扩展名分隔符。当您在URL中使用数据时,应该对其进行编码。点的编码值为
%2E

将数据与动作名称中的参数一起使用并不是Struts2的问题,但某些字符如果编码不正确,则具有特殊意义。有关URL规范的详细说明,请参阅

保留:

许多URL方案保留某些字符以表示特殊含义: 它们在URL的特定于方案的部分中的外观有一个
指定语义。如果八位字节对应的字符是
在方案中保留,必须对八位字节进行编码。字符“;”, “/”、“?”、“:”、“@”、“=”和“&”是可能是
在方案中保留特殊含义。不得使用其他字符 在方案中保留

通常,当八位字节为
由字符表示,并在编码时使用。然而,这不是
保留字符为true:对保留字符进行编码
特定方案可能会更改URL的语义

因此,只有字母数字、特殊字符“$-+!*”()、”和 可使用用于保留目的的保留字符
在URL中未编码

另一方面,不需要编码的字符
(包括字母数字)可在特定方案内编码
URL的一部分,只要它们不是用于保留的
目的


我自己没有使用它,但是
regexpaternmatcher
上的JavaDoc说:“正则表达式的形式可以是{FIELD\u NAME}或{FIELD\u NAME:regular\u EXPRESSION}。”-因此您可以尝试
{ver:\d+(\.\d+)}
,很好。最后一节中的点很棘手,因为它通常用于表示动作扩展。您可以创建自己的
ActionMapper
来处理这个问题,或者在
/{ver}
部分后面添加一些额外的内容。您也可以创建一个改进请求-。我自己没有使用它,但是
regexpatermatcher
上的JavaDoc说:“正则表达式可以是{FIELD\u NAME}或{FIELD\u NAME:regular\u EXPRESSION}的形式。”-因此您可以尝试
{ver:\d+(\.\d+)}
。很好。最后一节中的点很棘手,因为它通常用于表示动作扩展。您可以创建自己的
ActionMapper
来处理此问题,或者在
/{ver}
部分之后添加一些额外的内容。您还可以创建一个改进请求-。