Struts2_Convention_Plugin中文文档

Struts2_Convention_Plugin中文文档
Struts2_Convention_Plugin中文文档

Struts2 Convention Plugin中文文档(一)

Introduction

从struts2.1版本开始,Convention Plugin作为替换替换Codebehind Plugin来实现Struts2的零配置。

?包命名习惯来指定Action位置

?命名习惯制定结果(支持JSP,FreeMarker等)路径

?类名到URL的约定转换

?包名到命名空间(namespace)的约定转换

?遵循SEO规范的链接地址(即:使用my-action 来替代MyAction)

?基于注解的Action名

?基于注解的拦截机(Interceptor)

?基于注解的命名空间(Nameespace)

?基于注解的X Work包

?默认action以及默认的结果(比如:/products 将会尝试寻找com.example.actions.Products 或com.example.actions.products.Index进行处理)

无需配置Convention即可使用Convention,Convention的某些约束习惯可以通过配置属性来控制,您也可以在类中覆写其中的方法来达到扩展目地。

安装

使用Convention插件,你需要将其JAR文件放到你应用的WEB-INF/lib目录中,你也可以在你Maven 项目的POM文件中添加下面包依赖

1.

2. org.apache.struts

3. struts2-convention-plugin

4. 2.1.6

5.

转换基于Codebehind项目到Convention

跳转到此页面,查看需要修改的变化和小提示

如果你想在你系统中结合Convention插件使用REST。需要在你项目的struts.xml中添加如下配置

1.

2.

3.

Hello world

到目前为止,你已经在你项目中添加了Convention插件支持,首先我们从一个非常简单的例子开始入手。本例中,我们将演示根据访问URL来访问固定的Action,默认情况下,Convention会默认所

有的结果页面都存储在WEB-INF/content下,你也可以在struts的properties文件中设定

struts.convention.result.path的值到一个新的路径。路径最后“/”是不必要的,Convention会自动进行处理。以下是本例的JSP文件

WEB-INF/content/hello-world.jsp

1.

2.

3. Hello world!

4.

5.

启动Tomcat或其他你所使用的JEE容器,在浏览器访问http://localhost:8080/hello-world ,你可看到以下信息:

Hello world!

这表明,Convention已经能正常运行,并找到了结果。即使在没有action存在情况下,convention 也会根据URL规则来找到结果页面。

Code behind hello world

我们继续扩展本例并添加代码实现类。为了实现本功能,首先需要Convention能正确找到我们的Action 类,默认情况下,Convention会找到com.opensymphony.xwork2.Action 的实现类,或制定包中以Action 结尾的类action

Convention使用以下方法来搜索类路径,首先,Convention会从根package中寻找包名含有struts, struts2, action or actions 的任意packages。下一部,Convention从前一步找到的package以及其子package中寻找com.opensymphony.xwork2.Action 的实现以及以Action结尾的类,下面为Convention寻找的类

1. com.example.actions.MainAction

2. com.example.actions.products.Display (implements com.opensymphony.xwork2.Action)

3. https://www.360docs.net/doc/fa18035380.html,pany.details.ShowCompanyDetailsAction

4. com.example.actions.MainAction

5. com.example.actions.products.Display (implements com.opensymphony.xwork2.Action)

6. https://www.360docs.net/doc/fa18035380.html,pany.details.ShowCompanyDetailsAction

每一个被Convention找到action都会对应一个明确的URL地址,URL以package的名字以及Action 类名为基础。

首先Convention从根package以及类所在的package名来确定对应的URL中的路径(namespace),以下就是根据package确定的URL namespace

1. com.example.actions.MainAction -> /

2. com.example.actions.products.Display -> /products

3. https://www.360docs.net/doc/fa18035380.html,pany.details.ShowCompanyDetailsAction -> /company/details

接下来Convention需要确定URL的具体资源部分。第一步取消类名中的Action,并以”-”来分割类名的其他部分,且将每个分部的首字母转为小写。如下所示

1. com.example.actions.MainAction -> /main

2. com.example.actions.products.Display -> /products/display

3. https://www.360docs.net/doc/fa18035380.html,pany.details.ShowCompanyDetailsAction -> /company/details/sh

ow-company-details

你也可以通过配置struts.convention.exclude.packages 来告诉Convention忽略某些包,也可以设置struts.convention.package.locators 用来更改Convention默认的根packages,最后你还可以设

置struts.convention.action.packages. 来让Convention只搜索特定package下的Action

以下就是action类的实现代码:

1. package com.example.actions;

2.

3. import com.opensymphony.xwork2.ActionSupport;

4.

5. public class HelloWorld extends ActionSupport {

6. private String message;

7.

8. public String getMessage() {

9. return message;

10. }

11.

12. public String execute() {

13. message = "Hello World!";

14. return SUCCESS;

15. }

16. }

编译以上代码,并将其class放到WEB-INF/classes中,Convention将会将/hello-world 映射到这个Action. 部署上面的类以后,我们在JSP文件中添加打印message的语句,具体代码如下:

1.

2.

3. The message is ${message}

4.

5.

启动应用服务器,在浏览器访问http://localhost:8080/hello-world 地址,我们看到如下结果界面:The message is Hello World!

原文:https://www.360docs.net/doc/fa18035380.html,/WW/convention-plugin.html

翻译:石太祥

Struts2 Convention Plugin中文文档(二

Results and result codes

Struts启动后,Convention将预设好应用中的所有的action,默认情况下,配置将包含在你应用中能找到的所有JSP文件。

同时您也可在Action代码中设置与习惯不同的结果页面。通常Action方法返回一个字符串,通过返回的字符串找到结果页面,而使用Convention允许你在action代码中指定和返回字符串不同的结果页面。

编译下面的例子。我们希望在action中返回zero 而不是success,第一步,我们更新action类,返回zero。

1. package com.example.actions;

2.

3. import com.opensymphony.xwork2.ActionSupport;

4.

5. public class HelloWorld extends ActionSupport {

6. private String message;

7.

8. public String getMessage() {

9. return message;

10. }

11.

12. public String execute() {

13. if (System.currentTimeMillis() % 2 == 0) {

14. message = "It's 0";

15. return "zero";

16. }

17.

18. message = "It's 1";

19. return SUCCESS;

20. }

21. }

接下来,我们添加一个新的JSP页面WEB-INF/content/hello-world-zero.jsp 。需要注意的是,文件名的第一部分和action名是对应的,后面的部分和action返回的字符串对应。这就是convention确定具体使用那个页面来渲染结果。下面是修改后的JSP代码:

1.

2.

3. The error message is ${message}

4.

5.

现在,你可以编辑你的程序,重启应用,刷新页面,根据当前时间不通,会看到不通的渲染结果页面结果页面的类型会自动匹配文件,支持的渲染页面的格式为:jsp.ftl,vm,html,htm.下面是actiong和结果模版的映射关系:

URL Resu

lt

File that could match

Result

Type

/hello succe

ss

/WEB-INF/content/hello.jsp

Dispatch

er

/hello succe

ss /WEB-INF/content/hello-success.ht

m

Dispatch

er

/hello succe

ss /WEB-INF/content/hello.ftl FreeMar

ker

/hello-world input/WEB-INF/content/hello-world-input

.vm

Velocity

/test1/test2/ hello error/WEB-INF/content/test/test2/hello-

error.html

Dispatch

er

Action链

如果在一个action结果中调用另外一个action ,他们俩将被链接到一起,如果在第一个action代码中未定义result,如下代码:

1. package com.example.actions;

2.

3. import com.opensymphony.xwork2.Action;

4. import com.opensymphony.xwork2.ActionSupport;

5.

6. public class HelloAction extends ActionSupport {

7. @Action("foo")

8. public String foo() {

9. return "bar";

10. }

11.

12. @Action("foo-bar")

13. public String bar() {

14. return SUCCESS;

15. }

16. }

“foo”action执行时候,由于找不到结果,convention尝试在同一个包下寻找action名为“foo-bar”的action。如果找到这样的action,convention将会调用并返回相关联的result。

XWork packages

为了避免冲突,可将action放在一个自定义X WORK的package下。package命名由action所在的Java包,action对应的URL中namespace部分以及action的parent X Work package三个部分组成。parent X Work package 值在属性struts.convention.default.parent.package 中指定(默认为conventionDefault),package的属性值须继承于strutsDefault

因此,Convention插件中X WORK packages 采用如下命名规则:

1. ##

Using our example from above, the X Work package for our action would be:

上例中,action对应的X WORK package如下:

1. com.example.actions#/#conventionDefault

Struts2 Convention Plugin中文文档(三)

Annotation 参考

Convention使用某些注解语句来覆写插件默认的action到url的映射和自动搜索渲染到的页面。此外,你还可以修改action配置文件中定义的父X WORK的包信息

Action annotation

Convention 插件可以使用Action注解语句来修改action返回的URL地址。本注解同时也允许包含

在Actions语句中,用来使一个action对应于多个URL。在action 方法中使用本注解语句,可以参考以下代码:

1. package com.example.actions;

2.

3. import com.opensymphony.xwork2.ActionSupport;

4. import org.apache.struts2.convention.annotation.Action;

5.

6. public class HelloWorld extends ActionSupport {

7. @Action("/different/url")

8. public String execute() {

9. return SUCCESS;

10. }

11. }

现在我们action类中将使用/different/url 来替代默认的/hello-world,如果未指定@Result(参考下节),result的路径将会使用action的namespace,上面的例子中将会返回一下路径

"/WEB-INF/content/different/url.jsp"。

Action类中的单个方法可以使用Actions 注解来映射多个地址。

1. package com.example.actions;

2.

3. import com.opensymphony.xwork2.ActionSupport;

4. import org.apache.struts2.convention.annotation.Action;

5. import org.apache.struts2.convention.annotation.Actions;

6.

7. public class HelloWorld extends ActionSupport {

8. @Actions({

9. @Action("/different/url"),

10. @Action("/another/url")

11. })

12. public String execute() {

13. return SUCCESS;

14. }

15. }

另外的Action 或Actions 的使用方法是,在单个action类中定义多个action方法,每个方法对应一个不同的地址。下面是多个action方法的范例:

1. package com.example.actions;

2.

3. import com.opensymphony.xwork2.ActionSupport;

4. import org.apache.struts2.convention.annotation.Action;

5. import org.apache.struts2.convention.annotation.Actions;

6.

7. public class HelloWorld extends ActionSupport {

8. @Action("/different/url")

9. public String execute() {

10. return SUCCESS;

11. }

12.

13. @Action("url")

14. public String doSomething() {

15. return SUCCESS;

16. }

17. }

前面的例子中,第二个URL地址是不推荐的,上面url将使用java 包名作为namespace,而不会直接使用Action注解的地址。

Interceptor 和interceptor stacks 同样可以使用interceptorRefs 注解来指定。下例演示了在action 中同时添加"validation"和"defaultStack"拦截器。

1. package com.example.actions;

2.

3. import com.opensymphony.xwork2.ActionSupport;

4. import org.apache.struts2.convention.annotation.Action;

5. import org.apache.struts2.convention.annotation.Actions;

6.

7. public class HelloWorld extends ActionSupport {

8. @Action(interceptorRefs={@InterceptorRef("validation"), @InterceptorRef("defaultStac

k")})

9. public String execute() {

10. return SUCCESS;

11. }

12.

13. @Action("url")

14. public String doSomething() {

15. return SUCCESS;

16. }

17. }

可以通过params属性来将参数传递给结果。属性的值是一个偶数个元素的String的数组,由形如{"key0", "value0, "key1", "value1" ... "keyN", "valueN"}所组成,举个例子:

1. package com.example.actions;

2.

3. import com.opensymphony.xwork2.ActionSupport;

4. import org.apache.struts2.convention.annotation.Action;

5. import org.apache.struts2.convention.annotation.Actions;

6.

7. public class HelloWorld extends ActionSupport {

8. @Action(interceptorRefs=@InterceptorRef(value="validation",params={"programmatic",

"false", "declarative", "true}))

9. public String execute() {

10. return SUCCESS;

11. }

12.

13. @Action("url")

14. public String doSomething() {

15. return SUCCESS;

16. }

17. }

如果未指定interceptors,将会使用默认的。

InterceptorRef annotation

Interceptors 可以在方法级进行指定,使用Action 注解或在类上使用InterceptorRefs注解。Class 级别的拦截会被应用到类包含的所有action上。可以参考下面例子:

1. package com.example.actions;

2.

3. import com.opensymphony.xwork2.ActionSupport;

4. import org.apache.struts2.convention.annotation.Action;

5. import org.apache.struts2.convention.annotation.Actions;

6.

7. @InterceptorRefs({

8. @InterceptorRef("interceptor-1"),

9. @InterceptorRef("defaultStack")

10. })

11. public class HelloWorld extends ActionSupport {

12. @Action(value="action1", interceptorRefs=@InterceptorRef("validation"))

13. public String execute() {

14. return SUCCESS;

15. }

16.

17. @Action(value="action2")

18. public String doSomething() {

19. return SUCCESS;

20. }

21. }

下面的拦截机将会应用到“action1”中:"interceptor-1","defaultStack"中的所有拦截机, "validation" "defaultStack"中的所有拦截机也会对”action2”生效

Result annotation

Convention 允许action类为每个action定义不同的results,results分为两类,全局的(global)和本地的(local),全局results可以被action类中所有的action分享,这种results在action类上使用注解进行声明。本地results只能在action方法上进行声明。下面是两种results注解的例子:

1. package com.example.actions;

2.

3. import com.opensymphony.xwork2.ActionSupport;

4. import org.apache.struts2.convention.annotation.Action;

5. import org.apache.struts2.convention.annotation.Actions;

6. import org.apache.struts2.convention.annotation.Result;

7. import org.apache.struts2.convention.annotation.Results;

8.

9. @Results({

10. @Result(name="failure", location="fail.jsp")

11. })

12. public class HelloWorld extends ActionSupport {

13. @Action(value="/different/url",

14. results={@Result(name="success", location="https://www.360docs.net/doc/fa18035380.html,", type="redirect

")}

15. )

16. public String execute() {

17. return SUCCESS;

18. }

19.

20. @Action("/another/url")

21. public String doSomething() {

22. return SUCCESS;

23. }

24. }

参数同样可以在results中通过params属性进行传递,和上面一样,由形如{"key0", "value0, "key1", "value1" ... "keyN", "valueN"}所组成。可参考下例:

1. package com.example.actions;

2.

3. import com.opensymphony.xwork2.ActionSupport;

4. import org.apache.struts2.convention.annotation.Action;

5. import org.apache.struts2.convention.annotation.Actions;

6. import org.apache.struts2.convention.annotation.Result;

7. import org.apache.struts2.convention.annotation.Results;

8.

9. public class HelloWorld extends ActionSupport {

10. @Action(value="/different/url",

11. results={@Result(name="success", type="httpheader", params={"status", "500", "err

orMessage", "Internal Error"})}

12. )

13. public String execute() {

14. return SUCCESS;

15. }

16.

17. @Action("/another/url")

18. public String doSomething() {

19. return SUCCESS;

20. }

21. }

Namespace annotation

namespace注解允许action使用指定的路径替代默认的以package包名作为路径。本注解可以在action类或Java 包中的package-info.java类中进行设置。设置在action类中的namespace注解,对本action类中所有的action都有效,这是不完全合乎规范的action URL处理地址。设置在package-info.java中的namespace注解,将会改变本java包下所有的action的默认namespace。下面是此注解的例子:

1. package com.example.actions;

2.

3. import com.opensymphony.xwork2.ActionSupport;

4. import org.apache.struts2.convention.annotation.Action;

5. import https://www.360docs.net/doc/fa18035380.html,space;

6.

7. @Namespace("/custom")

8. public class HelloWorld extends ActionSupport {

9. @Action("/different/url")

10. public String execute() {

11. return SUCCESS;

12. }

13.

14. @Action("url")

15. public String doSomething() {

16. return SUCCESS;

17. }

18. }

在上例中的action 会对2个不同的地址响应:/different/url 和/custom/url

下面是一个在package-info.java中使用namespace注解的例子:

1. @org.apache.struts

https://www.360docs.net/doc/fa18035380.html,space("/custom")

2. package com.example.actions;

这会改变com.example.actions包下所有action的默认namespace。请注意一点,本注解不会应用到子一级的包中。

ResultPath annotation

ResultPath 注解用来更改默认的results存储路径,注解可以放到action的类中,也可以放到package-info.java 文件夹中。参考下例:

1. package com.example.actions;

2.

3. import com.opensymphony.xwork2.ActionSupport;

4. import org.apache.struts2.convention.annotation.Action;

5. import org.apache.struts2.convention.annotation.ResultPath;

6.

7. @ResultPath("/WEB-INF/jsps")

8. public class HelloWorld extends ActionSupport {

9. public String execute() {

10. return SUCCESS;

11. }

12. }

上面的result将以WEB-INF/jsps 替换默认的WEB-INF/content

ParentPackage annotation

ParentPackage注解用来定义具体action类的父X Work包或java包,下面例子演示了在action类上使用本注解:

1. package com.example.actions;

2.

3. import com.opensymphony.xwork2.ActionSupport;

4. import org.apache.struts2.convention.annotation.Action;

5. import org.apache.struts2.convention.annotation.ParentPackage;

6.

7. @ParentPackage("customX WorkPackage")

8. public class HelloWorld extends ActionSupport {

9. public String execute() {

10. return SUCCESS;

11. }

12. }

ExceptionMapping Annotation

ExceptionMapping 注解用来影射action抛出的异常。可以参考exception mapping documentation 获得详细信息。注解用类级别,在这种情况下,注解会应用到类里面的所有action

1. @ExceptionMappings({

2. @ExceptionMapping(exception = "https://www.360docs.net/doc/fa18035380.html,ng.NullPointerException", result = "success",

params = {"param1", "val1"})

3. })

4. public class ExceptionsActionLevelAction {

5.

6. public String execute() throws Exception {

7. return null;

8. }

9. }

可以在ExceptionMapping注解中使用params 属性来传递具体值给结果渲染页。ExceptionMapping 注解同样可以在action级别进行设置:

1. public class ExceptionsMethodLevelAction {

2. @Action(value = "exception1", exceptionMappings = {

3. @ExceptionMapping(exception = "https://www.360docs.net/doc/fa18035380.html,ng.NullPointerException", result = "success

", params = {"param1", "val1"})

4. })

5. public String run1() throws Exception {

6. return null;

7. }

8. }

Actions in jar files

默认情况下,Convention 插件不会从jar文件中寻找action。如果想实现这一功能,jar文件必须被struts.convention.action.includeJars 所定义的正则匹配到。在例子中myjar1.jar和myjar2.jar 将被插件检测到:

1.

提示:正则表达式只针对jar文件的路径进行匹配,而不是文件名。jar的URL应该包含jar文件的路径并以"!/"结尾。

Automatic configuration reloading

Convention插件可以自动重新加载配置的功能,无需重启容器,就可以刷新类中包含的action。这自动加载automatic xml 配置文件类似。你必须在struts.xml 中添加以下代码来启用本功能:

1.

2.

此功能没有在所有容器中进行过测试,强力建议不要在生产环境中使用。

全篇完

Struts2 零配置by convention-plugin

最近开始关注struts2的新特性,从这个版本开始,Struts开始使用convention-plugin代替codebehind-plugin 来实现struts的零配置。

配置文件精简了,的确是简便了开发过程,但是,我们熟悉的配置突然disappear了,真是一下很不适应。跟着潮流走吧,看看该怎样来搞定convention-plugin。

使用Convention插件,你需要将其JA R文件放到你应用的WEB-INF/lib目录中,你也可以在你Maven项目的POM文件中添加下面包依赖

org.apache.struts

struts2-convention-plugin

2.1.6

零配置并不是没有配置,而是通过约定大于配置的方式,大量通过约定来调度页面的跳转而使得配置大大减少。所以,首先应该了解下convention-plugin的约定:

1. 默认所有的结果页面都存储在WEB-INF/content下,你可以通过设置struts.convention.result.path这个属性的值来改变到其他路径。如:

Xml代码

则将路径配置到了WEB-INF/page 下。

2. 默认包路径包含action,actions,struts,struts2的所有包都会被struts作为含有Action类的路径来搜索。你可以通过设置struts.convention.package.locators属性来修改这个配置。如:

则定义了在项目中,包路径包含w eb和action的将被视为Action存在的路径来进行搜索。

https://www.360docs.net/doc/fa18035380.html,tb.w eb.*/https://www.360docs.net/doc/fa18035380.html,tb.action.*都将被视为含有Action的包路径而被搜索。

3. 接着,Convention从前一步找到的package以及其子package中寻找com.opensymphony.xw ork2.Action 的实现以及以Action结尾的类:

com.example.actions.MainAction

com.example.actions.products.Display (implements com.opensymphony.xwork2.Action)

https://www.360docs.net/doc/fa18035380.html,pany.details.ShowCompanyDetailsAction

4. 命名空间。从定义的.package.locators标示开始到包结束的部分,就是命名空间。举个例子:

https://www.360docs.net/doc/fa18035380.html,tb.w https://www.360docs.net/doc/fa18035380.html,erAction的命名空间是:”/user”。https://www.360docs.net/doc/fa18035380.html,tb.w https://www.360docs.net/doc/fa18035380.html,erAction的命名空间是:”/user/detail”

5. Convention通过如下规则确定URL的具体资源部分:去掉类名的Action部分。然后将将每个分部的首字母转为小写,用’-’分割,你可以设置https://www.360docs.net/doc/fa18035380.html,.separ ator 如

还是举个例子:

UserAction->user User DetailAction ->user-detail。结合上面的。对于

https://www.360docs.net/doc/fa18035380.html,tb.w https://www.360docs.net/doc/fa18035380.html,er DetailAction,映射的url就是/WEB-INF/content/user/detail/user-detail.jsp

6. struts支持.jsp .html .htm .v m格式的文件。

下面是actiong和结果模版的映射关系:

URL Result

File that could match Result Type

/hello success /WEB-INF/content/hello.jsp Dispatcher /hello success /WEB-INF/content/hello-success.htm Dispatcher

/hello success /WEB-INF/content/hello.ftl FreeMarker /hello-world input /WEB-INF/content/hello-world-input.vm Velocity

/test1/test2/hello error /WEB-INF/content/test/test2/hello-error.html Dispatcher

以上的内容来自struts2的文档https://www.360docs.net/doc/fa18035380.html,/2.1.6/docs/convention-plugin.html

当然,简单的通过默认的方式来进行配置不能完全满足实际项目的需要。所幸,convention的零配置是非常灵活的。

通过@Action注释

对如下例子:

Java代码

package com.example.web;

import com.opensymphony.xwork2.Action;

import com.opensymphony.xwork2.ActionSupport;

public class HelloAction extends ActionSupport {

@Action("action1")

public String method1() {

return SUCCESS;

}

@Action("/user/action2")

public String method2() {

return SUCCESS;

}

}

方法名默认调用路径默认映射路径

method1/hello!method1.action ./WEB-INF/content/hello.jsp

method2/hello!method2.action./WEB-INF/content/hello.jsp

通过@Action注释后

方法名@Action注释后调用路径@Action注释后映射路径

method1/action1!method1.action./WEB-INF/content/action1.jsp

method1/user/action2!method2.action/WEB-INF/content/user/action2.jsp

通过@Actions注释

Java代码

package com.example.web;

import com.opensymphony.xwork2.ActionSupport;

import org.apache.struts2.convention.annotation.Action;

import org.apache.struts2.convention.annotation.Actions;

public class HelloAction extends ActionSupport {

@Actions({

@Action("/different/url"),

@Action("/another/url")

})

public String method1() {

return“error”;

}

我们可以通过:/different/url!method1.action或/another/url!method1.action来调用method1方法。

对应的映射路径分别是/WEB-INF/content/different/url-error.jsp; /WEB-INF/content/another/url-error.jsp

可能误导了大家,一个方法被@Action注释后,只是多了一种调用方式,而不是说覆盖了原来的调用方式。比如对于如下例子:

Java代码

com.example.web;

import com.opensymphony.xwork2.ActionSupport;

import org.apache.convention.annotation.Action;

import org.apache.convention.annotation.Actions;

public class HelloAction extends ActionSupport {

@Action("/another/url")

public String method1() {

return“error”;

}

我们调用method1方法可以通过两种方式:

1 /hello!method1.action映射url:/WEB-INF/content/hello-error.jsp

2 /another/url!method1.action 映射url:/WEB-INF/content/another/url-error.jsp

可见,两种方式均可对method1方法进行调用,唯一的区别就是,两种调用的映射是不一样的,所以,想跳转到不同的界面,这是一个非常好的选择。

通过@Namespace 注释

package com.example.web;

import com.opensymphony.xwork2.ActionSupport;

import org.apache.struts2.convention.annotation.Action;

import org.apache.struts2.convention.annotation.Actions;

@Namespace("/other")

public class HelloWorld extends ActionSupport {

public String method1() {

return“error”;

}

@Action("url")

public String method2() {

return“error”;

}

@Action("/different/url")

public String method3() {

return“error”;

}

}

通过/other/hello-world!method1.action 访问method1方法。

通过/other/url!method2.action 访问method2方法

通过/different /url!method3.action 访问method3方法

与@Action 注释不同的是,该注释覆盖了默认的namespace(这里是’/’),此时再用hello!method1.action 已经不能访问method1了.

@Results和@Result

1 全局的(global)。

全局results可以被action类中所有的action分享,这种results在action类上使用注解进行声明。

package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;

import org.apache.struts2.convention.annotation.Action;

import org.apache.struts2.convention.annotation.Actions;

import org.apache.struts2.convention.annotation.Result;

import org.apache.struts2.convention.annotation.Results;

@Results({

@Result(name="failure", location="/WEB-INF/fail.jsp")

})

public class HelloWorld extends ActionSupport {

public String method1() {

return“failure”;

}

@Action("/different/url")

public String method2() {

return“failure”;

}

}

当我们访问/hello -w orld !method1.action 时,返回/WEB-INF/fail.jsp

当我们访问/hello -w orld !method2.action 时,返回/WEB-INF/fail.jsp

当我们访问/different/url!method2.action 时,返回/WEB-INF/fail.jsp

2 本地的(local)。

本地results只能在action方法上进行声明。

Java代码

package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;

import org.apache.struts2.convention.annotation.Action;

import org.apache.struts2.convention.annotation.Actions;

import org.apache.convention.annotation.Result;

import org.apache.convention.annotation.Results;

public class HelloWorld extends ActionSupport {

@Action(value="/other/bar",results={@Result(name = "error", location = "https://www.360docs.net/doc/fa18035380.html,",type="redirect")})

public String method1() {

return“error”;

}

}

当我们调用/hello -w orld !method1.action 时,返回/WEB-INF/content/hello-error.jsp

当我们调用/other/bar!method1.action 时,返回w https://www.360docs.net/doc/fa18035380.html,

this aticle from https://www.360docs.net/doc/fa18035380.html,/blog/398263

相关主题
相关文档
最新文档