struts2
-convention
既然说了是全注解
开发,而且我们已经实现了
Hibernate
与
Spring
的注解
。同样的,
Struts2
也能够做到用注解
来代替配置文件,
struts2
-convention
插件可以帮助我们完成这一功能。它是
struts2
提
供的一个插件,目前网上相关的中文文档主要是一个叫石太洋的人根据官方文档翻译的,很多网站与博客都有转载。我看了原文与译文,感觉讲的不够清楚,例子也
很简单。大象根据自己在项目中的实际使用情况,现将个人对这个插件的经验总结写出来与各位分享,希望与大家多交流,共同提高。
官方文档
请不要把地址中的两个大写
W
换成小写,否则是打不开页面滴!这个插件的使用其实非常简单,如果光看文档可能会觉得好像很麻烦。那么大象来告诉你怎样快速学习这个插件。
首先你要搞清楚,这个插件它会默认扫描所有包名为
struts
、
struts2
、
action
、
actions
下面的类。然后它会对实现了
Action
接口以及类名以
Action
结尾的这些类,作为
Action
来进行处理。
你可以重新定义按哪种包名进行扫描。比如本例设定,只扫描
web
包下面的所有类,因为我们将
Action
类都放在这个包下面。
那这个插件是怎么实现原来的配置信息的呢?它的映射规则是这样的,对于以
Action
结尾的的类,去掉
Action
,取剩下的部分,将所有的字母转换为小写,如果有驼峰式的写法,则用
"-"
连接符来连接不同的单词,这是此插件的默认方式。最终转换之后的就是请求地址,还是用例子说明。
com.bolo.examples.web.base.UserAction
按照上面的规则,请求地址就应该是
UserAction
去掉
Action
后缀,将其余部分转换为小写,所以
user
就是我们的请求地址。不过,这还没有完,因为这里面还有一个命名空间的路径,在通常的配置文件中,一般会将不同的功能进行划分,在
package
标签里加上
namespace
属性。使用这个插件,它会为你自动配上命名空间,默认的就是前面说到的以那四种名称为根目录的命名空间,它们之后的都将成为命名空间的名称。
com.bolo.examples.struts.UserAction
映射为
/user.action
com.bolo.examples.struts.base.UserAction
映射为
/base/user.action
要是我们不以
struts
或其它几种默认值为包名,又该怎么办呢?没关系,插件为我们提供了一种自定义根包的配置方式
<constant name="struts.convention.package.locators" value="web" />
上面这段配置是写在
struts.xml
里面的,它指定
web
为根,作用就相当于那四种默认值。
com.bolo.examples.web.base.UserAction
映射为
/base/user.action
com.bolo.examples.web.HelloAction
映射为
/hello.action
com.bolo.examples.web.HelloWorldAction
映射为
/hello-world.action
请一定注意驼峰写法的映射方式,假如这里不是
HelloWorld
,而是
Helloworld
,那就不会再是
hello-world.action
,而是
helloworld.action
了。
既然已经知道了它的映射方式,接下来再看看这个插件是如何定义结果页面的。
convention
默认会到
/WEB-INF/content
文件夹下面查找对应的结果页面,这个文件夹的名字可以修改,需要在
struts.xml
中定义
<constant name="struts.convention.result.path" value="/WEB-INF/jsp" />
文件夹的名字改成了
jsp
,这样定义后,
convention
就会在这个文件夹下面查找结果页面。它的查找路径与映射的命名空间有关。默认规则是,在请求的命名空间下面,根据请求名称再结合方法返回的字符串生成最终的结果页面名称,再配以后缀名。
convention
支持以
jsp
、
ftl
、
vm
、
html
、
htm
等五种后缀格式的文件。这里有个比较特殊的是如果方法返回
success
,那么可以不用将它与请求名称拼接起来,直接使用请求名称作为返回页面的名称。还是举例子说明。
比如上面这段代码,
HelloAction
处于我们定义的根包(
web
)下面,因此,它的
action
请求为
hello.action
。这时,会默认执行
execute()
方法,由于返回的是
success
字符串,所以页面的名称可以简写为
hello.jsp
,但是当执行
welcome
方法时,由于返回的字符串为
welcome
,这时的页面名称则为
hello-welcome.jsp
。
convention
就是遵循这样的规则来进行命名,当然这只是最基本的,我们再来看看稍微复杂点的东东。
这个
RoleAction
类的外部,加了两种注解
,它们的作用相当于配置文件中的
result
标签。
Results
是一个
Result
类型的数组注解
,里面可以包含多个
Result
配置。使用
Result
注解
来设置返回类型与返回页面,是不准备采取默认的定义方式。比如
HelloAction
就是我们采取的默认方式。另外对于有些特殊的返回类型,也需要显式的进行定义。
因为我对
RoleAction
中的
execute()
方法返回结果进行了显式的定义,所以,它将不再返回默认的
role.jsp
,而是
location
指定的
role-list.jsp
,
Result
注解
中的
name
值要与返回值对应。
当请求路径为
role!input.action
时,会执行
input()
方法,对于这个方法来说,由于没有进行显式的定义,所以它会按照默认的命名规则返回
role-input.jsp
。
而
redirectUser
方法的返回结果指定了一个
type
为
redirectAction
的值,这表示要对
Action
重定向,在
location
中也说明了是跳转到哪个
Action
。请注意这里指定的是
user.action
,当程序跳转到
UserAction
时,会默认执行
execute
方法。
假如说,你想执行其它方法该怎么办呢?可以在
location
里面这样定义,
location=
"user!input.action"
。请记住,重定向时,如果是跳转到其它
Action
或本
Action
中的其它方法,
type
要写成
redirectAction
。
更进一步,我还想带些参数过去,又该如何呢?请添加
params
属性,它是一个数组类型。可以这样定义,
params={
"role_id"
,
"${role_id}"
,
"role_name"
,
"
超级管理员
"
}
。
convention
文档中有说明,里面的参数是一个键值对,总是形如
key,value,key,value
。所以第一个
role_id
与第三个
role_name
都叫参数名,二和四则是参数值。另外注意下
"${role_id}"
的含义,这是使用的
OGNL
表达式取出存在于值栈中的名叫
role_id
的值。这是一种动态获取并赋值的方式,在采用配置文件的方式中,也可以这样运用,而
role_name
参数则是一个固定字符串值。需要特别注意的就是,作为参数名的
role_id
与
role_name
,一定要在指向的
Action
中有这两个同名的属性,并且还有
set
方法,这是用来给这两个属性赋值。而对于
${role_id}
,则要在当前这个
Action
中,有它的
get
方法。用于取值。
补充说明一下,在
Action
类中定义的全局变量,不是非得给它都加上
set
、
get
方法,这是根据实际情况来设置的。简单的说
get()
是获得值,
set()
是设置值。比如,你现在要在页面上显示
username
,那么就对这个属性设置
get
方法,如果只是对
username
设置值,从页面传值到
Action
,那只需要对它设置
set
方法就可以了。除此之外,我们也可以不采用
struts2
提供的值栈方式得到参数值,而是使用非常熟悉的
request.
getParameter()
方法来获取参数。至于实际怎么使用,由各位自己决定,不知道我这样说,大家能不能明白?
大象根据实际使用情况,发现动态参数的传递在
struts2
.1.6
存在
BUG
,如果需要使用这个功能,请将
struts2
升级到
2.1.8.1
版。
大象根据实际应用,建议大家统一在类名上面定义
Results
设置,这样做有利于开发与维护;不建议单独对方法使用
@Action
注解
来重新定义它的访问地址与返回结果,因为这样做有些破坏统一性,不过可以根据实际情况进行处理,但不要过多的使用。
struts.xml
整个
struts.xml
的配置文件就这么多,当然你自己还可以扩展,因为采用了注解
,所以以前的那些配置就再也看不到了。在这个文件中,
package
是继承
convention-default
,而没有继承
struts-default
,为什么呢?查看
convention
的
struts-plugin.xml
文件,我们可以发现
convention-default
继承了
struts-default
,所以这样写是没错的。另外的几个
constant
配置就是对
convention
的常量设置,请看注释。
关于
paramsPrepareParamsStack
拦截器栈,我准备在第五篇,对基础框架进行扩展的时候再详细的说明。大家如果等不急想学习下,可以在网上查找这方面的资料先看看。
web
大象是这样想的,如果一次讲的太多太复杂不利于理解和吸收,所以对于
web
层,大家从前面也看到了,代码很简单,因为本篇主要是讲
convention
插件的知识,然后实现一部分功能用于演示它的效果。下面贴上
web
和
WebRoot
目录结构、
UserAction
的代码,以及
jsp
代码。
请注意
web
包下面的层次结构,这与你的请求路径相关。
content
文件夹是插件默认指定的名字,你可以修改为别的名字。同样请注意在这个目录下面的文件与子文件夹的定义方式是和
web
层相同的。如果还没有理解,请再看下我对
convention
插件的说明。
在
web.xml
文件中,设置了一个
<
welcome-file-list
>
标签,定义了一个
index.jsp
,这文件里就一句代码
<%
response.sendRedirect(
"hello.action"
);
%>
它会去执行
HelloAction
的
execute()
方法,这方法里面什么逻辑都没有,直接返回结果页面
hello.jsp
${ctx}
是一个
EL
表达式,设置的是当前项目名称。我在文件开头加了一个静态包含,
<%@
include
file
=
"/common/taglibs.jsp"
%>
不管是
user.action
还是
role.action
,它们默认的执行方法都是
execute()
,点击这两个链接,返回指定的结果页面。
在
user.jsp
里面,用来循环的
list
,是根据
getList()
方法获取的,
struts2
会自动的分析出属性名。想一下,
list
的
get
方法是不是就是
getList()
呢?我之前说过,
get()
是获得值,
set()
是设置值
。在这里我只是要在列表页面上得到
list
集合,没有其它的需求,所以不用像这样定义
private List list
,再然后给它加上
set()
、
get()
方法,因为要得到
list
集合,所以还要在
execute()
方法里面写上
list =
userManager
.getUsers()
,
这样做有必要么?我一直都在遵循优雅、高效、简洁的代码风格,并且一直都在朝这方面努力,也提倡大家这样做。编程是门艺术,而不是一种工作,不要把它当工
作看,只想着完成任务,拼命的堆代码。这样做很难有提高。应该换一种心态去对待它,用艺术的眼光来重新审视你的代码,你会发现这很有乐趣,也会学到很多。
自己的一点浅薄之见,让各位见笑了。
这部分的内容就说到这里,下一篇将对
paramsPrepareParamsStack
拦截器栈进行详细说明,另外再对框架进行一下扩展,封装
CRUD
功能,只要没有特殊的业务逻辑,在你的实际
Action
中,再不会看到增删改查这些基本功能。
分享到:
相关推荐
Struts2注解详细说明文档,详细讲述struts2的注解使用
Maven实现struts2注解
该例子为struts2注解与拦截器demo,利用myEclipse8.5开发,导入刚才后,自动加载所需struts2的jar包,可以直接运行,是初学struts2注解、拦截器很好的例子,保证10分钟学会2种技术,愿意分享给大家。
Struts2注解开发jar,必须导入struts2-convention-plugin-2.3.15.jar包,它在struts2安装包下lib目录中。
注解实现的页面跳转其特点是不用配置文件struts.xml因而可以实现零配置,同时由于有注解的功能,所以说大大增加了程序的可维护性。
Struts2Demo 注解的小例子,jar包全包括
从struts2.1开始,struts2不再推荐使用Codebehind作为零配置插件,而是改为使用Convention插件来支持零配置,和Codebehind相比,Convention插件更彻底,该插件完全抛弃配置信息,不仅不需要是使用struts.xml文件进行...
本文档对利用struts2 注解 annotation 实现文件下载作了简单介绍,并有代码为例,希望对学习struts2注解annotation的人有帮助,特别是需要动态传参方面。
Struts 2使用注解配置Action,不配置struts.xml,通过注解直接配置action
struts2-convention-plugin-2.1.8.1.jar
Struts2+spring注解配置 很好哦
struts2 注解 配置 资料 最近学习struts2的注解配置,从网上找的一些资料,分享给大家。
maven整合struts2全注解,
从struts2.1开始,struts2不再推荐使用Codebehind作为零配置插件,而是改为使用Convention插件来支持零配置,和Codebehind相比,Convention插件更彻底,该插件完全抛弃配置信息,不仅不需要是使用struts.xml文件进行...
struts2注解配置Action及拦截器几种不同方式写法对应的路径指向.docx
很多人在学习struts2注解的时候,都被它莫名其妙的错误搞的郁闷,而网上关于这方面的东西大多都是基于struts2.0版本的,对我们现在用的2.1以上的版本不起什么作用,所以特整理出一份文档,里面详细说明了怎样用注解...
《Struts2注解配置》 ——系列精品教程
解决Struts2下载中文出现乱码情况,已通过测试,
这是我自己写的一个struts注解的小实例,非常的实用,大家一看就懂的
spring和struts2注解讲解说明和使用