【问题标题】:Struts2 - Can an action name be repeated in the struts.xml using the same action class but for different methods?Struts2 - 可以在 struts.xml 中使用相同的动作类但使用不同的方法重复动作名称吗?
【发布时间】:2014-07-16 22:18:22
【问题描述】:

我的想法是使用 Struts2 执行以下操作,使用单个 Action 类和其中的多个方法:

查看角色操作:manage/roles.action?method%3Aview=View 添加角色动作:manage/roles.action?method%3Aadd=Add

通过调用提交按钮调用 URL,如下所示,从 test.jsp:

<s:form namespace="/manage/" action="roles" method="get" >
    <s:submit method="view" value="View" />
    <s:submit method="add" value="Add" />
    <s:submit method="edit" value="Edit" />
    <s:submit method="delete" value="Delete" />
</s:form>

在struts.xml中,我配置了:

 <package name="portal" namespace="/manage/" extends="struts-default">
    <action name="home">
        <result>/WEB-INF/jsp/manage/roles/test.jsp</result>
    </action>

    <action name="roles" class="struts2.actions.RoleAction" method="view">
        <result name="success">/WEB-INF/jsp/manage/roles/viewRoles.jsp</result>
    </action>

    <action name="roles" class="struts2.actions.RoleAction" method="add">
        <result name="input">/WEB-INF/jsp/manage/roles/addRole.jsp</result>
        <result name="success">/WEB-INF/jsp/manage/roles/viewRoles.jsp</result>
    </action>

不幸的是,当我按下查看按钮时,它显示了“添加”方法的结果 JSP。为什么?

【问题讨论】:

    标签: struts2 struts-config


    【解决方案1】:

    因为您有两个同名操作,roles

    您如何区分.../roles/roles

    它们应该有不同的名称——不同的 URL。由于它们是相同的 URL,最后配置的 URL 将获胜;你正在覆盖你自己的定义。给他们起不同的名字,比如/addrole/viewrole,或者给他们命名空间,比如/roles/add/roles/view等等?

    【讨论】:

    • 是的,我注意到最后配置的操作正在执行。在 Struts 1 中,我使用了类似/roles?action=add/roles?action=view 等的东西。我也在 Struts 2 中尝试了同样的方法——这似乎是不可能的。这个想法很简单——一个动作类迎合不同可能的动作方法(/roles.action?method=add/roles.action?method=view 等),其中每种方法都有自己的输入和自己的结果。没有共同的输入和结果。如何实现这一点?
    • @Faisal 它可能的,使用动态方法调用(在 S2.1 IIRC 附近默认禁用)。我不是粉丝,我几乎可以说这是一个 S2 反模式。只是没有真正的需要。
    • 我刚刚在此处阅读了有关 DMI 的信息:struts.apache.org/release/2.3.x/docs/… 您能否提供一个 DMI 的好例子?不是通配符。
    • @Faisal 什么例子?正如文档所述:动态方法调用(DMI)将使用“!”后面的字符串动作名称中的字符作为要调用(而不是执行)的方法的名称。对“Category!create.action”的引用表示要使用“Category”动作映射,但要调用 create 方法。
    • 好的,我的意思是 DMI 的示例实现。然而,上面讨论的官方 URL 帮助了我,我实现了我的想法(所有这些现在都在工作 /roles!view.action/roles?method:view/roles?method%3Aview)。虽然我有一个问题-method:view 被编码为method%3Aview。如何禁用此功能并使用 method:view 代替?
    猜你喜欢
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2010-11-07
    • 2013-11-20
    • 2013-06-13
    • 2012-01-18
    相关资源
    最近更新 更多