`

Struts2系列之三:注解式Action

阅读更多
   struts2是的配置文件是struts.xml,可以将Action的URL映射和结果放在该文件中,也可以通过Convention Plugin支持注解方式来配置URL映射和结果。

使用时需要把Convention Plugin添加到classpath中;如果是maven工程则添加依赖:
<dependency>
  <groupId>org.apache.struts</groupId>
  <artifactId>struts2-convention-plugin</artifactId>
  <version>2.3.15.1</version>
</dependency>


Convention Plugin:顾名思义,就是一种约定的插件。用户按照约定编写代码即可。

一、Convention Plugin约定:

1. 包扫描

包路径包含action,actions,struts,struts2的所有包都会被struts当作含有Action类的路径来搜索,可以更改:
<constant name="struts.convention.package.locators" value="struts2,action" />


2. 类匹配

从包扫描找到的package及其子package寻找com.opensymphony.xwork2.Action的实现类或后缀为Action的类:如:
// 包名包含locators指定的struts2,会被扫描到;后缀名为Action,符合条件
com.john.struts2.FantasticAction

// 包名包含locators指定的action,会被扫描到;实现了Action接口,符合条件
com.john.action.FabulousController implements com.opensymphony.xwork2.Action

// 包名不包含locators指定的名称,不会被当作Action处理
com.john.mystruts.SignificantAction


3. 命名空间

命名空间就是URL中上下文和Action之间的部分,如http://localhost:8080/vehicle/car/buy.action,这里的命名空间就是/car

和SpringMVC通过类和方法的@RequestMapping注解来定义命名空间不同,struts2的命名空间默认是locators标示到包结束的部分:

// 这里的locators为struts2,同时也为包的结尾,命名空间为 /
com.john.struts2.FantasticAction

// locators为struts2,后面还有car,所以命名空间为 /car
com.john.struts2.car.QuickBuyAction


注:如果包路径包含一个以上的locators,以第一个作为标示,其余的作为命名空间的组成部分。如:
// 命名空间为/action/car,这里的action虽然也是locators,但前面已经有struts2了
com.john.struts2.action.car.QuickBuyAction


4. Action映射URL约定

去掉类名中的Action部分,然后将其它部分(每个都以大写开头)转换为小写,之间默认以'-'连接,可以通过下面常量更改分隔符:
<constant name="struts.convention.action.name.separator" value="-" />


如QuickBuyAction,去掉Action后,为QuickBuy,以大写字母,分成两个部分:Quick, Buy,转换成小写后,再以'-'连接,即为:quick-buy

通过上面的几个步骤,能够根据类的全限定名确定访问URL。以下URL省略主机名、端口和上下文,后缀为.do
// 访问URL为:/action/car/quick-buy.action
com.john.struts2.action.car.QuickBuyAction


5. 结果模板页存放路径

默认在/WEB-INF/content下,可以通过下面的常量配置:
<constant name="struts.convention.result.path" value="/WEB-INF/jsp/" />


当执行下面的execute方法时:

a. struts2会到path+命名空间(/WEB-INF/jsp/action/car)的路径下优先寻找 去除Action后缀之后,以separator标志('-')分隔的小写类名(quick-buy)-视图名称(success).文件扩展名(jsp)的文件。

b. 没有则试着搜寻前半部分(quick-buy.jsp)。

c. 再没有则搜索后半部分(success.jsp),还没有就报404错误。

注:文件路径包含命名空间

package com.john.struts2.action.car;

public class QuickBuyAction{

	// 通过/action/car/quick-buy!execute.do或/action/car/quick-buy.do(execute是默认方法,可省略)访问
	public String execute() throws Exception {
		return "success";
	}
}


6. 支持模板文件

struts2支持.html, .htm, .vm, .ftl, .jsp格式的文件,以下为映射:

URL  Result File that could matchResult Type
/hellosuccess  /WEB-INF/content/hello.jspDispatcher
/hellosuccess /WEB-INF/content/hello-success.htmDispatcher
/hellosuccess /WEB-INF/content/hello.ftlFreeMarker
/hello-world input /WEB-INF/content/hello-world-input.vm Velocity
/test1/test2/hello error /WEB-INF/content/test/test2/hello-error.html Dispatcher


二、注解配置

有时候约定不能满足项目需要,Convention Plugin通过以下几个注解来实现自定义配置:

1. @Namespace

标注在Action类上,覆盖约定的命名空间。

package com.john.struts2.action.myns;

import org.apache.struts2.convention.annotation.Namespace;
//import org.apache.struts2.convention.annotation.ParentPackage;
import com.opensymphony.xwork2.ActionSupport;

@Namespace("/open")
public class MyAction extends ActionSupport {

	public String execute() throws Exception {
		return "error";
	}
}


未加@Namespace前:
方法名 默认调用路径 默认映射路径
execute /action/myns/my!execute.do /WEB-INF/content/action/myns/my-error.jsp


添加@Namespace后,可以看出,调用和映射路径中的命名空间都被覆盖了:
方法名 @Namespace注解后调用路径 @Namespace注解后映射路径
execute /open/my!execute.do /WEB-INF/content/open/my-error.jsp

注:此时访问/action/myns/my.do(不经过方法),还是能找到/WEB-INF/content/action/myns/my.jsp

2. @Action和@Actions

将URL映射到指定方法,扩展约定配置

package com.john.struts2.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;
import com.opensymphony.xwork2.ActionSupport;

public class KittyAction extends ActionSupport {

	@Action("action1")
	public String acid() {
		return SUCCESS;
	}

	@Action("/user/action2")
	public String sweet() {
		return SUCCESS;
	}

	@Action("/autumn/summer/action3")
	public String bitter() {
		return SUCCESS;
	}

	@Actions({ @Action("/one/url"), @Action("/another/url") })
	public String pungent() {
		return SUCCESS;
	}
}


未加@Action前:
方法名 默认调用路径 默认映射路径
acid /action/kitty!acid.do /WEB-INF/content/action/kitty-success.jsp
sweet /action/kitty!sweet.do /WEB-INF/content/action/kitty-success.jsp
bitter /action/kitty!bitter.do /WEB-INF/content/action/kitty-success.jsp
pungent/action/kitty!pungent.do /WEB-INF/content/action/kitty-success.jsp


添加@Action后,在上面的基础上扩展新的调用和映射路径
方法名 @Action后调用路径 @Action后映射路径
acid /action/action1!acid.do /WEB-INF/content/action/action1-success.jsp
sweet /user/action2!sweet.do /WEB-INF/content/user/action2-success.jsp
bitter /autumn/summer/action3!bitter.do /WEB-INF/content/autumn/summer/action3-success.jsp
pungent/one/url!pungent.do /WEB-INF/content/one/url-success.jsp
pungent/another/url!pungent.do /WEB-INF/content/another/url-success.jsp

注:
i. @Action标注在方法上,却是对类名映射路径的扩展。上面的KittyAction约定映射是kitty,同时也可以是@Action指定的映射,如/action1

ii. @Action不会覆盖原来的约定配置,如标注了@Action的acid方法,通过/kitty!acid还是可以访问的。

iii. @Action的值如果包含一个以上的路径分隔符(/),会用第一个路径子串替代默认命名空间,之后的路径子串替代Action类的约定映射,如:
   @Action("/user/action2"),/user替代/action,/action2替代kitty
   @Action("/autumn/summer/action3"),/autumn替代action,/summer/action3替代kitty

iv. @Actions是@Action的数组形式,可以将多个URL和一个方法关联

3. @Results和@Result

类级别(global)
标注在Action类上,结果映射可以被action类的所有方法共享。
package com.john.struts2.action;

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

import com.opensymphony.xwork2.ActionSupport;

// @Result(name = "enjoyable", location = "/WEB-INF/enjoyable.jsp")
@Results({ @Result(name = "enjoyable", location = "/WEB-INF/enjoyable.jsp") })
public class NationalDay extends ActionSupport {

	public String travel() {
		return "enjoyable";
	}

	@Action("/cozy/fragrant")
	public String home() {
		return "enjoyable";
	}

	@Action(value = "/happy/blessing", results = { @Result(name = "happiness", location = "/WEB-INF/conjugal.jsp", type = "dispatcher") })
	public String wedding() {
		return "happiness";
	}
}


方法名 调用路径 返回视图
travel /action/national-day!travel.do /WEB-INF/enjoyable.jsp
home /action/national-day!home.do /WEB-INF/enjoyable.jsp
home /cozy/fragrant!home.do /WEB-INF/enjoyable.jsp


方法级别(local)
以@Action的results属性呈现,结果映射只能由被标注方法所用。

方法名 调用路径 返回视图
wedding /action/national-day!wedding.do /WEB-INF/content/action/national-day-happiness.jsp
wedding /happy/blessing!wedding.do /WEB-INF/conjugal.jsp
分享到:
评论

相关推荐

    Struts 2使用注解配置Action

    在"Struts 2使用注解配置Action"中,我们不再需要在struts.xml中为每个Action类手动添加配置。相反,我们可以在Action类或者方法上直接使用注解来声明它们的功能。这样不仅提高了代码的可读性,还使得配置更加灵活。...

    struts2注解登陆

    Struts2注解登录是Java Web开发中一种简化配置的方式,它允许开发者在代码中直接定义控制器、动作和结果页面的映射,从而避免了传统方式下需要在`struts.xml`配置文件中的繁琐设置。这种做法提高了代码的可读性和可...

    Struts2 Design and Programming: A Tutorial.pdf

    - 拦截器是Struts2的重要特性,它可以插入到Action调用的链路中,执行预处理和后处理任务,如登录验证、日志记录、性能统计等。 - 默认的拦截器栈包括了异常处理、参数校验和类型转换等功能。 3. **Struts2配置**...

    struts2注解详解

    ### Struts2 注解详解 #### 一、Struts2 Convention 插件介绍与使用 在 Struts2 框架的发展过程中,随着版本的更新和技术的演进,其配置方式也发生了变化。从 Struts2.1 版本开始,官方不再推荐使用 Codebehind ...

    struts2注解必须包

    "struts2注解必须包"指的是Struts2提供的一系列注解,它们对于简化Struts2应用的配置和增强其功能至关重要。 标题中的"struts2-convention-plugin-2.1.8.1.jar"是Struts2的约定插件(Convention Plugin)的一个特定...

    Maven实现struts2注解

    &lt;constant name="struts.objectFactory" value="struts注解工厂类全限定名,比如:org.apache.struts2.spring.StrutsSpringObjectFactory" /&gt; &lt;package name="default" extends="struts-default"&gt; ...

    Struts2.3.4.1 注解实例(二十)

    `@Action` 注解用于标记一个类为Struts2的Action,它可以替代struts.xml中的action配置。你可以设置如name、class、namespace等属性,定义Action的基本行为。 2. **Action方法注解**: `@Result` 和 `@Results` ...

    Struts2之Annotation注解配置使用案例struts013

    首先,了解`@Action`注解是理解Struts2注解配置的关键。这个注解用于标记一个类或方法作为处理HTTP请求的动作。例如: ```java @Action(value = "saveUser", results = { @Result(name = "success", location = ...

    Struts2 拦截器注解(二十七)

    拦截器是Struts2框架的核心组件之一,它允许开发者在动作执行前后插入自定义逻辑,实现如权限验证、日志记录、性能优化等多种功能。在"Struts2 拦截器注解"这个主题中,我们将深入探讨如何利用注解来简化拦截器的...

    maven整合struts2全注解

    本文将详细探讨如何使用Maven来整合Struts2,并利用全注解的方式简化配置,提高开发效率。首先,让我们理解这三个组件的核心作用: 1. Maven:是一个项目管理工具,它帮助开发者管理项目的构建、依赖、版本控制等。...

    Struts2 注解 Demo

    本教程将通过一个"Struts2注解Demo"来深入探讨Struts2中的注解用法,帮助开发者更高效地配置和管理Action类。 首先,Struts2的注解允许我们避免传统的XML配置,从而实现更加简洁、直观的编程方式。在`Struts2Demo`...

    struts2文件上传下载(注解版)

    下面将详细介绍这个“struts2文件上传下载(注解版)”项目的关键知识点。 1. **注解配置**: 在传统的Struts2配置中,我们需要在struts.xml文件中手动配置Action类与结果页面的映射。然而,使用注解可以在Action...

    Struts2注解开发jar

    在Struts2中,注解开发的关键在于`@Action`、`@Result`、`@Results`、`@Namespace`、`@Param`等注解。例如: 1. `@Action`:用于标记一个类或者方法作为Struts2的动作。它可以指定动作的名字、结果类型、拦截器栈等...

    Struts2+spring注解配置

    Struts2 提供了一种使用注解替代 XML 配置的方式,使得开发者无需编写繁琐的 struts.xml 文件,即可完成Action的配置。 **Struts2 注解配置** 1. **Action 注解** - `@Action` 用于标记一个类或方法作为 Struts2 ...

    struts2和spring3注解整合问题

    Struts2支持基于XML的配置和注解方式定义Action。 - **Spring3**:提供了强大的DI和AOP功能,用于管理bean和控制事务。Spring3也支持注解驱动的配置,使得无需XML即可配置bean。 2. **整合步骤** - 首先,需要在...

    struts2注解配置Action及拦截器几种不同方式写法对应的路径指向.docx

    Struts2 注解配置 Action 及拦截器是 Struts2 框架中的核心组件之一,负责处理用户请求并返回响应结果。下面,我们将通过详细的解释和示例代码,来介绍 Struts2 中的注解配置 Action 及拦截器几种不同方式的写法对应...

    Struts2注解详细说明文档

    Struts2 Convention Plugin允许开发者通过注解来配置Action名称、拦截器、命名空间等,极大地简化了配置过程。 ##### 2.7 默认Action及结果 当用户访问特定路径时,如果没有显式定义Action,则Convention Plugin会...

    Struts2讲义-作者:吴峻申

    #### 三、为什么选择Struts2 - **Struts2的优势**: - Struts2具有高度的灵活性和可扩展性。 - 它支持多种数据库访问技术和框架,如Hibernate、Spring等。 - Struts2提供了强大的插件体系,开发者可以根据项目...

    struts2.3.4.1注解零配置

    2. **Execute注解**:在Action方法上使用`@Execute`注解,替代了struts.xml中的`&lt;action&gt;`标签,定义了方法的执行条件。例如: ```java @Execute(validator = false) public String execute() { // ... return ...

    基于注解的Spring+Struts2+Mybatis

    【基于注解的Spring+Struts2+Mybatis】是一个常见的Java Web开发框架组合,用于构建高效、可维护性高的应用程序。在这个项目中,Spring作为整体的容器管理依赖注入(DI),Struts2负责处理HTTP请求和视图展示,而...

Global site tag (gtag.js) - Google Analytics