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注解登录是Java Web开发中一种简化配置的方式,它允许开发者在代码中直接定义控制器、动作和结果页面的映射,从而避免了传统方式下需要在`struts.xml`配置文件中的繁琐设置。这种做法提高了代码的可读性和可...
本教程将通过一个"Struts2注解Demo"来深入探讨Struts2中的注解用法,帮助开发者更高效地配置和管理Action类。 首先,Struts2的注解允许我们避免传统的XML配置,从而实现更加简洁、直观的编程方式。在`Struts2Demo`...
以上对Spring和Struts2注解的详细介绍,旨在帮助开发者更好地理解和运用这两个框架,提高开发效率和代码质量。通过合理地使用这些注解,可以显著减少项目中的配置负担,使代码结构更加清晰、维护性更强。
本知识点将详细介绍Struts2中的注解开发及其核心组件。 标题提到的"Struts2注解开发jar"主要指的是`struts2-convention-plugin`,这是一个Struts2的插件,它的主要作用是支持基于约定优于配置(Convention over ...
该例子为struts2注解与拦截器demo,利用myEclipse8.5开发,导入刚才后,自动加载所需struts2的jar包,可以直接运行,是初学struts2注解、拦截器很好的例子,保证10分钟学会2种技术,愿意分享给大家。
<constant name="struts.objectFactory" value="struts注解工厂类全限定名,比如:org.apache.struts2.spring.StrutsSpringObjectFactory" /> <package name="default" extends="struts-default"> ...
### Struts2 注解详解 #### 一、Struts2 Convention 插件介绍与使用 在 Struts2 框架的发展过程中,随着版本的更新和技术的演进,其配置方式也发生了变化。从 Struts2.1 版本开始,官方不再推荐使用 Codebehind ...
### Struts2注解详细说明 #### 一、概述 Struts2框架是Apache软件基金会下的一个开源项目,它提供了一种构建企业级Java Web应用的解决方案。自Struts2.1版本开始,引入了一个重要的插件——Convention Plugin,该...
"struts2注解必须包"指的是Struts2提供的一系列注解,它们对于简化Struts2应用的配置和增强其功能至关重要。 标题中的"struts2-convention-plugin-2.1.8.1.jar"是Struts2的约定插件(Convention Plugin)的一个特定...
然而,随着Java注解的广泛应用,Struts 2也引入了注解配置的方式来简化开发过程,避免了XML配置的繁琐。 在"Struts 2使用注解配置Action"中,我们不再需要在struts.xml中为每个Action类手动添加配置。相反,我们...
Struts2 和 Spring 的整合是企业级 Java Web 开发中常见的技术栈,通过注解配置可以使项目更加简洁、易于维护。Struts2 提供了一种使用注解替代 XML 配置的方式,使得开发者无需编写繁琐的 struts.xml 文件,即可...
本文详细介绍了Struts2框架中注解配置的基本概念和技术要点,通过具体的示例帮助读者更好地理解和运用这些技术。在实际开发过程中,合理利用Struts2的注解配置可以极大地提高开发效率和代码的可维护性。希望本文能够...
本文将详细介绍如何使用Struts2框架结合注解(Annotation)的方式实现文件下载功能。 #### 一、Struts2框架简介 Struts2是一个基于MVC架构的Java Web应用框架,它继承了Struts1的优点,并在此基础上进行了改进。...
本文档是对Struts2注解配置教程的知识点概述,详细介绍了Struts2中注解配置的使用方法和优势,帮助开发者掌握如何通过Java注解简化和优化Struts2框架的配置过程。通过零配置概念,减少XML配置的复杂度,使得代码更加...
在这个小实例中,我们将深入探讨如何利用Struts2的注解来构建一个简洁而高效的Web应用。 首先,让我们了解什么是注解。在Java中,注解是一种元数据,它提供了一种安全的方法来向编译器、JVM或框架提供信息。Struts2...
Struts2注解配置是Java Web开发中一种高效、简洁的框架配置方式,它允许开发者在类或方法级别上直接定义Action、结果类型、参数映射等信息,从而避免了传统XML配置文件的繁琐。本资料集合了关于Struts2注解配置的...
Struts2 是一个流行的Java Web框架,用于构建MVC(模型-视图-控制器)架构的应用程序。在Struts2的版本2.1之后,它引入...例如,可以使用Struts2的注解(如`@Action`,`@Result`等)来覆盖或补充Convention的默认行为。
在本资源中,我们将探讨如何利用Struts2的注解方式来实现文件的上传和下载功能,这对于任何Web应用来说都是至关重要的特性。 首先,我们来看“注解”在Struts2中的作用。Struts2允许开发者使用注解来配置Action类,...
下面,我们将通过详细的解释和示例代码,来介绍 Struts2 中的注解配置 Action 及拦截器几种不同方式的写法对应的路径指向。 一、Struts2 中的 Action 在 Struts2 中,Action 是处理用户请求的核心组件。Action ...
本文将详细探讨如何使用Maven来整合Struts2,并利用全注解的方式简化配置,提高开发效率。首先,让我们理解这三个组件的核心作用: 1. Maven:是一个项目管理工具,它帮助开发者管理项目的构建、依赖、版本控制等。...