为什么Struts2使用action属性提交标记并不会更改页面URL

时间:2015-03-12 09:27:29

标签: jsp struts2

这是我的jsp代码:

<s:form method="POST" action="foo/bar">
    <s:submit value="Update"/>
    <s:submit value="Reverse" action="foo/bar/reverse"/>
</s:form>

jsp页面Struts2主题是simple

这是我的struts映射:

    <action name="foo/bar"
        class="my.package.BarAction">
        <result>/foo/bar.jsp</result>
    </action>

    <action name="foo/bar/reverse"
        class="my.package.BarAction"
            method="reverse">
        <result>/foo/bar.jsp</result>
    </action>

所以当我第一次进入页面时,浏览器地址字符串中的url为localhost:myapp/foo/bar.action,当我点击提交按钮,页面重新加载时,网址变为相同。但是,当我点击“反向”按钮,页面重新加载,但网址仍然相同。我认为网址应该更改为localhost:myapp/foo/bar/reverse.action,因为“反向”按钮会映射到该操作上。那么为什么浏览器地址输入中的url不会改变?并不是说我希望地址字符串中的url在“反向”按下时改变,但它似乎是合理的发生,我很好奇为什么它没有。

Struts版本是2.13.5.1

EDIT1:

我检查了谷歌开发工具,当我按“反向”按钮时,请求被发送到“http://localhost/myapp/foo/bar.action”,而不是“http://localhost/myapp/foo/bar/reverse.action

EDIT2:

我尝试删除foo/bar/reverse操作的操作映射,现在当我按下“反向”按钮时出现404错误,表示没有为操作名称foo / bar / reverse映射的操作。同时查看请求,我发现请求中传递了以下表单数据:action:foo/bar/reverse=Reverse

因此,对于客户端来说,struts2的行为就像请求被发送到foo/bar.action(实际发送它的地方),但后来struts执行不同的操作。

EDIT3:

我将struts映射的结果更改为foo/blabla.jsp foo/bar/reverse操作,现在按reverse按钮后,我得到blabla.jsp的内容,但浏览器中的url仍然是相同。

我想,似乎Struts2的工作原理。

1 个答案:

答案 0 :(得分:1)

来自Struts2 documentation

  

操作名称以斜杠

     

如果你的动作名称中有斜杠(例如,   

<action name="admin/home" class="tutorial.Admin"/>
     

)你需要具体   通过struts.xml中的常量允许动作名称中的斜杠   文件通过指定

<constant name="struts.enable.SlashesInActionNames" value="true"/>. 
     

请参阅JIRA Issue WW-1383进行讨论   将此属性设置为true的副作用。