刘长炯ID:myeclipse_java
52545次访问,排名1991好友15人,关注者36
myeclipse_java的文章
原创 63 篇
翻译 0 篇
转载 0 篇
评论 66 篇
myeclipse_java的公告
刘长炯,中国北京,西安电子科技大学通信工程学士。曾任Synnex China公司系统架构师和Java讲师。擅长于Java EE 开源架构和WebLogic平台解决方案。
联系:beansoft@126.com
BeanSoft 参与主讲的1500元三大java项目特训特惠班(学习周期为一个月),参加者可获赠《MyEclipse 6 Java 开发中文教程》一书完整电子版、代码、视频,欢迎支持!
最近评论
nino_ht:同求。我的邮箱:nino_ht@yahoo.com.cn。谢谢!
mousepet:出了没有,收集了不少东西,作为工具包也不错
q279681950:我的279681950@qq.COM
cmzy232:下载地址:
http://www.blogjava.net/beansoft/archive/2008/08/17/222589.html
lanwilliam:没有下载连接啊
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 第十二章 开发Struts 2 + Spring应用 免费章节收藏

    新一篇: 推荐Ext的教程:ExtJS2.0实用简明教程 | 旧一篇: 深入理解JS中的对象和this

    第十二章开发Struts 2 + Spring应用


    第十二章 开发Struts 2 + Spring应用 1

    12.1 介绍 1

    12.2 下载Struts 2开发包 5

    12.3 开发第一个Struts 2应用 7

    12.3.1 准备工作 7

    12.3.2 开发HelloWorld 10

    12.3.3 使用国际化消息 16

    12.3.4 基于POJOAction开发 18


    本章将会简要介绍Struts 2的基本开发以及和Spring的整合应用开发。在笔者刚开始编写本书的时候,并未计划介绍Struts 2的内容。然而在写作的过程中,有两件事打动了我,使我下定决心将Struts 2的内容加进来。第一件事,是很多培训机构已经开始了Struts 2(或者WebWork)的课程,因此,有不少读者希望我能对这个框架做一些视频或者相关的介绍;第二件事,乃是在我根据网上的Struts 2整合Spring的文档进行练习的时候,很遗憾的发现要么介绍不全,要么是已经过时的做法,甚至官方自带的英文文档也有直接写错的地方,总之花了2个小时才算把例子做出来,使我深深的感到对于初学者来说(对我来说,Struts 2也是最近两周才看的,所以也算是这方面的初学者了),看着文档却作不出例子来,那是相当的痛苦啊。再加上Struts 2已经日益取得了广大程序员的支持和喜爱,因此我希望将我并不算太深入的经验和大家分享一下,希望能对您的学习有所帮助。

    本章并没有介绍Struts2+Spring+Hibernate整合开发是因为:Spring整合了Web层框架之后,剩下的就是Spring整合Hibernate还是JPA等其它框架,其过程是和Web层框架没有任何关系的。希望读者已经通过上两章的阅读了解这个概念,明白下面这个等式:

    Struts2 + Spring + Hibernate/JPA/其它框架= (Struts 2 + Spring+Spring + Hibernate/JPA/其它框架)。因此在本章的基础上,再结合上一章的内容,您可以自然而然的完成整合Hibernate或者其它框架的过程。


    12.1 介绍

    第九章开发 Struts 1.x 应用中我们已经简要介绍了Struts 2Struts 1之间的关系。WebWorkhttp://www.opensymphony.com/webwork/)是一个历史很悠久的优秀的Web层开发框架。根据一些资料我们了解到,WebWork 1 Struts 1是很接近的设计思路,比较紧耦合,这体现在它的控制器类必须继承自某些特定的类或者接口,需要单独的传值对象:FormBean,开发人员需要直接操纵requestresponsesession这些对象,页面的转向需要通过特殊的对象来完成(ActionForward)。然而WebWork 2之后,它大胆引入了插件机制,拦截器,依赖注入,以及POJO的开发模式,并对开发人员屏蔽底层的requestresponse等对象,页面的转向通过返回String类型即可完成,便于单元测试,并抛弃了一代中的表单Bean,让表单参数获取和Action对象合二为一,从而和JSF一道处于第二代Web框架的级别上(很遗憾的是Spring MVC到现在为止也还是停留在Struts 1的模式上,除了IOCSpring紧密集成之外,无其它特色,这也是它为何至今未被人视为优秀的Web开发框架的原因之一)。WebWork 2花了很大功夫来简化程序员负担,首先就是框架尽量避免让开发人员来在配置文件中编写不必要的内容,另外拦截器和IOC的配套使用,也大大简化了传统的一些任务例如文件上传。对于常见的动辄N兆的一堆库文件的不知该如何取舍的Web层框架来说,WebWork 2的插件机制可以让你在核心类库的基础上按需装配,根据项目的需要来自由增删类库文件(这是和Spring内核差不多的做法吧)。那么第三代Web层框架,目前来说尚未出现,据说尚未推出的JSF2.0版本将会支持号称无配置文件,纯标注(Annotation),POJO的开发模式,是否这就是第三代Web开发框架?根据文档,我发现Struts 2也正在进行无配置文件+标注版本的开发工作,看来这的确是个趋势啊。纵观现有框架,配置文件繁琐,要想用框架,必先XML+自定义标签库的确是个让人一直头疼不已的老毛病了(让人想起来了东方不败的那句欲练神功,挥剑自X),一个框架一套配置文件和标签库,的确是让开发人员苦不堪言。笔者从心底里希望JavaWeb层框架能易用化,标准化(大家都用一样的接口和标签库),开发工具智能化(微软Visual Studio .NET 那真不是盖的),开发人员傻瓜化……不过这样一来工资是不是也下降,我可就不知道了。

    后来StrutsWebWork进行合并,大家一起聚集在Apache基金会这棵大树下,借着Struts这个响当当的硬牌子,推出了Struts 2框架,大家不要误会,它仍然也是基于MVC模式的开发框架,所有WebWork 2的优点它这里也有。据一些文档的说法认为Struts 2就是WebWork的部分包重命名,配置文件稍作改动得来的,经过检验目前来看也的确如此。不过因为Struts 1WebWork 2仍然有大量开发人员喜欢使用,所以并未消失,仍然在各自的支持者下继续发展着。除了传统的例如流程跳转,国际化消息等等之外,Struts 2还支持AJAX等的开发(目前是基于DOJO框架的实现),多种表示层框架(不仅仅局限于JSP页面展示),以及插件机制,已经发展成了一个全面的Web层框架。

    注意:Struts 2Struts 1的代码并不兼容,包括包文件和配置文件都不一样,Struts 1的程序必须加以修改才能运行于Struts 2之下,可以认为它们是两个不同的框架!

    以下是其官方网站的特性介绍:

    • 开发!

      • 容易上手 – 从教程和模版程序或者Maven原型可以很容易的开发出新项目。

      • 改进的设计 – 清晰的代码设计对应着独立于HTTP的框架接口。

      • 增强的标签(Tag - 使用样式表驱动的表单标签以及所提供的标签可以减少编码量。

      • 有状态的复选框(Checkbox - 避免了特殊的处理代码,职能复选框能感知自己的状态何时被切换。

      • 灵活的取消按钮 – 取消时直接转向另一个操作(action)。

      • 最好的AJAX 支持 – 通过使用和标准Struts标签观感一致的 AJAX 标签,可以增加交互性和灵活性。

      • 方便的 Spring 集成 – 使用SpringAction中注入依赖关系,无需编写额外的连接代码或者其它配置 。(同时支持Plexus)

      • 增强的表示层展示 – 可以将处理结果以JasperReports, JFreeChart, Action , 或者文件下载的方式展示。

      • POJO 表单 – 不需要ActionForm! 可以使用任何JavaBean 来捕获输入或者直接将属性设置到Action类上。可以同时使用二进制和字符串类型的属性!

      • POJO Action使用任何类作为Action 类 – 甚至接口也是可选的!

    • 发布!

      • 方便的插件机制 – 添加JAR文件即可添加框架扩展。无需人工配置!捆绑的插件提供对JavaServer Faces, JasperReports, JFreeChart, Tiles... ...等众多框架的支持。

      • 内置调优 – 查看Struts2 内部,找到死循环的位置!

      • 准确的错误汇报 – 直接跳转到错误的位置和行号。

    • 维护!

      • 便于测试的Action可以直接测试Struts2 Action,无虚依赖任何模拟的 HTTP 对象。

      • 聪明的默认值 – 跳过明显的或者多余的设置。大多数框架的配置元素都有默认值可以使用,我们可以忘记它。只需要配置一次!

      • 容易自定义的控制器 – 需要时可以自定义每个Action的请求处理。Struts2 可以用你需要的方式来工作!

      • 内置调试 – 使用内置调试器可以生成问题报告。

      • 易于调整的标签 – 修改FreeMarker 模版即可自定义标签。不需要再学习 taglib API! 完全支持JSP, FreeMarker, 以及 Velocity 标签。

    Struts 2框架采用的许可是Apache License, Version 2.0,可以通过访问这个地址阅读:http://www.apache.org/licenses/LICENSE-2.0。当然是可以免费用于我们自己的商业软件的。它的标志图(Logo)如下所示:

    运行Struts 2需要下列的条件:Servlet API 2.4JSP API 2.0Java 5(或者使用j4版本,运行于JDK1.4)。当然换句话说用Tomcat 5或者更高版本就没有任何问题了。

    Struts 2的执行流程大致如此所示:Web服务器启动解析struts.xml,初始化消息文件,Action路径映射等资源,初始化框架→用户请求XXX.action →Struts 2过滤器使用对象工厂(Object Factory,可以是自带或者是Spring)创建Action类的示例 →执行IOC和拦截器(包括解析表单参数,文件上传,将解析结果注入Action对象) →调用Action中用户编写的业务方法 →根据返回的结果(Result)路径转向视图层 →视图层进行显示(包括调用标签库等)。

    关于其底层结构,从网上搜集到的一些资料认为:WebWork 2,实际上是 Webwork + XWork 的总集,Webwork1.x 版本中,整个框架采用了紧耦合的设计(类似 Struts 1.x),而WebWork 2.0 之后,Webwork 被拆分为两个部分,即 Webwork 2.x +XWork 2.x。当一个请求发起后,从请求的路径名中解析出对应的 Action 名称,然后Webwork 2.x框架会遍历 HttpServletRequestHttpSessionServletContext 中的数据,并将其复制到内部的 Map 实现中,至此之后,所有数据操作均在此 Map 结构中进行,从而将内部数据结构与 Servlet API 相分离。至此,Webwork 的工作阶段结束,数据将传递给 XWork进行下一步处理。从这里也可以看到 Webwork XWork之间的切分点,Webwork XWork提供了一个面向 Servlet 的协议转换器,将 Servlet 相关的数据转构转换成 XWork所需要的通用数据格式,而 XWork将完成实际的服务调度和功能实现。这样一来,以 XWork为核心,只需替换外围的协议转换组件,即可实现不同技术平台之间的切换。那么Struts 2呢,就是这样一个Struts 2核心平台+XWork的实现,其中的XWork部分执行和Servlet API无关的流程处理,而Struts 2的核心层则提供将Servlet层提供的数据进行独立封装的过程,进而XWork基于这些数据进行操作,这样就实现了一个完整的开发框架。XWork相当于一个插件一样和现有框架组合,构成一个完整的流程处理+Servlet操纵框架。所以大家会奇怪的看到Struts 2一共有两个核心jar文件:struts2-core-2.0.11.jarxwork-2.0.4.jar,而且更让人奇怪的是前一个文件中的包定义是org.apache.struts2,而后一个文件中的则是com.opensymphony.xwork2,其原因就在于此。本段所介绍的内容仅供提供更多信息之用,笔者不保证任何准确性和有效性。

    为了便于读者了解相关内容,我把搜集到的一篇关于Struts12的短文列在这里(来源见本章结尾参考资料):

    特性比较:

     

    Action

    Struts1.x要求Action类要扩展自一个抽象基类。Struts1.x的一个共有的问题是面向抽象类编程而不是面向接口编程。

    Struts2Action类实现了一个Action接口,连同其他接口一起来实现可选择和自定义的服务。Struts2提供一个名叫ActionSupport的基类来实现一般使用的接口。当然,Action接口不是必须的。任何使用execute方法的POJO对象可以被当作Struts 2Action对象来使用。

     

    线程模型

    Struts1.x Action类是单例类,因为只有一个实例来控制所有的请求。单例类策略造成了一定的限制,并且给开发带来了额外的烦恼。Action资源必须是线程安全或者同步的。

    Struts2 Action对象为每一个请求都实例化对象,所以没有线程安全的问题。(实践中,servlet容器给每一个请求产生许多丟弃的对象,并且不会导致性能和垃圾回收问题)。


    Servlet 依赖

    Struts1.xAction类依赖于Servlet API,当Action被调用时,以HttpServletRequestHttpServletResponse作为参数传给execute方法。

    Struts2Action和容器无关。Servlet上下文被表现为简单的Maps,允许Action被独立的测试。Struts2Action可以访问最初的请求(如果需要的话)。但是,尽可能避免或排除其他元素直接访问HttpServletRequestHttpServletResponse

     

    易测性

    测试Struts1.x的主要问题是execute方法暴露了Servlet API这使得测试要依赖于容器)。第三方的扩展,如Struts TestCase,提供了一套Struts1的模拟对象(来进行测试)。

    Struts2Action可以通过初始化、设置属性、调用方法来测试。依赖注入的支持也是测试变得更简单。

     

    捕获输入

    Struts1.x使用ActionForm对象来捕获输入。象Action一样,所有的ActionForm必须扩展基类。因为其他的JavaBean不能作为ActionForm使用,开发者经常创建多余的类来捕获输入。DynaBeans可以被用来作为替代ActionForm的类来创建。但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)。

    Struts2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己()属性的rich对象类型。Action属性能够通过web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种ModelDriven 特性简化了taglibPOJO输入对象的引用。

     

    表达式语言

    Struts1.x整合JSTL,所以它使用JSTL的表达式语言。表达式语言有基本的图形对象移动,但是对集合和索引属性的支持很弱。

    Struts2使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL)

     

    将值绑定到页面

    Struts1.x使用标准JSP机制来绑定对象到页面上下文。

    Struts2使用“ValueStack”技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。

     

    类型转换

    Struts1.xActionForm属性经常都是StringStruts 1.x使用Commons-Beanutils来进行类型转换。转换每一个类,而不是为每一个实例配置。

    Struts2使用OGNL进行类型转换。提供基本和常用对象的转换器。

     

    验证

    Struts1.x支持在ActionFormvalidate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。

    Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性

     

    Action执行控制

    Struts1.x支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。

    Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

     

    但是比较遗憾的是,目前MyEclipse 6Struts 2的开发还没有提供任何直接的支持,所以本章我们将不得不手工加入相关的jar文件来开发,不过您会发现相比较Struts 1来说,其开发过程要简单的多。

    在本章我将会依次给大家展示如何获取Struts 2的开发包,Struts 2软件包介绍,简单的HelloWorld的开发,以及基于POJOHelloWorld开发,接着我们将第九章的登录示例StrutsLoginDemoStruts2改写,并加入验证机制和国际化消息,最后我们则介绍如何使用Spring整合Struts2来通过Spring设置属性。


    12.2 下载Struts 2开发包

    要学习Struts的话,可以访问其官方网站http://struts.apache.org/2.0.11/ ,或者从网站http://struts.apache.org/ 进去后点击Struts2的链接进入,另外还可以阅读以Wiki形式组织的在线文档库http://cwiki.apache.org/S2WIKI/。当然网站都是由参与者自愿维护的,所以很多资料并不是特别的新,有时候可能还有错误。

    由于MyEclipse 6自身不带Struts 2的类库,因此我们必须手工下载它。在浏览器中键入地址http://struts.apache.org/download.cgi,即可进入Struts 的下载页面,如图12.1所示。值得注意的是在这个页面中同时包含Struts 12的下载包,显示在页面上方的是Struts 2,目前版本是2.0.11;下方的是Struts 1,目前版本是1.3.8。先来简要看看2的下载包有哪些内容。

    12.1 Struts 下载页面


    如图中所示,它的下载包分很多类型。先来看完整包(Full Distribution,大小为86MB,文件名是struts-2.0.11-all.zip。这个包比较完整,然而个头也非常大,内容包括了下面5个下载包中的全部内容。下载此包后解压缩可以看到在父目录struts-2.0.11下包含以下几个子目录:

    apps

    包含了四个war包形式的示例应用,附带有源码,读者可以发布到Tomcat下,也可阅读源码学习。

    docs

    包含了javadoc,以及在线文档的离线版本,可以双击index.html开始阅读,点击页面上的链接即可依次浏览全部内容,包括AJAX,文件上传等等。

    j4

    包括了用于JDK 1.4版本下的核心类库以及转换工具

    lib

    包括了Struts2的全部核心类库和依赖包

    src

    源代码目录

    12.1 完整包目录介绍


    。如果读者条件充分的话,例如用的是宽带,强烈简易直接下载这个包来使用,内容较全。

    完整包下面的是示例应用(Example Applications,大小为22MB,文件名是struts-2.0.11-apps.zip。它包含了上面完整包的apps目录下的四个war示例应用,它们是:

    struts2-blank-2.0.11.warstruts2-mailreader-2.0.11.warstruts2-portlet-2.0.11.warstruts2-showcase-2.0.11.war。第一个是精简的示例应用,大小为3.26 MB,包括HelloWorld和表单验证等例子,可以作为学习的入门例子。第二个乃是邮件阅读器的示例。第三个是门户(Portlet)的例子。第四个则是展示例子,里面列出了几乎所有Struts 2所支持的功能的示例,包括actionchainingajaxchatfiledownloadfileuploadjsfmodelDriven等等。

    再接下来是空应用(Blank Application Only,大小为3MB,文件名是struts2-blank-2.0.11.war,这个文件同时也包含在前两个发行包里面了。它包含了核心精简过的Struts 2空应用模版,在它的包的WEB-INF/lib目录下包含了下面几个jar文件:commons-logging-1.0.4.jarfreemarker-2.3.8.jarognl-2.6.11.jarstruts2-core-2.0.11.jarxwork-2.0.4.jar。如果再配合上Spring的库文件以及WebWork 的插件文件struts2-spring-plugin-2.0.11.jar,就可以进行两者的整合开发了。那么,在本章呢,我们就是基于这个例子再加上刚提到的Spring插件jar文件来进行示例应用的开发。在这里,我们简要的介绍一下这5jar文件的用途:

    struts2-core-2.0.11.jar

    Struts2的核心包

    xwork-2.0.4.jar

    XWork 2库,Struts2核心包作为底层库存在

    ognl-2.6.11.jar

    Object Graph Navigation Language (OGNL), 类似于EL表达式的一种用于访问对象的表达式语言

    freemarker-2.3.8.jar

    Struts2所有的ui标记的模板均使用freemarker编写,可通过修改或重写模板使struts2ui标记按用户的需要进行显示

    commons-logging-1.0.4.jar

    ApacheCommons Loggin包,封装了通用的日志接口,可自动调用Log4J 或者JDK 1.4或者更高版本的util.logging日志包

    再往下是基础依赖类库(Essential Dependencies Only,大小为4MB,文件名是struts-2.0.11-lib.zip,其中的文件是和完整包中的lib目录下的所有文件相同的。它包含了Struts 2的所有核心和插件类库,读者如果是要进行完整应用的开发,建议把这个目录下的所有jar文件放到Web应用的WEB-INF/lib目录下,这样比较保险。

    最后剩下的分别是文档(Documentation,对应完整包的docs目录;源代码(Source,对应完整包的src目录;可选的JDK 1.4版本的JAR文件(Alternative Java 4 JARs,对应完整包的j4目录。

    那么对于我们开发人员来说,如果手头已经有了Struts 2的参考资料,或者说对如何开发已经很熟悉,可以直接下载基础依赖类库(Essential Dependencies Only,那么初学者呢,如果网络不是太快,可以再加上下载空应用(Blank Application Only即可,如果希望深入全面的学习,还是下载个头最大的完整包(Full Distribution

    12.3 开发第一个Struts 2应用

    本节我们将进行简单的HelloWorld的开发,以及基于POJOHelloWorld开发,自定义Action方法和通配符,接着我们将第九章的登录示例StrutsLoginDemoStruts2改写,并加入验证机制和国际化消息。

    12.3.1 准备工作

    我们需要在 MyEclipse 中创建一个新的 Web项目,并向它添加必要的Struts 2类库和配置文件。现在我们来创建一个名为struts2helloWeb项目。选择菜单File > New > Web Project,可以启动创建Web项目的向导,如图8.3所示。在弹出的对话框的Project Name中输入struts2hello,然后选中J2EE Specification Level下面的Java EE 5.0 单选钮,最后点击Finish按钮就可以创建好这个Web项目了。

    项目创建完之后,我们需要给它加入Struts 2的类库。读者可以参考12.1的内容下载或者从完整包找到文件struts2-blank-2.0.11.war,接着用WinZIP或者WinRAR等解压缩软件解开它到电脑的硬盘上,然后将解出来的WEB-INF/lib目录下的5jar文件复制到当前Web项目的WebRoot/WEB-INF/lib下,具体的做法希望大家还记得:首先切换到Windows的文件浏览器中选中这5个解压缩出来的jar文件,然后按下快捷键Ctrl+C将它们复制到剪贴板上,然后我们再切换到MyEclipse的窗口,点击鼠标左键选中Package Explorer视图下的struts2hello项目的目录节点WebRoot/WEB-INF/lib,之后按下快捷键Ctrl+V,稍后这些jar文件就会被MyEclipse加入到项目的Build Path中,会出现在项目的节点Referenced Libraries之下。

    那么接下来我们还需要做两件事:添加过滤器和默认配置文件。我们还记得以前的Struts 1是在web.xml添加action servlet的方式来工作的,但是Struts 2则是需要注册一个FilterDispatcher,这个Filter拦截所有的请求(/*)使得Struts 2框架为您服务,当然默认条件下我们也可以只过滤*.action下的请求来使之工作。那么现在就打开文件web.xml(在我们的项目中,它位于WebRoot/WEB-INF/下),按照粗斜体部分代码将过滤器加入到配置文件中,完整代码如下所示:

    <?xml version="1.0" encoding="UTF-8"?>

    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">


    <filter>

    <filter-name>struts2</filter-name>

    <filter-class>

    org.apache.struts2.dispatcher.FilterDispatcher

    </filter-class>

    </filter>


    <filter-mapping>

    <filter-name>struts2</filter-name>

    <url-pattern>/*</url-pattern>

    </filter-mapping>


    <welcome-file-list>

    <welcome-file>index.jsp</welcome-file>

    </welcome-file-list>

    </web-app>

    一如我们所讨论过的,在这里默认条件下,您也可以把<url-pattern>/*</url-pattern>修改为<url-pattern>*.action</url-pattern>

    接下来做什么呢?以前的Struts 1 的开发,是要在WebRoot/WEB-INF/目录下创建配置文件struts-config.xml,那么现在Struts 2的开发呢,也需要一个类似的配置文件的,所不同的是它需要建在项目的src目录下,名为struts.xml,当项目发布以后,这个文件将会被复制到WEB-INF/classes下。那么在src目录上点击右键,选择菜单New > File,接着在弹出对话框中的File name右侧输入框中输入文件名struts.xml,点击Finish按钮关闭对话框后,即可打开这个这个空的struts.xml文件。然后我们把它的源代码修改为如下所示:

    <?xml version="1.0" encoding="UTF-8" ?>

    <!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

    "http://struts.apache.org/dtds/struts-2.0.dtd">


    <struts>


    <package name="default" extends="struts-default">

    <!-- 在这里添加Action定义 -->

    </package>


    </struts>

    。读者可以用复制粘贴将这些代码导入到编辑器中,无需再一一敲入了。我们可以注意到这个配置文件中出现了package,它类似于Java中的对象(注意和Javapackage的相似之处除了可以包含多个文件,或者说定义之外,没有其它类似点,因为Java中的包是不可继承的),其实就是可以将Action分类,划分到不同的package中,更主要的是这些包之间可以互相继承,包括拦截器,action映射等等都可以继承。举个例子,我们写了个通用的登录定义,那么另一个action就可以继承它。在这里可以看到extends="struts-default",这是个继承,那么继承的这个包定义在哪里呢?打开文件WEB-INF/lib/struts2-core-2.0.11.jar文件包里根目录下有个struts-default.xml文件里面定义了一个包:<package name="struts-default" abstract="true">,它为我们的应用程序提供了大量的默认配置,Strus 2解析配置文件的时候,会自动从类路径的根目录下依次先加载struts-default.xml里面的包定义,再解析我们自己编写的struts.xml。在稍后我们编写第一个HelloWorld示例的时候,还会继续深入的讨论packageaction的定义方式。

    另外,Struts 2还支持多个配置文件的定义方式,这在实际开发中,便于程序员分开维护,例如会将用户管理相关的模块写入user.xml。这个文件的内容和上面的默认struts.xml的格式是一样的,包括头定义。这个文件,同样也放在src目录的根下面,或者放在src下的某个子目录。最后呢,我们需要把它使用include指令加入到默认的struts.xml文件里面即可。下面是一个struts.xml的示例:

    <?xml version="1.0" encoding="UTF-8" ?>

    <!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

    "http://struts.apache.org/dtds/struts-2.0.dtd">


    <struts>

    <include file="user.xml"/>

    <include file="/util/POJO.xml"/>


    <package name="default" extends="struts-default" namespace="/a" >

    <!-- 在这里添加Action定义 -->

    </package>


    </struts>

    。当然在这种情况下,开发人员可以无需在主配置文件中加入任何package定义了。这也是Struts 2的一个特点,配置文件可大可小分割。

    注意:读者对此先做了解即可,在我们的例子中不做这方面的展示了,读者在阅读Struts 自带例子的时候可能会看到这个指令。

    至此为止,读者已经搭建好了Struts 2的开发环境了。

    12.3.2 开发HelloWorld

    现在介绍了这么多的准备知识,大家可能已经迫不及待的想要亲自做一个例子跑一下感受了。OK,现在我们就来开发一个最简单的HelloWorld例子。

    首先,新建Java类文件example.HelloWorld。选择菜单File > New > Class,或者点击工具栏上的按钮,在打开的新建类的对话框中,输入PackageexampleNameHelloWorld,点击Finish按钮后即可将此类创建。现在我们将其代码修改为如下所示:

    package example;

    import com.opensymphony.xwork2.ActionSupport;

    public class HelloWorld extends ActionSupport {

     

    public String execute() throws Exception {

    setMessage("你好!Struts 2");

    return SUCCESS;

    }


    private String message;


    public String getMessage() {

    return message;

    }

    public void setMessage(String message) {

    this.message = message;

    }

    }

    这个Action呢,大家可以看到它是继承自com.opensymphony.xwork2.ActionSupport这个类,而我们自己定义的业务方法,则是写在方法public String execute() throws Exception中,这里我们所做的操作极其简单,就是设置Action类自身的属性message的值为字符串"你好!Struts 2"。这个方法的其返回值为常量SUCCESS,其实取值就是字符串的success”。那么这个success应该跑到哪里去呢?所以接下来我们还需要在配置文件指明这个类该如何访问,以及最后的结果的显示页面路径。

    现在,在struts.xml中加入一个action定义,如下代码清单中粗斜体部分所示:

    <?xml version="1.0" encoding="UTF-8" ?>

    <!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

    "http://struts.apache.org/dtds/struts-2.0.dtd">


    <struts>

    <package name="default" extends="struts-default">

    <!-- 在这里添加Action定义 -->

    <action name="HelloWorld" class="example.HelloWorld">

    <result name="success">/HelloWorld.jsp</result>

    </action>

     

    </package>


    </struts>

    。可以看到action的名字(name)为HelloWorld,它的类(class)example.HelloWorld,同时它还有一个结果页面可以显示:/HelloWorld.jsp

    好了,接下来我们要创建这个显示层的JSP文件,选择菜单File > New > JSP(Advanced Template),在这个对话框中的 File Name(文件名)框中输入HelloWorld.jsp,然后点击 Finish 按钮即可创建这个 JSP 页面。接下来将HelloWorld.jsp的源代码修改为如下所示:

    <%@ page contentType="text/html; charset=GBK" %>

    <%@ taglib prefix="s" uri="/struts-tags" %>

    <html>

    <head>

    <title>Struts 2 示例</title>

    </head>


    <body>

    <h2><