以前使用struts2 的 2.3.4 版本,做的一个项目,使用了stuts2的 Rest与Convention插件,然后动态访问某个action中的方法时,都是使用 “!” 去进行指定的,如
http://127.0.0.1:7070/oa/login!login
这样的话,convention插件会自动去查找 LoginAction 中的 login() 方法。
这样做一直没什么问题。但昨天将struts2的版本升级到 2.3.20之后,再去访问这个URL的时候,一直报下面这个错
java.lang.NoSuchMethodException: com.test.action.LoginAction.create()
很是纳闷,这是为什么呢?
后来在struts2官方文档上找到如下的这段注释:
This Restful action mapper enforces Ruby-On-Rails Rest-style mappings. If the method is not specified (via '!' or 'method:' prefix), the method is "guessed" at using ReST-style conventions that examine the URL and the HTTP method. Special care has been given to ensure this mapper works correctly with the codebehind plugin so that XML configuration is unnecessary.
它说如果URL没有使用 “!” 或者 "method:" 去指定要访问方法时,会基于REST风格去“猜测”要执行的方法。即按照下面所列的规则去猜测:
这样就对得上了,我的LOGIN请求是以POST方式发送的,所以被对应到了 create() 方法。
但是,我的URL里明明就通过“!”指定了要访问的方法为 login() 了啊,为什么不起作用呢?没办法 只好进行debug了。果然,发现了下面的这段处理:
org.apache.struts2.dispatcher.mapper.DefaultActionMapper.parseActionName protected ActionMapping parseActionName(ActionMapping mapping) { if (mapping.getName() == null) { return null; } if (allowDynamicMethodCalls) { // handle "name!method" convention. String name = mapping.getName(); int exclamation = name.lastIndexOf("!"); if (exclamation != -1) { mapping.setName(name.substring(0, exclamation)); mapping.setMethod(name.substring(exclamation + 1)); } } return mapping; }
它的if语句判断了“allowDynamicMethodCalls”是不是true,是true的话,才会去截取“!”后的方法名作为要执行的方法名。那么“allowDynamicMethodCalls”又是什么呢,它的值是怎么设定的呢?请看:
@Inject(StrutsConstants.STRUTS_ENABLE_DYNAMIC_METHOD_INVOCATION) public void setAllowDynamicMethodCalls(String allow) { allowDynamicMethodCalls = "true".equalsIgnoreCase(allow); }
也就是说它的值是由strtus2进行inject 的,inject的字段为“StrutsConstants.STRUTS_ENABLE_DYNAMIC_METHOD_INVOCATION”,而这个“StrutsConstants.STRUTS_ENABLE_DYNAMIC_METHOD_INVOCATION”就是
/** Allows one to disable dynamic method invocation from the URL */ public static final String STRUTS_ENABLE_DYNAMIC_METHOD_INVOCATION = "struts.enable.DynamicMethodInvocation";
看到这,大家应该看明白了吧?
它就是“default.properties”中的“struts.enable.DynamicMethodInvocation”这个配置项。
(PS:这份文件在 struts2-core-xxxxx.jar 的 “org.apache.struts2” 目录下)
在2.3.4中,这个配置项默认是 true,所以以前的项目运行是没有问题的,
而在2.3.20版本中,这个值默认是false,所以会报错。
那要怎么做呢?其实很简单啦,只要在"struts.xml"覆盖一下就可以了:
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
这个例子告诉我们,你要哪个功能,最后将其配置项明确的配置出来,不要依赖框架本身提供的默认值,谁知道框架会不会改它的默认值呢?
相关推荐
由于 Struts 2 的 Convention 插件的主要特点是“约定优于配置”,当我们已经习惯了 Struts 2 的基本开发方法之后,如果希望改为使用 Convention 插件也非常容易,我们只要放弃 Stuts 2.1 应用原有的配置文件,改为...
### Struts2-Convention插件使用详解 #### 引言 自Struts2.1版本起,Convention插件被引入,旨在替代原有的Codebehind插件,实现框架内的零配置理念。这一插件的设计思想围绕着减少XML配置的依赖,通过代码结构与...
将 Struts 2 项目下 struts2-convention-plugin-2.1.6.jar、struts2-rest-plugin-2.1.6.jar 两个 JAR 包复制到 Web 应用的 WEB-INF/lib 路径下。 由于 Struts 2 的 REST 插件还需要将提供 XML、JSON 格式的数据,...
8. **插件集成**:Convention插件与其他Struts2插件(如Validation、Tiles等)很好地协同工作,使得整个框架更加灵活和强大。 总结起来,Struts2的Convention配置是一个强大的工具,它让开发者能够专注于业务逻辑,...
Struts2 Convention Plugin 是从 Struts2.1 版本开始引入的一个插件,它的主要目标是实现 Struts2 框架的零配置。通过约定优于配置的原则,开发者可以更加专注于业务逻辑,减少大量的 XML 配置工作。以下是 ...
2. **struts2-convention-plugin.jar** - 提供了约定优于配置的特性,允许根据类名和方法名自动映射Action。 3. **struts2-config-browser-plugin.jar** - 用于在Web应用中浏览器查看Struts配置的插件。 4. **xwork-...
改为使用Convention插件提供“零配置”,Struts 2.1新增了Portlet支持……为了让众多Struts学习者、工作者快速从Struts 2.0的开发升级到Struts 2.1,笔者升级了《Struts 2权威指南》,第二版改写了第一版中所有程序...
Struts2 Convention Plugin 是一个用于简化 Struts2 配置的插件,自 Struts2.1 版本起引入,旨在实现零配置或者最少配置的开发环境。它通过一系列预定义的规则和约定,自动将请求映射到相应的 Actions 和结果页面,...
若希望在现有项目中融入Convention插件,特别是在结合RESTful设计时,可在项目的struts.xml中加入特定配置,如: ```xml <constant name="struts.convention.action.suffix" value="Controller"/> <constant name="...
5. `struts2-convention-plugin.jar`:提供了约定优于配置的特性,让开发者可以避免大量XML配置,通过类名和方法名自动匹配Action和结果。 6. `struts2-json-plugin.jar`:这个插件支持JSON格式的数据交互,便于与...
- Struts2拥有丰富的插件生态系统,如REST插件、Ajax插件、Freemarker和Velocity模板插件等,可以扩展框架的功能。 9. **与Spring的整合** - 使用`struts2-spring-plugin`,可以直接在Spring容器中管理Action实例...
6. **struts2-convention-plugin.jar**:此插件提供了约定优于配置的功能,使得开发者可以快速构建应用,而无需编写大量的XML配置。 7. **struts2-json-plugin.jar**:这个插件支持JSON数据格式的输入和输出,方便...
自Struts2.1版本开始,引入了一个重要的插件——Convention Plugin,该插件通过一系列约定简化了Struts2的配置过程,使得开发者可以更加专注于业务逻辑而非繁琐的配置。 #### 二、Struts2 Convention Plugin核心...
- 尽量使用Convention插件,减少XML配置。 - 定义明确的命名规则,便于Action和Result的自动映射。 - 使用拦截器优化性能和增强功能,如日志、权限控制等。 7. **安全注意事项** - OGNL注入:确保用户输入不能...
总的来说,Struts2 Convention插件通过约定优于配置的方式,极大地简化了Struts2应用的开发工作,提高了开发效率,同时也保持了代码的整洁和可维护性。通过合理的命名和注解,开发者可以轻松地创建和管理Action、...
7. ** strut2-convention-plugin**:一种约定优于配置的插件,允许开发者通过命名规则自动映射Action和方法,减少XML配置工作。 8. **struts2-core**:核心库,包含Struts2的基本功能,如Action、Interceptor、...
12. **struts2-ognl.jar**:OGNL(Object-Graph Navigation Language)是Struts2中使用的表达式语言,用于访问和修改对象的属性。 13. **struts2-java5-plugin.jar**:针对Java 5特性的支持,如注解。 14. **...