本方列举了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
相关推荐
Namespace在Struts2中的作用至关重要,它是Action配置的一个关键部分,用于组织和隔离Action,使得一个大型项目中的多个Action能够有序地管理。 Namespace主要功能: 1. **URL映射**:Namespace可以看作是Action的...
在"AnnotationTest"项目中,你可能会找到一些示例代码,展示了如何使用这些注解来构建一个完全基于注解的Struts 2应用。通过学习和实践这些例子,你可以更好地理解和掌握Struts 2的注解配置技术。
这个示例项目不仅展示了如何在Struts2中使用JSON,还演示了如何通过Maven进行项目的构建和管理。通过学习这个例子,开发者可以更好地理解Struts2与JSON的集成,以及如何利用Maven来简化Java项目的构建流程。
下面,我们将通过详细的解释和示例代码,来介绍 Struts2 中的注解配置 Action 及拦截器几种不同方式的写法对应的路径指向。 一、Struts2 中的 Action 在 Struts2 中,Action 是处理用户请求的核心组件。Action ...
Struts2和Struts1是两个非常著名的Java Web框架,它们在处理请求时通常会在URL中显式地显示.action或.do后缀。然而,为了提供更友好的用户体验和增强安全性,有时我们需要隐藏这些扩展名。本篇文章将详细介绍如何在...
如果希望调用其他方法,可以在`<action>`标签中使用`method`属性指定。 **4. 修改配置以调用 `doAdd()` 方法** ```xml <struts> <constant name="struts.devMode" value="true"/> <package name="com.wq" ...
通过上述分析可以看出,Struts2提供了丰富的特性来支持Web应用程序的开发,尤其是通过Namespace和ActionMethod等机制来组织和管理Action,以及利用通配符配置来简化配置文件,大大提高了开发效率和维护性。
在Struts2中,Action的配置和使用方式有多种,下面将详细介绍Struts2 Action参数的详细说明。 首先,我们来看Action的配置格式。在Struts2的配置文件(通常是struts.xml)中,Action的基本配置结构如下: ```xml ...
- **定义**:在Struts2框架中,**Action** 是用来处理客户端请求的核心类。当用户通过浏览器发送请求时,Struts2会将请求转发给相应的Action处理。 - **执行流程**: - 用户发起HTTP请求。 - 请求被Struts2的前端...
此外,Struts2还提供了其他注解,如`@Results`、`@Namespace`、`@ParentPackage`等,它们分别用于定义一组结果、Action所属的命名空间以及继承的配置包。这些注解可以帮助我们在不编写XML配置的情况下,完成大部分的...
在Struts2项目中,需要一个配置文件,通常是`struts.xml`,来定义Action类、结果页面和URL映射。例如,我们可以创建一个名为`HelloWorldAction`的类,并在配置文件中指定它的类名和执行方法: ```xml ...
在提供的“struts2 demo”压缩包中,你可以找到这些概念的具体实现,包括Action类、视图页面、配置文件等,通过分析和运行这些示例,你可以深入理解Struts2的工作原理和用法。这个压缩包对于初学者来说是一个很好的...
在实际项目中,使用Struts2注解进行登录处理可以大大简化开发流程,使代码更易于理解和维护。但需要注意的是,虽然注解提供了便利,但在大型项目中,完全依赖注解可能会导致类和方法过于臃肿,此时结合XML配置文件...
理解并掌握这些步骤是Java EE开发中必不可少的一部分,它为你后续深入学习Struts2和构建复杂Web应用打下基础。在实际开发中,你可能还需要了解更多关于Struts2的特性,如拦截器、插件、国际化、异常处理等内容。
在Struts2的配置中,通配符(Wildcard)的使用是一个非常实用的功能,它使得URL映射更加灵活,减少了重复配置。下面将详细解释Struts2通配符的用法,并结合示例代码进行解析。 1. **Struts2通配符概述** Struts2的...
Struts2的核心组件包括Action类、ActionForm、Interceptor(拦截器)、Result和配置文件(struts.xml)。Action类是业务逻辑的载体,它负责处理用户请求并返回结果到视图。ActionForm对象用于封装HTTP请求参数,提供...
这个"J2EE: Struts2示例"旨在提供一个简单的入门教程,帮助初学者理解Struts2的核心概念和基本用法。 Struts2的核心是Action,它是业务逻辑处理的主要组件。Action负责接收用户请求,执行相应的业务逻辑,并将结果...
通过本文的介绍,我们可以看到Struts2配置文件以及相关代码示例对于理解和掌握Struts2框架至关重要。无论是配置文件中的各种元素还是JSTL、EL表达式的使用,亦或是ActionContext和拦截器的设计,都是开发者在实际...
在Action类中,还可以访问Web元素,比如HttpServletRequest和HttpServletResponse等,利用Struts2提供的API能够很便捷地实现这一功能。 此外,Struts2还提供了动态方法调用的机制,允许你在一个Action类中定义多种...
struts.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> ...