`
Rainbow702
  • 浏览: 1078147 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类

struts2 中,@NameSpace 和 @Action 的使用示例

阅读更多

本方列举了Action类中,几种配置了 @Namespace 和 @Action  的情况,以及这些情况下如何访问Action类中的相应方法。

 

情况一:

 

@Namespace("/test")
@Namespaces({ @Namespace("/test2"), @Namespace("/test3") })
@Action("/test4")
@Actions({ @Action("/test5"), @Action("/test6") })
public class FileAction {

	public String upload() {
		System.out.println("uploading files...");
		return "success";
	}
}

对于上面的这种配置,我们可以通以下的URL去调用FileAction中的upload()方法:

http://xxx.xxx.xxx.xxx:port/web工程名/test/test5!upload
http://xxx.xxx.xxx.xxx:port/web工程名/test/test6!upload

http://xxx.xxx.xxx.xxx:port/web工程名/test2/test5!upload
http://xxx.xxx.xxx.xxx:port/web工程名/test2/test6!upload

http://xxx.xxx.xxx.xxx:port/web工程名/test3/test5!upload
http://xxx.xxx.xxx.xxx:port/web工程名/test3/test6!upload

 PS: 注意:@Action("/test4")   并未生效,因为它被@Actions({ @Action("/test5"), @Action("/test6") }) 取替了。原因。请看下面的源码:

 org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildConfiguration()


protected void buildConfiguration(Set<Class> classes) {
        Map<String, PackageConfig.Builder> packageConfigs = new HashMap<String, PackageConfig.Builder>();

        for (Class<?> actionClass : classes) {
            Actions actionsAnnotation = actionClass.getAnnotation(Actions.class);
            Action actionAnnotation = actionClass.getAnnotation(Action.class);

            .......此处省略N行代码

                //if there are @Actions or @Action at the class level, create the mappings for them
                String methodName = hasDefaultMethod ? DEFAULT_METHOD : null;
                if (actionsAnnotation != null) {
                    List<Action> actionAnnotations = checkActionsAnnotation(actionsAnnotation);
                    for (Action actionAnnotation2 : actionAnnotations)
                        createActionConfig(defaultPackageConfig, actionClass, defaultActionName, methodName, actionAnnotation2);
                } else if (actionAnnotation != null)
                    createActionConfig(defaultPackageConfig, actionClass, defaultActionName, methodName, actionAnnotation);
            }
        }

        .......此处省略N行代码

        }
    }

 从源码来看,当有@Actions注解时,@Action注解将被无视

 

大家可能会问,那 @Namespaces 会不会 覆盖 @Namespace 呢?答案是不会。原因也请看下面的源码:

org.apache.struts2.convention.PackageBasedActionConfigBuilder.determineActionNamespace()


protected List<String> determineActionNamespace(Class<?> actionClass) {
        List<String> namespaces = new ArrayList<String>();

        // Check if there is a class or package level annotation for the namespace
        //single namespace
        Namespace namespaceAnnotation = AnnotationTools.findAnnotation(actionClass, Namespace.class);
        if (namespaceAnnotation != null) {
            if (LOG.isTraceEnabled()) {
                LOG.trace("Using non-default action namespace from Namespace annotation of [#0]", namespaceAnnotation.value());
            }

            namespaces.add(namespaceAnnotation.value());
        }

        //multiple annotations
        Namespaces namespacesAnnotation = AnnotationTools.findAnnotation(actionClass, Namespaces.class);
        if (namespacesAnnotation != null) {
            if (LOG.isTraceEnabled()) {
                StringBuilder sb = new StringBuilder();
                for (Namespace namespace : namespacesAnnotation.value())
                    sb.append(namespace.value()).append(",");
                sb.deleteCharAt(sb.length() - 1);
                LOG.trace("Using non-default action namespaces from Namespaces annotation of [#0]", sb.toString());
            }

            for (Namespace namespace : namespacesAnnotation.value())
                namespaces.add(namespace.value());
        }

        //don't use default if there are annotations
        if (!namespaces.isEmpty())
            return namespaces;

        ......此处省略N行代码
    }

 从源码来看,是先读取@Namespace中的namspace,然后再读取@Namespaces中的namespace(s),将它们的值合并到一起进行返回的。

但是,一般情况下,配置了@Namespaces 或者 @Actions 时,就不会再去配置 @Namespace 或者 @Action了,谁吃饱了没事做啊  : )

 

转回正题,继续列出另一种配置方式:

 

情况二:

 

@Namespace("/test")
@Namespaces({ @Namespace("/test2"), @Namespace("/test3") })
@Action("/test4")
@Actions({ @Action("/test5"), @Action("/test6") })
public class FileAction {

	@Action("/test7")
	@Actions({ @Action("/test8"), @Action("/test9") })
	public String upload() {
		System.out.println("uploading files...");
		return "success";
	}

	public String gotoUpload() {
		return "gotoUpload";
	}
}

 对于上面的这种配置,我们可以通以下的URL去调用FileAction中的upload()方法:

http://xxx.xxx.xxx.xxx:port/web工程名/test/test8
http://xxx.xxx.xxx.xxx:port/web工程名/test/test9

http://xxx.xxx.xxx.xxx:port/web工程名/test2/test8
http://xxx.xxx.xxx.xxx:port/web工程名/test2/test9

http://xxx.xxx.xxx.xxx:port/web工程名/test3/test8
http://xxx.xxx.xxx.xxx:port/web工程名/test3/test9

http://xxx.xxx.xxx.xxx:port/web工程名/test8
http://xxx.xxx.xxx.xxx:port/web工程名/test9

 

分享到:
评论

相关推荐

    struts2_namespace代码

    Namespace在Struts2中的作用至关重要,它是Action配置的一个关键部分,用于组织和隔离Action,使得一个大型项目中的多个Action能够有序地管理。 Namespace主要功能: 1. **URL映射**:Namespace可以看作是Action的...

    Struts 2使用注解配置Action

    在"AnnotationTest"项目中,你可能会找到一些示例代码,展示了如何使用这些注解来构建一个完全基于注解的Struts 2应用。通过学习和实践这些例子,你可以更好地理解和掌握Struts 2的注解配置技术。

    Struts2 Json示例(Maven项目)

    这个示例项目不仅展示了如何在Struts2中使用JSON,还演示了如何通过Maven进行项目的构建和管理。通过学习这个例子,开发者可以更好地理解Struts2与JSON的集成,以及如何利用Maven来简化Java项目的构建流程。

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

    下面,我们将通过详细的解释和示例代码,来介绍 Struts2 中的注解配置 Action 及拦截器几种不同方式的写法对应的路径指向。 一、Struts2 中的 Action 在 Struts2 中,Action 是处理用户请求的核心组件。Action ...

    去掉.action去掉.do字样 隐藏struts2 URL地址action, strus1的扩展名do也是同理.zip

    Struts2和Struts1是两个非常著名的Java Web框架,它们在处理请求时通常会在URL中显式地显示.action或.do后缀。然而,为了提供更友好的用户体验和增强安全性,有时我们需要隐藏这些扩展名。本篇文章将详细介绍如何在...

    struts 2 action 动态调用

    如果希望调用其他方法,可以在`&lt;action&gt;`标签中使用`method`属性指定。 **4. 修改配置以调用 `doAdd()` 方法** ```xml &lt;struts&gt; &lt;constant name="struts.devMode" value="true"/&gt; &lt;package name="com.wq" ...

    Struts2_Action学习笔记、通配符{1},{2}

    通过上述分析可以看出,Struts2提供了丰富的特性来支持Web应用程序的开发,尤其是通过Namespace和ActionMethod等机制来组织和管理Action,以及利用通配符配置来简化配置文件,大大提高了开发效率和维护性。

    Struts2 Action参数详细说明

    在Struts2中,Action的配置和使用方式有多种,下面将详细介绍Struts2 Action参数的详细说明。 首先,我们来看Action的配置格式。在Struts2的配置文件(通常是struts.xml)中,Action的基本配置结构如下: ```xml ...

    Struts2 in action

    - **定义**:在Struts2框架中,**Action** 是用来处理客户端请求的核心类。当用户通过浏览器发送请求时,Struts2会将请求转发给相应的Action处理。 - **执行流程**: - 用户发起HTTP请求。 - 请求被Struts2的前端...

    struts2 使用注解现在零配置不需要在使用struts.xml配置文件,可以直接跑

    此外,Struts2还提供了其他注解,如`@Results`、`@Namespace`、`@ParentPackage`等,它们分别用于定义一组结果、Action所属的命名空间以及继承的配置包。这些注解可以帮助我们在不编写XML配置的情况下,完成大部分的...

    最简单的Struts2的代码示例

    在Struts2项目中,需要一个配置文件,通常是`struts.xml`,来定义Action类、结果页面和URL映射。例如,我们可以创建一个名为`HelloWorldAction`的类,并在配置文件中指定它的类名和执行方法: ```xml ...

    struts2 ,struts2 demo

    在提供的“struts2 demo”压缩包中,你可以找到这些概念的具体实现,包括Action类、视图页面、配置文件等,通过分析和运行这些示例,你可以深入理解Struts2的工作原理和用法。这个压缩包对于初学者来说是一个很好的...

    struts2注解登陆

    在实际项目中,使用Struts2注解进行登录处理可以大大简化开发流程,使代码更易于理解和维护。但需要注意的是,虽然注解提供了便利,但在大型项目中,完全依赖注解可能会导致类和方法过于臃肿,此时结合XML配置文件...

    struts2初始使用环境配置

    理解并掌握这些步骤是Java EE开发中必不可少的一部分,它为你后续深入学习Struts2和构建复杂Web应用打下基础。在实际开发中,你可能还需要了解更多关于Struts2的特性,如拦截器、插件、国际化、异常处理等内容。

    struts2通配符示例代码

    在Struts2的配置中,通配符(Wildcard)的使用是一个非常实用的功能,它使得URL映射更加灵活,减少了重复配置。下面将详细解释Struts2通配符的用法,并结合示例代码进行解析。 1. **Struts2通配符概述** Struts2的...

    struts2示例源代码

    Struts2的核心组件包括Action类、ActionForm、Interceptor(拦截器)、Result和配置文件(struts.xml)。Action类是业务逻辑的载体,它负责处理用户请求并返回结果到视图。ActionForm对象用于封装HTTP请求参数,提供...

    J2EE:struts2示例

    这个"J2EE: Struts2示例"旨在提供一个简单的入门教程,帮助初学者理解Struts2的核心概念和基本用法。 Struts2的核心是Action,它是业务逻辑处理的主要组件。Action负责接收用户请求,执行相应的业务逻辑,并将结果...

    struts2配置文件以及代码示例

    通过本文的介绍,我们可以看到Struts2配置文件以及相关代码示例对于理解和掌握Struts2框架至关重要。无论是配置文件中的各种元素还是JSTL、EL表达式的使用,亦或是ActionContext和拦截器的设计,都是开发者在实际...

    Struts2_Action

    在Action类中,还可以访问Web元素,比如HttpServletRequest和HttpServletResponse等,利用Struts2提供的API能够很便捷地实现这一功能。 此外,Struts2还提供了动态方法调用的机制,允许你在一个Action类中定义多种...

    struts2示例程序

    struts.xml &lt;?xml version="1.0" encoding="UTF-8" ?&gt; &lt;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"&gt; ...

Global site tag (gtag.js) - Google Analytics