转载:http://www.cnblogs.com/ikuman/archive/2013/11/04/3403073.html

1、struts2自2.1以后推荐使用Convention Plugin支持struts零配置支持(引入jar:struts2-convention-plugin-2.x.x.jar)
①convention默认扫描所有实现com.opensymphony.xwork2.Action的类和指定包路径下以Action结尾的类名
②struts.convention.package.locators指定默认的根packages,struts.convention.action.packages指定搜索的packages下的action,

struts.convention.exclude.packages指定忽略的packages
③默认视图路径:WEB-INF/content(可通过struts.convention.result.path修改)
2、results和resultcodes
①容器启动后,convention会自动加载所有action和jsp
②可以指定不同的结果页面,action-resultcode.jsp
③可以认为默认匹配顺序为actionName+resultcode+suffix>actionName+suffix

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

3、chain链
①一个action调用同一个包中的另一个action
②若一个action未定义相对应的resultcode的result,且同一个包中有形如action-resultcode的action,如:

package com.example.actions;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport; public class HelloAction extends ActionSupport {
@Action("foo")
public String foo() {
return "bar";
} @Action("foo-bar")
public String bar() {
return SUCCESS;
}
}

此时,若未定义"foo-bar"的result,则convention尝试在同一个包下寻找action名为”foo-bar”的action。如果找到这样的action,
convention将会调用并返回相关联的result。
4、XWork packages
①为了避免冲突,可将action放在一个自定义XWORK的package下
②package命名由action所在的Java包,action对应的URL中namespace部分以及action的parent XWork package三个部分组成,即:

<java-package>#<namespace>#<parent-package>

③parent XWork package 值在属性 struts.convention.default.parent.package 中指定(默认为convention-default)

<constant name="struts.convention.default.parent.package" value="convention-default"/>

5、Annotation reference
Convention使用很多注解来重写默认插件的action到url的映射和result路径。同时,也可以通过修改parent XWork package
通过使用@Action注解,Convention plugin可以改变action映射的url,同时也可以使一个action对应多个url地址,例如:

package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action; public class HelloWorld extends ActionSupport {
@Action("/different/url")
public String execute() {
return SUCCESS;
}
}

这时,action映射的url地址将是/different/url,如果没有定义@Result,则该namespace下的action路径将被当作result path,即WEB-
INF/content/different/url.jsp
通过@Actions注解,一个方法可以对应多个url路径,如:

package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions; public class HelloWorld extends ActionSupport {
@Actions({
@Action("/different/url"),
@Action("/another/url")
})
public String execute() {
return SUCCESS;
}
}

另外一种使用@Action和@Actions的例子是在一个Action类中定义多个方法,使用不同的注解,对应不同的url,如:

package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions; public class HelloWorld extends ActionSupport {
@Action("/different/url")
public String execute() {
return SUCCESS; } @Action("url")
public String doSomething() {
return SUCCESS;
}
}

第二个方法中的相对路径注解不推荐使用,它的路径将取决与package对应的namespace而不是由Action注解决定
Interceptor和interceptor stacks同样可以使用注解,下面的例子使用了validation interceptor和defaultStack interceptor stack:

package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions; public class HelloWorld extends ActionSupport {
@Action(interceptorRefs={@InterceptorRef("validation"), @InterceptorRef("defaultStack")})
public String execute() {
return SUCCESS;
} @Action("url")
public String doSomething() {
return SUCCESS;
}
}

InterceptorRefs可用于方法或Action类,若用于类上,则对所有方法有效

package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions; @InterceptorRefs({
@InterceptorRef("interceptor-1"),
@InterceptorRef("defaultStack")
})
public class HelloWorld extends ActionSupport {
@Action(value="action1", interceptorRefs=@InterceptorRef("validation"))
public String execute() {
return SUCCESS;
} @Action(value="action2")
public String doSomething() {
return SUCCESS;
}
}
注意:如果遇到"Unable to find interceptor class referenced by ref-name XYZ",则说明在convention扫描Action类时,没有Interceptor指定的拦截器。处理方式为:1使用@ParentPackage注解(或者指定struts.convention.default.parent.package)指定定义了该Interceptor的package;2创建一个package并继承定义了该Interceptor的package,同时使用@ParentPackage(或者 struts.convention.default.parent.package)指定该package

同时也可以指定params参数,使用 {"key0", "value0, "key1", "value1" ... "keyN", "valueN"}形式

package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions; public class HelloWorld extends ActionSupport {
@Action(interceptorRefs=@InterceptorRef(value="validation",params={"programmatic", "false", "declarative", "true}))
public String execute() {
return SUCCESS;
} @Action("url")
public String doSomething() {
return SUCCESS;
}
}

若未指定interceptors,则使用default stack
如果将@Action,@Actions用于Action类,若该类中定义了execute,则该方法将用于action映射,否则应用的方法取决于请求
对于结果注解@Results可分为全局和局部,全局@Results定义在Action类,对所有方法有效,局部@Results定义在方法上,只对该方法有效

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="fail.jsp")
})
public class HelloWorld extends ActionSupport {
@Action(value="/different/url",
results={@Result(name="success", location="http://struts.apache.org", type="redirect")}
)
public String execute() {
return SUCCESS;
} @Action("/another/url") public String doSomething() {
return SUCCESS;
}
}

在@Results注解中可以使用@params, {"key0", "value0, "key1", "value1" ... "keyN", "valueN"}

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; public class HelloWorld extends ActionSupport {
@Action(value="/different/url",
results={@Result(name="success", type="httpheader", params={"status", "500", "errorMessage", "Internal Error"})}
)
public String execute() {
return SUCCESS;
} @Action("/another/url")
public String doSomething() {
return SUCCESS;
}
}

从2.1.7版本后,@Results可以被子类继承
对于@Namespace注解可应用于Action类和packages中,在类上使用时为非完全限定

package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace; @Namespace("/custom")
public class HelloWorld extends ActionSupport {
@Action("/different/url")
public String execute() {
return SUCCESS;
} @Action("url")
public String doSomething() {
return SUCCESS;
}
}

该Action类对应两个url: /different/url和/custom/url

@org.apache.struts2.convention.annotation.Namespace("/custom")
package com.example.actions;

应用于package时,子包不继承该namespace
对于@ResultPath允许改变默认的结果存放地址,该注解可用于Action类和package

package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ResultPath; @ResultPath("/WEB-INF/jsps")
public class HelloWorld extends ActionSupport {
public String execute() {
return SUCCESS;
}
}

经过注解,该Action类对应的result地址为/WEB-INF/jsps,而不是默认的/WEB-INF/content
对于@ParentPackage允许应用为Action类或java package定义不同的parent Struts package,也可以通过struts.convention.default.parent.package指定

package com.example.actions;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage; @ParentPackage("customXWorkPackage")
public class HelloWorld extends ActionSupport {
public String execute() {
return SUCCESS;
}
}

对于@ExceptionMappings可以指定Action类或方法的异常映射

@ExceptionMappings({
@ExceptionMapping(exception = "java.lang.NullPointerException", result = "success", params = {"param1", "val1"})
})
public class ExceptionsActionLevelAction { public String execute() throws Exception {
return null;
}
}
public class ExceptionsMethodLevelAction {
@Action(value = "exception1", exceptionMappings = {
@ExceptionMapping(exception = "java.lang.NullPointerException", result = "success", params = {"param1", "val1"})
})
public String run1() throws Exception {
return null;
}
}

对于jar包,Convention plugin默认不会扫描其中的Action,若希望扫描,则需要配置struts.convention.action.includeJars

<constant name="struts.convention.action.includeJars" value=".*?/myjar1.*?jar(!/)?,.*?/myjar2*?jar(!/)?">

注意,此处正则表达式匹配的是jar的路径而不是文件名,该路径下应包含jar并以"!/"结尾
Convention plugin可以自动重载配置的修改,扫描Action的改动,若要启用该功能,需要配置

<constant name="struts.devMode" value="true"/>
<constant name="struts.convention.classes.reload" value="true" />

生产环境下,强烈建议不使用该功能
6、Tips
①确保action的namespace与locators中的一个匹配,在locators后面的包路径后面,将作为action的namespace,同时将用于定位results。例如对于位
于"my.example.actions.orders"路径下的ViewAction将对应映射'/orders/view.action',并且结果必将位于/WEB-INF/content/orders,类似/WEB-
INF/content/orders/view-success.jsp
②使用Configuration Browser查看action映射
③打开跟踪或调试,如log4j中增加:log4j.logger.org.apache.struts2.convention=DEBUG
常见问题
①'There is no Action mapped for namespace /orders and action name view.'这意味着URL /orders/view.action为对应任何一个action类,检查namespace和该
名称的action
②'No result defined for action my.example.actions.orders.ViewAction and result success'这意味者action已成功映射到Url,但是Convention插件没有找到
success result,检查视图文件是否存在,类似/WEB-INF/content/orders/view-success.jsp
③'java.lang.Exception: Could not load org/apache/velocity/runtime/resource/loader/ClasspathResourceLoader.class'这发生在
struts.convention.action.includeJars匹配外部jar包时
④当使用自定义interceptor stack时,发生'Unable to find interceptor class referenced by ref-name XYZ'这意味着convention插件在解析actions时,没有继
承该Interceptor定义的那个package,解决方式有两种1)使用 @ParentPackage(或struts.convention.default.parent.package)指定定义了该拦截器的package;2)自
定义package并继承定义了该Interceptor的package,并使用@ParentPackage(或struts.convention.default.parent.package)指定
7、重写convention实现rent.package)指定

<bean type="org.apache.struts2.convention.ActionNameBuilder" name="MyActionNameBuilder" class="example.SultansOfSwingNameBuilder"/>
<constant name="struts.convention.actionNameBuilder" value="MyActionNameBuilder"/>

8、convention插件配置:

Name Default Value Description
struts.convention.action.alwaysMapExecute true Set to false, to prevent Convention from creating a default mapping to "execute" when there are other methods annotated as actions in the class
struts.convention.action.includeJars   Comma separated list of regular expressions of jar URLs to be scanned. eg. ".*myJar-0\.2.*,.*thirdparty-0\.1.*"
struts.convention.action.packages   An optional list of action packages that this should create configuration for (they don't need to match a locator pattern)
struts.convention.result.path /WEB-INF/content/ Directory where templates are located
struts.convention.result.flatLayout true If set to false, the result can be put in its own directory: resultsRoot/namespace/actionName/result.extension
struts.convention.action.suffix Action Suffix used to find actions based on class names
struts.convention.action.disableScanning false Scan packages for actions
struts.convention.action.mapAllMatches false Create action mappings, even if no @Action is found
struts.convention.action.checkImplementsAction true Check if an action implements com.opensymphony.xwork2.Action to create an action mapping
struts.convention.default.parent.package convention-default Default parent package for action mappins
struts.convention.action.name.lowercase true Convert action name to lowercase
struts.convention.action.name.separator - Separator used to build the action name, MyAction -> my-action. This character is also used as the separator between the action name and the result in templates, like action-result.jsp
struts.convention.package.locators action,actions,struts,struts2 Packages whose name end with one of these strings will be scanned for actions
struts.convention.package.locators.disable false Disable the scanning of packages based on package locators
struts.convention.exclude.packages org.apache.struts.*,
org.apache.struts2.*,
org.springframework.web.struts.*,
org.springframework.web.struts2.*,
org.hibernate.*
Packages excluded from the action scanning
struts.convention.package.locators.basePackage   If set, only packages that start with its value will be scanned for actions
struts.convention.relative.result.types dispatcher,velocity,freemarker The list of result types that can have
locations that are relative and the result location (which is the
resultPath plus the namespace) prepended to them
struts.convention.redirect.to.slash true A boolean parameter that controls whether or
not this will handle unknown actions in the same manner as Apache,
Tomcat and other web servers. This handling will send back a redirect
for URLs such as /foo to /foo/ if there doesn't exist an action that
responds to /foo
struts.convention.classLoader.excludeParent true Exclude URLs found by the parent class loader from the list of URLs scanned to find actions (needs to be set to false for JBoss 5)
struts.convention.action.eagerLoading false If set, found action classes will be
instantiated by the ObjectFactory to accelerate future use, setting it
up can clash with Spring managed beans

Struts2 - Conversion Plugin的更多相关文章

  1. Struts2 Convention Plugin ( struts2 零配置 )

    Struts2 Convention Plugin ( struts2 零配置 ) convention-plugin 可以用来实现 struts2 的零配置.零配置的意思并不是说没有配置,而是通过约 ...

  2. 基于struts2的ajaxfileupload异步上传插件的使用

    服务器端采用struts2来处理文件上传. 所需环境: jquery.js ajaxfileupload.js struts2所依赖的jar包 及struts2-json-plugin-2.1.8.1 ...

  3. Struts2框架04 struts和spring整合

    目录 1 servlet 和 filter 的异同 2 内存中的字符编码 3 gbk和utf-8的特点 4 struts和spring的整合 5 struts和spring的整合步骤 6 spring ...

  4. Struts2中的异步提交(ajaxfileupload异步上传(图片)插件的使用)

    server端採用struts2来处理文件上传. 所需环境: jquery.js ajaxfileupload.js struts2所依赖的jar包 及struts2-json-plugin-2.1. ...

  5. RESTful框架调研

    背景 当前的开放服务平台发展趋势,是服务使用者变得多种多样,其中既有各种前端设备(台式机.手机等),又有各种后端服务器,因此必须有一个统一的机制,方便各种服务使用者和开放服务平台进行通信.为了更好的实 ...

  6. JQUERY插件JqueryAjaxFileUplaoder----更简单的异步文件上传

    异步上传相信大家都做过类似的功能,JqueryAjaxFileUploader为我们提供了更简单的实现和使用方式.不过既然是JQUERY的插件那么它所依赖的环境大家都懂得.JqueryAjaxFile ...

  7. jquery之ajaxfileupload异步上传插件

    点我下载工程代码由于项目需求,在处理文件上传时需要使用到文件的异步上传.这里使用Jquery Ajax File Uploader这个组件下载地址:http://www.phpletter.com/d ...

  8. 腾讯ISUX网页前端代码分析

    看了一下腾讯ISUX网页,无论是pc端还是移动端,展示都挺好看的,先对其代码进行分析如下: 1,先看前三行代码 <!DOCTYPE html> <!-- 腾讯 ISUX 是腾讯集团核 ...

  9. maven(一) maven到底是个啥玩意~

    我记得在搞懂maven之前看了几次重复的maven的教学视频.不知道是自己悟性太低还是怎么滴,就是搞不清楚,现在弄清楚了,基本上入门了.写该篇博文,就是为了帮助那些和我一样对于maven迷迷糊糊的人. ...

随机推荐

  1. iOS开发之山寨版新浪微博小结

    在之前的博客IOS开发之新浪围脖中获取微博的内容是使用我自己的access_token来请求的数据,那么如何让其他用户也能登陆并获取自己的微博内容呢?接下来就是OAuth和SSO出场的时候啦.OAut ...

  2. 追根溯源:EntityFramework 实体的状态变化

    阅读目录: 1. 应用场景 2. 场景测试 3. 问题分析 4. 追根溯源 5. 简要总结 1. 应用场景 首先,应用程序使用 EntityFramework,应用场景中有两个实体 S_Class(班 ...

  3. 用于后台管理的列表数据控件:DataGrid和Select

    常听人说不喜欢javascript.然而我一个一直用C#做后端的人,最喜欢的编程语言就是javascript了,我接收它的优点,也接收它的缺点! 前段时间接触过easyui,用过里面的DataGrid ...

  4. Objective-C快速上手

    最近在开发iOS程序,这篇博文的内容是刚学习Objective-C时做的笔记,力图达到用最短的时间了解OC并使用OC.Objective-C是OS X 和 iOS平台上面的主要编程语言,它是C语言的超 ...

  5. 和JavaScript家的闭包玩玩捉迷藏

    JavaScript的闭包 首先声明,这是一篇面向小白的博客,不过也欢迎各位大牛批评指正,谢谢.   其实关于闭包各个论坛社区里都有很多的文章来讲它,毕竟闭包是JavaScript中一个特色,也正因为 ...

  6. 【原创】Kafka console consumer源代码分析(二)

    我们继续讨论console consumer的实现原理,本篇着重探讨ZookeeperConsumerConnector的使用,即后续所有的内容都由下面这条语句而起: val connector = ...

  7. ASP.NET Core开发-后台任务利器Hangfire使用

    ASP.NET Core开发系列之后台任务利器Hangfire 使用. Hangfire 是一款强大的.NET开源后台任务利器,无需Windows服务/任务计划程序. 可以使用于ASP.NET 应用也 ...

  8. 初识Mybatis框架,实现增删改查等操作(动态拼接和动态修改)

    此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢? 这个问题在我 ...

  9. python计算器

    思路:优先级处理思路一:正则表达式+递归(计算时间慢)思路二:堆栈的方式队列:先进先出电梯-->队列上电梯(入队123):第三个人3,第二个人2,第一个人1>>> li = [ ...

  10. R语言数据处理包dplyr、tidyr笔记

    dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了与其它数据库的接口:tidyr包的作者是Hadley ...