- 浏览: 141786 次
- 性别:
- 来自: 厦门
最新评论
-
占星:
[b][flash=200,200][url][img][li ...
hibernate结合spring怎么处理对象的延迟加载? -
accphc:
...
处理properties文件中key包含空格和等号的情况 -
赵武艺:
有没有办法不让jfreechart热点刷新页面?
有热点的JfreeChart柱型图(原创)[转] -
yuchensuifeng:
谢谢分享!刚学这个,现在去试试!
在struts2中使用JFreeChart -
wrrwhn:
Caused by: There is no result t ...
在struts2中使用JFreeChart
http://blog.csdn.net/CMTobby/archive/2007/09/02/1769390.aspx
Struts2 官方文档在讲述配置的时候,一开始就来了个“ 0 配置” (Zero Configuration) ,大意就是说在 struts 应用中不使用任何 xml 文件或者 properties 文件,元数据 (Metadate) 都用通过约定 (convention) 和注解 (annotation) 来表达的,而且这是 struts2 的一个新特性,目前仍在测试中,相关文档也很粗略。接下来的一部分讲述的就是 Annotation ,我粗略的看了一下,估计它就是“ 0 配置”的核心所在,我拿文档中最简单的一个例子来看一下:
@Result(name=
"success"
, value=
"/home.page"
, type=TilesResult.class)
public
class HomeAction
extends
ActionSupport {
// ...
}
红底的部分就是我们所说的 Annotation ,它说明这个当这个 action 返回值为 ”success” 时页面就跳转值 /home.pag ,就相当于我们在 struts.xml 中配置的 result 元素,采用了这个 Annotiation 之后我们就不用写配置文件了,实现了所谓的“ 0 配置”。一般我们在配置 actio 的时候都会出现多个 result ,这时 Annotation 就可以这么写:
@Results({
@Result(name=
"success"
, value=
"/home.page"
, type=TilesResult.class),
@Result(name=
"homeError"
, value=
"/homeError.page"
, type=tilesResult.class)
})
还有一个问题,如果没有配置文件我们如何知道去哪儿调用哪个 action 呢?为了完成这个功能我们需要这样配置 web.xml 文件:
<filter>
<filter-name>
struts2
</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
<init-param>
<param-name>
actionPackages
</param-name>
<param-value>
com.foo.bar,com.baz.quux
</param-value>
</init-param>
</filter>
其实也没什么特殊的,就是给我们的 Controller 加了一个参数 actionPackages ,从字面上理解, Controller 将会从 com.foo.bar 和 com.baz.quux 这两个包中去寻找 action ,具体的流程是这样的:
1 .系统首先通过 web.xml 文件装载 FilterDispatcher 类,它要有 actionPackages 参数
2 . FilterDispatcher 会初始化一个 Dispatcher ,并传递 actionPackages 的值
3 . Dispatcher 会初始化一个 ClasspathConfigurationProvider 对象,用它来存放一个或多个Configuration Providers
4 . Dispatcher 给 ConfigurationManager 对象 增加一个 ClasspathConfigurationProvider 来处理 actionPackages 参数
5 . Someone 会调用 ClasspathConfigurationProvider 的loadpackages 方法
6 .Loadpackages 会首先利用ResolverUtil 从所列package( 就是 actionPackages 参数的值 ) 中找到所有实现了Action 接口和名字带有Action 后缀的类,然后这些类会集中放入一个Set 集合中,然后这个Set 中的每个类都会被传递给processActionClass 方法
7 .processActionClass 首先确定命名空间,然后捕捉任何ParentPackage 和Results 类型的Annotation ,接着创建一个ActionConfig ,设置action name ,package name 以及results 。
步骤7 获取action 名字的规则是这样的:将action name 从任何“Action ”后缀前面截取掉,如果action name 含有“/ ”的话,那么将最后一个“/ ”后面的第一个字母变为小写。还是举例来进行说明吧:
如果我们的 actionPackages 参数是 com.myapp.actions ,我们的Action 类是 com.myapp.actions. member .EditAction ,那么我们可以通过下面的url 来访问这个类:http://server/myapp/member/edit.action . 也就是子包(subpackage) 将成为namespace ,而action 类名将成为action name 。如果类名有一个“Action ”后缀,那么它将被去掉。
至此我们就实现我们的“0 配置”了,^_^ ,Annotation 在其中还是扮演着非常重要的作用的,除了我们前面已提到的Result Annotation 这个Action Annotations 外,还有Interceptor Annotations 、Validation Annotations 和Type Conversion Annotations ,因为项目中基本上没有用到这个新特性,我也就没有深入的看这些Annotations 的详细使用方法了。
评论
摘要:介绍Struts2中的零配置(Zero Configuration),以及如何用COC来更好地简化Struts2的配置。在第一章,我使用Maven来创建一个起点项目;第二章,以该项目为例,讲解如何使用Struts2的零配置;第三章,论述第二章中的实现方式的缺陷,然后讲解如何使用COC来改进这些缺陷,并进一步简化Struts2的配置。附件是这篇文章用到的示例代码。
一、从零开始
这里,我将建立一个新的示例项目,作为讲解的起点。我使用JDK 6、Maven 2、Eclipse 3.3来建立这个示例,如果读者对Maven2不熟也没关系,这只是个示例。
首先,运行下边的命令:
mvn archetype:create -DgroupId=demo.struts -DartifactId=demo-struts-coc -DarchetypeArtifactId=maven-archetype-webapp
这会建立如下的目录结构:
|- POM.xml
|- src
|- main
|- resources
|- webapp
|- index.jsp
|- WEB-INF
|- web.xml
然后我们在src/main目录下新建一个名为java的目录,用来放置java代码。在src下建立test目录,并在test目录下建立java目录,用来放置测试代码。另外,我这个示例不想使用JSP,所以我将src/main/webapp目录下的index.jsp改为index.html。
现在,需要配置该项目要用到哪些lib。在POM.xml中加入struts2-core:
xml 代码
1. <dependency>
2. <groupId>org.apache.struts</groupId>
3. <artifactId>struts2-core</artifactId>
4. <version>2.0.9</version>
5. </dependency>
另外,我想在Eclipse里使用jetty来启动项目并进行测试,所以在POM.xml中再加入jetty、jetty-util、servlet-api等的依赖,详情见附件。
我希望使用Eclipse来作为这个项目的IDE,所以,我在命令行状态下,进入这个项目所在的目录,运行:
mvn eclipse:eclipse
然后使用Eclipse导入这个项目。如果你是第一次用Eclipse导入用Maven生成的项目,那你需要在Eclipse里配置一个名叫M2_REPO 的Variable,指向你的Maven 2的repository目录。缺省情况下,它应该位于${user.home}/.m2/repository。
OK!现在我们已经可以在Eclipse中进行工作了。
修改src/main/webapp/WEB-INF/web.xml,加入struts2的FilterDispatcher并设置filter- mapping。在这个示例中我将url-pattern设为"/app/*",也就是说,url的匹配是基于路径来做的。这只是我的个人喜好而已,你也可以将它设成"*"。
既然是在讲struts2的零配置,当然是可以不要任何配置文件的。但是为了更好地进行“配置”,我还是建立了 struts.xml文件(在src/main/resources目录下)。我不喜欢url最后都有个action后缀,现在,我在 struts.xml中配置struts.action.extension,将这个后缀去掉:
xml 代码
1. <struts>
2. <constant name="struts.action.extension" value="" />
3. </struts>
然后我在src/test/java下建立demo/RunJetty.java文件,main方法如下:
java 代码
1. public static void main(String[] args) throws Exception {
2. Server server = new Server(8080); //也可以改成其它端口
3. File rootDir = new File(RunJetty.class.getResource("/").getPath()).getParentFile().getParentFile();
4. String webAppPath = new File(rootDir, "src/main/webapp").getPath();
5. new WebAppContext(server, webAppPath, "/");
6. server.start();
7. }
现在,在Eclipse里运行或调试这个RunJetty.java,用浏览器打开http://localhost:8080/看看吧。如果不出问题,应该可以访问到webapp目录下的index.html了。有了Jetty,你还在用MyEclipse或其它插件么?
二、零配置
首先要澄清一点,这里说的零配置并不是一点配置都没有,只是说配置很少而已。
Struts2(我只用过 Struts 2.0.6和2.0.9,不清楚其它版本是否支持零配置)引入了零配置的新特性,元数据可以通过规则和注解来表达:A "Zero Configuration" Struts application or plugin uses no additional XML or properties files. Metadata is expressed through convention and annotation.
目前,这个新特性还在测试阶段,但经过一段时间的使用,我觉得这个特性已经可用。下面我讲一下如何使用它。
1. Actions的定位
以前需要在xml配置文件中配置Action的name和class,如果使用零配置,所带来的一个问题就是如何定位这些Action。我们需要在 web.xml中找到struts2的filter的配置,增加一个名为actionPackages的init-param,它的值是一个以逗号分隔的 Java包名列表,比如:demo.actions1,demo.actions2。struts2将会扫描这些包(包括这些包下边的子包),在这些包下,所有实现了Action接口的或者是类名以“Action”结尾的类都会被检查到,并被当做Action。
以前,我们写Action必须要实现Action接口或者继承ActionSupport。但是,上面提到的类名以"Action"结尾的类并不需要这样做,它可以是一个POJO,Struts2支持POJO Action!
下面是actionPackages的配置示例:
xml 代码
1. <filter>
2. <filter-name>struts2</filter-name>
3. <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
4. <init-param>
5. <param-name>actionPackages</param-name>
6. <param-value>demo.actions1,demo.actions2</param-value>
7. </init-param>
8. </filter>
2. 示例
现在我们建立demo.actions1.app.person和demo.actions2.app.group两个包,在 demo.actions1.app.person包下建立ListPeopleAction.java,在 demo.actions2.app.group下建立ListGroupAction.java。作为示例,这两个类只是包含一个execute方法,返回"success"或"error",其它什么都不做:
java 代码
1. public String execute() {
2. return "success";
3. }
在Filter的配置中,我指定actionPackages为demo.actions1,demo.actions2,当系统启动时,Struts2就会在这两个包下扫描到demo.actions1.app.person.ListPeopleAction和 demo.actions2.app.group.ListGroupAction。
3. Action and Package name
Struts2 扫描到Action后,从actionPackages指定的包开始,子包名会成为这个Action的namespace,而Action的name则由这个Action的类名决定。将类名首字母小写,如果类名以Action结尾,则去掉"Action"后缀,形成的名字就是这个Action的名字。在如上所述的示例中,actionPackages指定为demo.actions1,demo.actions2,那么你可以这样访问 demo.actions1.app.person.ListPeopleAction:
http://localhost:8080/app/person/listPeople
4. Results
Struts2是通过"Result"和"Results"两个类级别的annotations来指定Results的。
作为示例,我们在webapp目录下建两个html文件:success.html和error.html,随便写点什么内容都可以。现在假设我们访问 /app/person/listPeople时,或Action返回success就转到success.html页面,若是error就转到 error.html页面,这只需要在ListPeopleAction类上加上一段注解就可以了:
java 代码
1. @Results({
2. @Result(name="success", type=NullResult.class, value = "/success.html", params = {}),
3. @Result(name="error", type=NullResult.class, value = "/error.html", params = {})
4. })
5. public class ListPeopleAction {
6. public String execute() {
7. return "success";
8. }
9. }
同上,我们给ListGroupAction也加上注解。
现在,我们已经完成了一个零配置的示例。我们并没有在xml文件里配置ListPeopleAction和ListGroupAction,但它们已经可以工作了!
用 Eclipse运行RunJetty,然后用浏览器访问http://localhost:8080/app/person/listPeople和 http://localhost:8080/app/group/listGroup看看,是不是正是success.html(或 error.html)的内容?
5. Namespaces
如上所述,namespace由包名所形成,但我们可以使用"Namespace"注解来自己指定namespace。
6. Parent Package
这个配置用得较少。Struts2提供一个"ParentPackage"注解来标识Action应该是属于哪个package。
三、使用COC
如上所述,Struts2用注解来实现零配置。然而,这不是我喜欢的方式。在我看来,这不过是将配置从XML格式换成了注解方式,并不是真的零配置。而且,这种方式也未必比XML形式的配置更好。另外,对元数据的修改必然会导致项目的重新编译和部署。还有,现在的Struts2版本似乎对Result注解中的params的处理有些问题。
其实,Struts2的actionPackages配置已经使用了COC,那为什么不能为Results也实现COC,从而去除这些每个Action都要写的注解?
在严谨的项目中,package、action的名称和页面的路径、名称一定存在着某种关系。比如,页面的路径可能和package是对应的,页面的名称可能和action的名称是对应的,或是根据某种法则运算得到。我们知道webwork2和struts2有个配置叫global-results。我们为什么不能根据这些对应规则写个Result,将它配到global-results中,从而真正免去result的配置?
事实上,我推荐 Struts2的使用者只用Struts2输出XML或JSON,放弃UI,页面这层还是使用标准的HTML、CSS和一些JS组件来展现。许多人反映 Struts2慢,确实,Struts2是慢,很慢!慢在哪儿?很大一部分因素是UI这层引起的,特别是使用了过多的Struts2的tag,并使用了 ajax theme。但是,如果我们放弃了Struts2的笨拙的UI,Result只输出XML或JSON,UI则使用标准的HTML+CSS,使用JS组件(DOJO、Adobe Spry Framework、YUI-Ext等)来操作Struts2的输出数据,情况将会如何?我们会得到一个高性能、高可配的、UI和应用服务器的职责分割更为明确、合理的、更易于静态化部署的开发组合。
这似乎是阉割了Struts2,但是这样阉割过的Struts2摆脱了性能低下的包袱,更轻、更现代化。
有些扯远了,言归正传,不管是让Struts2输出XML或JSON,还是输出页面,我们都有办法根据项目的规则写一个Result,将它配到global-results中,从而大大减少Result的配置。
假设我们让Struts2只输出JSON,有个jsonplugin可以做这件事。使用JsonResult时,不再需要知道页面的位置、名称等信息,它仅仅是数据输出,那么我们就可以将这个Result配成全局的,大部分Action将不再需要Result的配置。
作为示例,我假设我的例子中输出的两个html页面(success.html和error.html)是JSON,我们看看怎么免去我例子中的两个Action的Result注解。
首先,我们删去ListPeopleAction和ListGroupAction两个Action的注解,并修改struts.xml文件,加入:
xml 代码
1. <package name="demo-default" extends="struts-default">
2. <global-results>
3. <result name="success">/success.html</result>
4. </global-results>
5. </package>
请记住这只是一个示例,为了方便,我没在项目中加入jsonplugin来作真实的演示,我只是假设这个success是json输出,读者可以自行使用jsonplugin来作实验。
现在,离成功不远了,但是项目仍然不能正常运行。我们的Action返回success,但并不会匹配到global-results中配置。为什么呢?因为,我们这里是把global-results配置到"demo-default"这个package下的,而Struts2根据 actionPackages找到的Action不会匹配到这个package上。解决办法也很简单,还记得上面讲到的Parent Package吧?给Action加个注解,指定ParentPackage为"demo-default"。但这样可不是我喜欢的,其实有更好的办法,我们在struts.xml中加个constant就好了:
xml 代码
1. <constant name="struts.configuration.classpath.defaultParentPackage" value="demo-default" />
现在,大功告成!运行RunJetty来测试下吧!你可以访问/app/person/listPeople,可以访问/app/group /listGroup,而所有的配置仅仅是web.xml和struts.xml中的几行,我们的Java代码中也没有加注解。如果再加上几百个 Action呢?配置仍然就这几行。
可是,某些Action确实需要配置怎么办?对这些Action,你可以加注解,也可以针对这些Action来写些XML配置。一个项目中,大部分Action的配置是可以遵从一定规则的,可以使用规则来简化配置,只有少部分需要配置,这就是COC。
注:附件demo-struts-annotations.zip是使用注解实现零配置的示例代码,附件demo-struts-coc.zip是使用global-results后的示例代码。
另外,我以前写过一篇文章《改写Restful2ActionMapper让Struts2支持REST风格的URL映射》,这里所说的零配置并不适用于支持REST。也就是说,你要用REST风格的URL映射,你就必须配置。不过还好,使用REST风格后,配置并不复杂。
另外我见到不少人使用Spring来配置和管理Action,其实完全没有必要!设置struts.objectFactory 等于spring就可以了,如果在Action中有setService1,这个service1在Spring中有配置的话,它会自动注入的。 Javaeye论坛中早有相关的讨论。
参考:
http://struts.apache.org/2.x/docs/zero-configuration.html
http://struts.apache.org/2.x/docs/zero-configuration-scanning.html
发表评论
-
Windows下手动安装PostgreSQL实践
2009-05-27 15:01 2635一、基本安装 1、下载postgresql-8.3. ... -
postgresql的安装
2009-05-27 11:05 5743postgresql是自由软件阵营中的一款很好的数据库软件,就 ... -
struts2 标签 简介
2009-04-21 16:14 1628来源: http://blog.csdn.net/yul ... -
Eclipse下J2ME开发环境的配置
2008-11-04 20:09 9532配置Eclipse 就是要到sun的网站下载JDK, ... -
使用Struts2 annotation 的Type Conversion
2008-06-13 17:40 2224当需要在jsp页面传递一组对象到action的时候,普通的类型 ... -
在hibernate中实现oracle的自动增长
2008-04-30 16:42 4850根据hibernate的文档,有两种方式实现实体对象的主键自动 ... -
Linux 上安装 Subversion
2008-03-11 16:34 2380引用Subversion是一个自由/开源版本控制系统,具备强大 ... -
使用firebug获得省市区信息
2008-01-27 18:24 1245有些网页有省份和城市的连动信息,可以使用下面的javascri ... -
利用JavaMail收/发Gmail邮件(SSL)
2007-12-27 18:34 4076利用JavaMail收/发Gmail邮件(SSL) Gmai ... -
[jQuery]date-picker的使用
2007-12-06 08:49 2110使用这个插件要下载两个东西,一个是date-picker.js ... -
加图片水印,加文字水印
2007-11-16 14:05 1514这个是加 ... -
如何把客户端上传的图片 先 加上水印再保存到服务端??????
2007-11-16 10:41 1536最近对图片加上水印, ... -
[转]玩转 Ubuntu:如何从源文件安装软件
2007-06-11 20:56 2572在班图中附带了丰富的 ... -
[转载]Linux下软件安装方法总结
2007-03-23 15:00 1775一、rpm包安装方式步骤: 1、找到相应的软件包,比如soft ... -
JAVA加密算法的实现用例
2007-01-20 21:28 3176对象 参数 algorithm 如:& ... -
手动安装ruby和rails
2007-01-06 15:26 2863进入软件开发行业也快一年了,很幸运一进入就加入了一个敏捷开发的 ...
相关推荐
在实际开发中,使用Annotation配置Struts2可以使代码更加简洁,更易于理解和维护。然而,也需要注意,完全依赖Annotation可能导致配置过于分散,对于大型项目来说,可能更倾向于混合使用XML和Annotation以达到最佳的...
在Struts2中,Annotation注解的引入为开发者提供了更加灵活和便捷的配置方式,使得无需在XML配置文件中进行繁琐的设置,可以直接在类或方法上通过注解来进行配置。本文将深入探讨Struts2中的Annotation配置,以及...
3. **Struts2 Annotation**:这是Struts2的一个特性,允许使用注解(如`@Action`、`@Result`等)来配置Action类和结果映射,替代传统的XML配置文件。 接下来,我们将探讨如何在Jetty中运行使用Struts2 Annotation的...
在Struts2中,注解的引入使得开发者可以实现零配置的编程,提高了开发效率和代码的可读性。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,广泛用于前后端数据传输。在Struts2中,通过集成JSON...
文件Spring_3300_Registration_11可能是一个示例项目,包含了上述整合的实例,包括Action、Service、DAO、配置文件等,开发者可以通过学习和运行这个项目来理解和实践Struts2、Hibernate3、Spring2.5的整合以及注解...
在给定的“struts2-Annotation”主题中,重点是Struts2框架如何利用注解(Annotation)来增强其功能和简化配置。注解是一种元数据,可以在代码中嵌入,提供有关类、方法或字段的额外信息,而无需编写XML配置文件。 ...
1. **Struts2注解**:Struts2提供了多种注解,如`@Action`, `@Result`, `@Results`, `@Namespace`, `@Package`, `@Include`等,它们可以用来替代XML配置文件中的元素。例如,`@Action`注解用于标记一个方法作为...
Struts2零配置是Struts2框架的一种简化配置方式,旨在减少XML配置文件的使用,提高开发效率。在传统的Struts2应用中,开发者需要在多个XML文件中配置Action、结果页面、拦截器等,而“零配置”则是对这种繁琐配置的...
2. **命名空间冲突**:`<mvc:annotation-driven />`内部可能包含了默认的拦截器配置,这可能与我们自定义的拦截器配置产生了冲突。我们需要确保自定义的拦截器配置不被默认配置覆盖。 3. **未正确注册拦截器**:...
通过这个"struts annotation Hello World"的学习,你可以掌握如何在Struts 2中使用注解来简化开发流程,同时也能对MVC架构有一个基本的理解。进一步研究Struts 2的其他注解和特性,将有助于构建更高效、更易于维护的...
赠送jar包:jakarta.annotation-api-1.3.5.jar; 赠送原API文档:jakarta.annotation-api-1.3.5-javadoc.jar; 赠送源代码:jakarta.annotation-api-1.3.5-sources.jar; 赠送Maven依赖信息文件:jakarta.annotation...
而"struts2 interceptor annotation plugin"则是Struts2框架提供的一种使用注解来配置拦截器的方式,这种方式更加简洁、直观,减少了XML配置文件的复杂性。 注解(Annotation)是Java编程语言的一个重要特性,它...
Spring 的 Annotation-Driven 配置事务管理器详解(多数据源配置) Spring 框架提供了强大的事务管理机制,通过使用 Annotation-Driven 配置,可以方便地管理事务。在多数据源配置中,spring 的 Annotation-Driven...
在Struts2中,注解的引入使得开发者可以摆脱繁琐的`struts.xml`配置文件,实现“零配置”运行。 首先,让我们了解什么是注解(Annotation)。注解是Java提供的一种元数据机制,允许在源代码中嵌入信息,这些信息...
在Struts2中,使用注解(Annotation)可以简化配置,提高开发效率。本篇文章将深入探讨如何在Struts2中通过注解实现返回JSON数据的功能。 首先,让我们理解JSON(JavaScript Object Notation)是一种轻量级的数据...
### Struts2 使用注解(Annotation)实现文件下载 在Web开发中,文件上传与下载是常见的需求之一。Struts2框架提供了强大的功能来支持这一需求。本文将详细介绍如何使用Struts2框架结合注解(Annotation)的方式...
知识点:Struts2框架下的注解批量下载实现与临时文件管理 在Struts2框架中,使用注解(Annotation)可以极大地简化控制器类的配置,提高代码的可读性和维护性。本文将深入探讨如何利用Struts2的注解功能实现批量...
本资料“struts配置大全(1、2全)”涵盖了Struts 1和Struts 2两个版本的核心配置,以及与Spring MVC的整合配置,旨在帮助开发者深入理解并熟练掌握Struts框架的配置方法。 **Struts 1配置** Struts 1的配置主要集中...