为什么在 Struts 2 中使用约定插件会忽略全局结果?

问题描述 投票:0回答:3
java jsp struts2 xml-configuration struts2-convention-plugin
3个回答
1
投票

不幸的是,您无法使用约定插件在包上定义

Result
Results
注释。您必须在 xml 配置中定义全局结果,并且它们不会被忽略,因为无论您使用哪个配置提供程序,都会定义运行时配置。解决方法是在基类上定义
Result
Results


1
投票

您正在

package
中定义 global-result。这些类型的结果(全局)仅对于定义它们的包来说是全局的。因此,只有那些也在同一包中声明的
actions
才能访问这些
global-result
。您面前有两个选择:


XML 配置:

如何在 XML 配置中执行此操作非常明显(只需将它们定义在同一个包中):

<package name="my-package" extends="struts-default,json-default" namespace="/">

    <!-- This result is local to this action -->
    <action name="someAction"class="com.example.SomeAction" method="execute">
        <result name="someLocalResult">/localResult.jsp</result>
    </action>
    .
    .
    .
    <global-results>
        <!--This result is global **to the actions in my-package** -->
        <result name="error" type="redirectAction">
            <param name="actionName">index</param>
            <param name="namespace">/</param>
        </result>
    </global-results>

</package>

约定插件:

因此,如果您使用约定插件仅将您的 java 类标记为

actions
,那么您并没有为它们定义一个包(它们将属于默认包)。为此,您可以使用注释
@ParentPackage
告诉框架这个
action
属于这个包并且可以使用它的
global-result
。 为了实现这一点,你的 java 类应该如下所示:

@ParentPackage(value="my-pacakge")
public class MyActionClass extends ActionSupport {
    @Actions({ @Action(value = "my-action", results = { @Result(name = "success", type = "tiles", location = "my.location") }) })
    public final String myAction() throws Exception {
        return ERROR;
    }
}

您的

struts.xml
将保持不变:

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="my-package" extends="struts-default,json-default" namespace="/"> 
        .
        .
        . 
        <global-results> 
             <result name="error" type="redirectAction"> 
                 <param name="actionName">index</param> 
                 <param name="namespace">/</param> 
             </result> 
         </global-results> 
     </package> 
 </struts>

摆脱设置每个操作的

@ParentPackage
的类似替代解决方案是将操作默认包设置为您最喜欢的包(此处为包含
global-result
的包)。只需将此常量元素添加到您的 struts.xml(在
<struts>
内部)即可:

<constant name="struts.convention.default.parent.package" value="my-package"/>

这里有一个关于

@ParentPackage
的有用链接:

  1. 来自 apache 的@ParentPackage 注释

0
投票

关于:约定插件文档

从2.1.7开始,使用注解定义的全局结果(在类级别定义)将被继承

所以对我来说,我可以有一个基本动作,我的所有动作都可以扩展,然后我就有一个全局结果。另一个想法是 package-info.java。

同一份文件说:

Convention 插件允许操作类为操作定义不同的结果。结果分为两类:全局和局部。 全局结果在操作类中定义的所有操作之间共享。这些结果被定义为操作类的注释。本地结果仅适用于定义它们的操作方法。 这是不同类型结果注释的示例`

所以我认为它们与标准的 Local ResultGlobal Result 是不同的概念。

标准支柱:

  1. 全局结果对于包中定义的每个Action/Interceptor都是可见的;
  2. 本地结果仅对该操作可见(但如果通过动态方法调用调用,则对所有方法可见);
  3. 本地结果仅对该 Action 和 Method 可见,如果该方法包含在 struts.xml 中的 Action 标记中(那么您将拥有针对同一 Action 类和不同方法的多个操作标记)。

我认为对于约定,全局是(2.),本地是(3.)它们都是操作的本地,但是全局可以从每个方法返回,而本地只能从定义它的特定方法返回。

© www.soinside.com 2019 - 2024. All rights reserved.