不幸的是,您无法使用约定插件在包上定义
Result
或 Results
注释。您必须在 xml 配置中定义全局结果,并且它们不会被忽略,因为无论您使用哪个配置提供程序,都会定义运行时配置。解决方法是在基类上定义 Result
或 Results
。
您正在
package中定义
global-result
。这些类型的结果(全局)仅对于定义它们的包来说是全局的。因此,只有那些也在同一包中声明的actions
才能访问这些global-result
。您面前有两个选择:
如何在 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
的有用链接:
关于:约定插件文档:
从2.1.7开始,使用注解定义的全局结果(在类级别定义)将被继承。
所以对我来说,我可以有一个基本动作,我的所有动作都可以扩展,然后我就有一个全局结果。另一个想法是 package-info.java。
同一份文件说:
Convention 插件允许操作类为操作定义不同的结果。结果分为两类:全局和局部。 全局结果在操作类中定义的所有操作之间共享。这些结果被定义为操作类的注释。本地结果仅适用于定义它们的操作方法。 这是不同类型结果注释的示例`
所以我认为它们与标准的 Local Result 和 Global Result 是不同的概念。
标准支柱:
我认为对于约定,全局是(2.),本地是(3.)它们都是操作的本地,但是全局可以从每个方法返回,而本地只能从定义它的特定方法返回。