[zz]struts2入门之HelloWorld
时间:2010-05-25 来源:huixiangtao
来源:http://www.blogjava.net/tczengjin/archive/2007/10/30/fwh.html
本文为本人第一次写作,当时正是本人准备考研时期(10月,我估计那时我疯了,线性代数还没看完呢!!!),哪怕写得再烂也请转载的给留个出处,谢谢!!!留两个QQ群,欢迎共同学习814047 47385435
今天写篇关于struts2入门的文章吧,如有不妥或不对之处,请于http://bbs.heyjava.com/bbs/index.asp?boardid=2留言回复,我会尽快改正的,该文章主要参考struts2官方入门文档,原文请参看http://struts.apache.org/2.x/docs/bootstrap.html,我的系列文章会对原文做适当增改,以我这样的一个初学者的角度行文,那么还是照老规矩,我们的struts2旅程从Hello World开始吧!
首先简要介绍下我使用的开发环境吧:Eclipse3.3 IDE For Java EE Developers下载地址:http://www.eclipse.org/downloads/,JDK5或以上版本,Struts2.0.9(呵呵,在我写作的同时Struts2.0.11已经发布,下载地址http://struts.apache.org/download.cgi#struts206)将下载的struts-2.0.11-all.zip解压将struts2开发所必需的jar包加入你的classpath(在Eclipse wtp项目结构下拷贝到WebContent/WEB-INF/lib目录下即可),我的做法是在Eclipse下创建了一个struts库如图所示:
struts2-core.jar |
Struts2的核心api,也是我们以后打交道最多的 |
xwork.jar |
Struts2(同Webwork一样)建立在XWork 2库的基础上 |
ognl.jar |
Object Graph Navigation Language (OGNL), 类似于jsp2.0中EL表达式的一门用于访问对象的表达式语言 |
freemarker.jar |
Struts2所有的ui标记的模板均使用freemarker编写,freemarker根据struts2 ui标记的模板渲染,可通过修改或重写模板使struts2的ui标记按你的要求渲染 |
commons-logging.jar |
封装了通用的日志接口(在Log4J or JDK 1.4+日志api的基础上 ) |
上图中Xwork和struts2 core展开的Source attaching和Javadoc location我分别配置了xwork和struts2 core的源代码和其文档的位置,方便开发中查看源代码和api函数的说明。如果你是按照我这样配置的话那么在Eclipse wtp下新建一个Dynamic Web Project取名为HelloWorld,选中该项目右键Build Path加入我们刚才配置好的Struts2库如下图

选择Add Library选择User Library加入Struts2所需的库。
见上图选择J2EE Module Dependencies勾选struts2库参看见下图
勾选struts2库后当Eclipse wtp将项目发布到Tomcat的时候strust2中的jar会拷贝项目WEB-INF下的lib目录下(以后的文章将不在强调,请切记将需要的库勾选,否则运行时会出现找不到某某类的错误,因为发布的时候Eclipse wtp不会将所需的jar拷贝到WEB-INF/lib目录下,所以程序在运行时位于该库的jar中的类会找不到)

















在web.xml中注册一个FilterDispatcher该Filter拦截所有的请求(/*)使得struts2框架为您服务。
在项目src目录下新建一个struts.xml作为struts2的配置文件(项目发布到Tomcat的时候Eclipse会将src目录下的文件对应其目录结构中的文件拷贝到WEB-INF/classes下)如下所示:









Package类似于Java中的package,其实就是可以将Action分类,划分到不同的package中。extends="struts-default"顾名思义继承,那么继承谁呢?请大家查看struts2-core.jar包里有个struts-default.xml文件里面为我们的应用程序提供了默认配置,应用程序从classpath加载struts.xml的时候会从classpath中加载struts2-core中并读取struts-default.xml,以后我也会经常涉及这个struts-default文件(呵呵,其实我也不全了解这个文件里的配置,大家努力!!!)
那么到此Struts2的基本环境配置的模板搭建好了!
那么新建一个index.jsp


















在这个页面中我将使用struts2标记,先注个册先如下:
<%@ taglib prefix="s" uri="/struts-tags"%>(在struts2-core.jar的META-INF/struts-tags.tld中的标记<uri>/struts-tags</uri>刚好与上面uri属性匹配, struts2的所有标记的配置信息估计都在这文件里,大家一起研究研究吧!)
新建一个Action代码如下:



























按我上面所说的struts.xml的package中把这个Action注册进去吧






我们回过头来看看表单:





呵呵,看见message属性没,该表单发出的请求会被FilterDispatcher(web.xml配置的)拦截,然后读取struts.xml配置信息并找到HelloWorld这个Action
通过class属性找到tutorial.HelloWorld对象,由于表单有个message属性会调用set方法设置message的值(同webwork,hibernate的持久类不也是这样通过set对属性赋值,通过get对属性取值的吗,这里也是一样的)然后调用execute()方法返回一个字符串(我们在写Action的时候可以覆写这个方法,框架默认调用这个方法,当然我们也可以选择不覆写,定义自己的方法,以后在说好了),呵呵这个SUCCESS是个常量,它定义在所实现的Action接口中:public static final Sring SUCCESS = “success”;里面还定义了其它的常用的字符串,自己看看源码吧!(实际上HelloWorld继承ActionSupport而ActionSupport实现了Action接口,当然还有其它接口,有兴趣的去挖挖源码吧!)扯了半天就是execute()返回个”success的字符串”,然后从struts.xml的对应action配置中找到所匹配的result,然后将请求转发到/helloworld.jsp去(result中的name=”success”可以不写,默认的,老实说:到底struts默认了哪些东东,真希望官方搞张表全给我们列出来就好)
那么剩下的最后一个页面就是helloworld.jsp了















<s:property value="message" />就这个东东了,很简单输出Action中的message属性值。
运行下看看结果:
提交下
呵呵,大功告成!!!我会接着写的,下次也是老套路登录,呵呵,请关注博客更新!!!