gpt4 book ai didi

Struts2 - 使用 Annotation 将 Action 成员变量作为参数传递

转载 作者:行者123 更新时间:2023-12-04 05:12:02 25 4
gpt4 key购买 nike

简而言之,我有一个带有名为 bestTutorialSite 的实例变量的 Action 类。这个变量可以传递给一个 JSP,如下所示:

<package name="tutorial1" namespace="/" extends="struts-default">
<action name="getTutorial" class="org.tutorial.struts2.action.TutorialAction">
<result name="success" type="redirectAction">
<param name="actionName">getTutorialPage</param>
<param name="namespace">/tutorials</param>
<param name="message">${bestTutorialSite}</param>
</result>
<result name="error" type="redirectAction">
<param name="actionName">getErrorPage</param>
<param name="namespace">/tutorials</param>
<param name="message">${bestTutorialSite}</param>
</result>
</action>
</package>

<package name="tutorial2" namespace="/tutorials" extends="struts-default">
<action name="getTutorialPage">
<result>/success.jsp</result>
</action>
<action name="getErrorPage">
<result>/error.jsp</result>
</action>
</package>

使用 XML 方式没问题。
问题是我如何使用 Annotation 做到这一点,因为带注释的参数需要常量表达式(实例变量 bestTutorialSite 不是常量表达式)。

更多信息:
成功.jsp
<body>
Success Page!!
<br/>
<s:property value="$parameters['message']"/>
</body>

最佳答案

@Results({
@Result(name = "success", type = "redirectAction", params = {"namespace", "/tutorials", "actionName", "getTutorialPage", "message", "${bestTutorialSite}"}),
@Result(name = "error", type = "redirectAction", params = {"namespace", "/tutorials", "actionName", "getErrorPage", "message", "${bestTutorialSite}"})
})
public class TutorialAction extends ActionSupport...

备注 :作为依赖项,您将需要 struts2 约定插件。
如需更多示例和引用,请参阅: http://struts.apache.org/2.2.3/docs/convention-plugin.html#ConventionPlugin-Actionannotation

编辑 :
在解决评论中提出的操作名称问题中。

约定使用以连字符分隔的操作名称。也就是说,我们不会调用操作 getTutorial 而是调用 get-tutorial。

Action 获取教程可能有一个 Action 类。根据您的 xml,操作类必须位于根命名空间中。但是当前的命名空间是 org.tutorial.struts2.action.TutorialAction这不会在默认命名空间中,因为约定将搜索带有 struts2 或 action 的包,并且在层次结构中进一步向下的包被解释为 struts2 包。

因此,约定将解释您的 org.tutorial.struts2.action.TutorialAction类在 /action/tutorial 中命名空间。我们应该将包名更改为 org.tutorial.myapp.action.GetTutorialAction或类似的东西来避免这个问题。

注意, Get附加到 TutorialAction 以便 struts 将操作定位为 /get-tutorial .

View 遵循与包名称平行的模式。根据您当前的操作,您需要将 View 定位在 /WEB-INF/content/action/tutorial.jsp (约定也将能够通过文件扩展名识别 freemarker 和速度 View )。您也可以将结果的名称包含在 View 中,例如 /WEB-INF/content/action/tutorial-success.jsp , /WEB-INF/content/action/tutorial-error.jsp , 和 /WEB-INF/content/action/tutorial-input.jsp所以如果执行返回“成功”,你会得到前者,如果“错误”,那么后者。类名当然是驼峰式的(根据 Java 命名约定),但是 View 将全部小写,并且单词之间将出现连字符。

一个非常有用的技术是将所有输入表单创建为“*-input.jsp”,您可以直接转到 View (绕过操作类),例如使用定义为的 anchor :
<s:a namespace="/employee" action="person-input">Go to Person Input</s:a>
如果没有名为 PersonInput 的类或 PersonInputAction (记住不必将 Action 放在最后)然后 View 将按原样呈现,表单的 View 将指向 Person Action,如下所示:

如果表单验证失败(返回输入),那么 Person 操作将首先尝试“person-input”,然后您将返回表单。这是非常有用的。

使用约定时,对注释的最大需求应该是:
  • 重用 View
  • 使用 redirectAction 在采取行动后让你回到某个地方。也许是更新后的列表。
  • 不太常见:使用不同的结果类型(json、stream)

  • 因此@Result 和@Results 注释是最常见的。 @Action 注释通常出现在您尝试违反约定时,但请记住,除了偏离预期之外,您不需要编写注释。所以你实际上是在为自己工作。

    Action 注释的一个很好的用途是在同一个类中声明多个 Action 方法(对于单个实体的某些 crud 操作可能很有用)。我个人更喜欢每个 Action 策略一个类,但可以欣赏 Action 注释的这种使用,但是如前所述,使用它来生成 Action 同义词或覆盖我不喜欢的约定。

    要命名您的操作而不是诸如“getTutorial”之类的约定,您可以说:
    @Action(value="/getTutorial", 
    results={
    @Result(name = "success", type = "redirectAction", params = {"namespace", "/tutorials", "actionName", "getTutorialPage", "message", "${bestTutorialSite}"}),
    @Result(name = "error", type = "redirectAction", params = {"namespace", "/tutorials", "actionName", "getErrorPage", "message", "${bestTutorialSite}"})
    })

    如上所述,不推荐这样做。

    关于Struts2 - 使用 Annotation 将 Action 成员变量作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14805027/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com