2

我想在我的应用程序中获得一些全局结果。在良好的旧 XML 配置中,它看起来像:

<global-results>
  <result name="error" type="redirectAction">
    <param name="actionName">index</param>
    <param name="namespace">/</param>
  </result>
</global-results>

但是当我使用约定插件时,XML 中的全局结果似乎被忽略了,那么我如何使用约定插件来实现它呢?我不想让我的所有操作类都扩展一个定义了这些全局结果的自定义类。我认为package-info.java应该是我的朋友,但我所能定义的与结果有关的只是@org.apache.struts2.convention.annotation.ResultPath

只是要明确一点:我不想避免struts.xml配置 - 我只想有一些工作的全局转发,所以如果任何操作出现错误,我想将用户转发到中央错误页面。这目前不适用于我的配置。如果您在我struts.xml或我的行为中发现问题并且可以帮助我解决它,那就太好了。

struts.xml也许事情的顺序?这是我的结构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>
  <constant name="struts.devMode" value="false" />
  <constant name="struts.convention.result.path" value="/content/"/>
  <constant name="struts.convention.default.parent.package" value="my-package"/>
  <constant name="struts.convention.package.locators.disable" value="true"/>
  <constant name="struts.convention.action.packages" value="..."/>
  <constant name="struts.custom.i18n.resources" value="global" />
  <constant name="struts.multipart.maxSize" value="10485760" />
  <package name="my-package" extends="struts-default,json-default" namespace="/">
    <result-types>
      <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"/>
    </result-types>

    <interceptors>
      <interceptor name="login" class="loginInterceptor" />
      <interceptor name="pagetitle" class="pagetitleInterceptor"></interceptor>

      <interceptor-stack name="secureStack">
        ...
      </interceptor-stack>

      <interceptor-stack name="insecureStack">
        ...
      </interceptor-stack>
    </interceptors>

    <default-interceptor-ref name="secureStack" />

    <global-results>
      <result name="error" type="redirectAction">
        <param name="actionName">index</param>
        <param name="namespace">/</param>
      </result>
    </global-results>
  </package>
</struts>

在我的行动中,我有:

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;
  }
}

当然myAction有更多的功能 - 这只是为了说明。执行操作时,它会在my-action.jsp不使用磁贴的情况下转发到 ,但我希望它会转发到/index.action.

4

3 回答 3

1

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

于 2013-09-26T19:56:56.773 回答
1

您正在global-result中定义a 。这些结果(全局)仅对定义它们的包是全局的。因此,只有在同一包中声明的那些才能访问这些s。您有两个选择:actionsglobal-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告诉框架 thisaction属于此包并且可以使用它的global-results。为了实现这一点,您的 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是将动作默认 pacakge 设置为您最喜欢的包(这里是包含 的包global-result)。只需将此常量元素添加到您的 struts.xml(在 内部<struts>),您就可以了:

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

这是一个有用的链接@ParentPackage

  1. 来自 apache 的 @ParentPackage 注释
于 2016-08-22T15:37:46.837 回答
0

关于:公约插件文档

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

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

相同的文档说:

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

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

标准支柱:

  1. 全局结果对包中定义的每个动作/拦截器都是可见的;
  2. Local Result 仅对该 Action 可见(但如果使用 Dynamic Method Invocation 调用,则对所有方法可见);
  3. 如果方法包含在 struts.xml 中的 Action 标签中,则本地结果仅对该 Action 和 Method 可见(那么对于同一个 Action 类和不同的方法,您将有多个 action 标签)。

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

于 2013-09-27T10:02:46.027 回答