Strus2的Convention插件支持可以使我们无需在struts.xml中配置action。要想使用此功能,只需要将struts2-convention-plugin这个包导入即可。


Action的搜索和映射约定

当导入了这个包之后,框架就会自动搜索位于action、actions、struts、struts2包下面的所有java类。然后会自动把集成了ActionSupport或者类名以Action结尾的java类当做是action的实现类。只要包的全路径里面含有这四个包名,框架就回去搜索。此外我们还可以设置三个常量,以制定要搜索那些包,不搜索那些包。

struts.convention.exclude.packages用于指定不扫描哪些包。

struts.convention.package.locators用于指定搜索action的根包。

struts.convention.action.packages用于指定要搜索的根包。有了这个常量,除了上述四个名字的包会被搜索之外,这个常量所指定的也会被搜索。

一旦找到某个action后,根据这个action的包名,类型来生成命名空间与action名。action、actions、struts、struts2这些会作为根命名空间,它们后边的包名会变成命名空间。而类名经过处理后会作为action名。类名若包括Action后缀,则去掉,然后将名字由驼峰写法变为-写法。

比如说com.cm.actions.users.UserLoginAction会被影射成url为users/user-login


按约定映射result

result也不需要在xml中配置了!只需要在WEB-INF下建立一个content文件夹,然后按照url的写法,建立包,或者不在建立直接写。比如说上面的users/user-login,它的众多结果们就是在/WEB-INF/Content/users/user-login-success.jsp


Action链的约定

由于无论是要跳转到视图资源还是另一个action,action实现类的返回值都是一个字符串,所以在Convention约定里面的action链的实现需要有如下条件:

action的返回字符串不能对应任何视图资源。

第二个action与第一个处于同一个包下。

第二个aciton的命名比较特殊,是第一个action的名字+返回值。比如第一个action叫CheckUserName,当返回了next字符串之后希望到下一个action中继续处理,则要在同一个包下建立名为CheckUserNameNext。为什么返回值是小写的,到了类名就变成大写了呢?因为返回值与url相同,都是小写的,即url应该是/命名空间/check-user-name-next,而对应于驼峰写法的类名,就要变成大写的。


配置自动加载映射

改变了aciton之后,映射规则也随之改变,因此我们希望架构能够自动加载映射关系。这时候我们只需要配置两个常亮即可。

struts.devMode配置为true,表示Struts2应用处于开发模式,需要经常调试。

struts.convention.classes.reload配置为true,表示插件会自动加载映射。