如何在Struts 2 Action Names中允许斜杠?

时间:2013-10-01 10:50:20

标签: java struts2

我正在尝试在Struts 2动作名称中启用斜杠。我把它放在我的配置文件中:

<struts>
    <constant name="struts.devMode" value="true" />
    <constant name="struts.action.extension" value=","/> 
    <constant name="struts.multipart.maxSize" value="2147483648" />
    <constant name="struts.enable.SlashesInActionNames" value="true"/>

    <package name="myApp" extends="struts-default">                         
        <action name="home" class="net.myapp.actions.HomeAction" method="execute">
            <result name="landing">/landing.jsp</result>
        </action>
        <action name="/ajax/foo" class="net.myApp.actions.ajax.FooAction" method="execute">
            <result name="success">/foo.jsp</result>
        </action>
    </package>        

</struts>

当我转到此应用的主页时,例如http://localhost:8034/myApp,我正确看到了主页。但是,如果我访问http://localhost:8034/myApp/ajax/foo,我会收到错误:There is no Action mapped for action name ajax/foo.,即使我已将其描述为第二个操作。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

我说你也需要一个命名空间,所以ajax就是你的命名空间:

<package name="myApp" extends="struts-default" namespace="/ajax">    
  <action name="foo" class="net.myApp.actions.ajax.FooAction" method="execute">
     <result name="success">/foo.jsp</result>
  </action>
</package>

请注意,您可以在动作名称中使用斜杠,例如foo/bar,但这不可取,因为某些插件(例如会话插件)可能难以从/ajax/foo/bar这样的字符串中确定命名空间和操作。

顺便说一下,错误消息显示为There is no Action mapped for action name ajax/foo.,即struts会查找名为ajax/foo的动作但您只有/ajax/foo的动作。