今天寫篇關(guān)于struts2入門的文章吧,如有不妥或不對(duì)之處,請(qǐng)于http://bbs.heyjava.com/bbs/index.asp?boardid=2留言回復(fù),我會(huì)盡快改正的,該文章主要參考struts2官方入門文檔,原文請(qǐng)參看http://struts.apache.org/2.x/docs/bootstrap.html,我的系列文章會(huì)對(duì)原文做適當(dāng)增改,以我這樣的一個(gè)初學(xué)者的角度行文,那么還是照老規(guī)矩,我們的struts2旅程從Hello World開始吧!
首先簡(jiǎn)要介紹下我使用的開發(fā)環(huán)境吧:Eclipse3.3 IDE For Java EE Developers下載地址:http://www.eclipse.org/downloads/,JDK5或以上版本,Struts struts2-core.jar Struts2的核心api,也是我們以后打交道最多的 xwork.jar Struts2(同Webwork一樣)建立在XWork 2庫(kù)的基礎(chǔ)上 ognl.jar Object Graph Navigation Language (OGNL), 類似于jsp2.0中EL表達(dá)式的一門用于訪問對(duì)象的表達(dá)式語(yǔ)言 freemarker.jar Struts2所有的ui標(biāo)記的模板均使用freemarker編寫,freemarker根據(jù)struts2 ui標(biāo)記的模板渲染,可通過修改或重寫模板使struts2的ui標(biāo)記按你的要求渲染 commons-logging.jar 封裝了通用的日志接口(在Log4J or JDK 1.4+日志api的基礎(chǔ)上 )
上圖中Xwork和struts2 core展開的Source attaching和Javadoc location我分別配置了xwork和struts2 core的源代碼和其文檔的位置,方便開發(fā)中查看源代碼和api函數(shù)的說明。如果你是按照我這樣配置的話那么在Eclipse wtp下新建一個(gè)Dynamic Web Project取名為HelloWorld,選中該項(xiàng)目右鍵Build Path加入我們剛才配置好的Struts2庫(kù)如下圖
選擇Add Library選擇User Library加入Struts2所需的庫(kù)。
見上圖選擇J2EE Module Dependencies勾選struts2庫(kù)參看見下圖
勾選struts2庫(kù)后當(dāng)Eclipse wtp將項(xiàng)目發(fā)布到Tomcat的時(shí)候strust2中的jar會(huì)拷貝項(xiàng)目WEB-INF下的lib目錄下(以后的文章將不在強(qiáng)調(diào),請(qǐng)切記將需要的庫(kù)勾選,否則運(yùn)行時(shí)會(huì)出現(xiàn)找不到某某類的錯(cuò)誤,因?yàn)榘l(fā)布的時(shí)候Eclipse wtp不會(huì)將所需的jar拷貝到WEB-INF/lib目錄下,所以程序在運(yùn)行時(shí)位于該庫(kù)的jar中的類會(huì)找不到)

















在web.xml中注冊(cè)一個(gè)FilterDispatcher該Filter攔截所有的請(qǐng)求(/*)使得struts2框架為您服務(wù)。
在項(xiàng)目src目錄下新建一個(gè)struts.xml作為struts2的配置文件(項(xiàng)目發(fā)布到Tomcat的時(shí)候Eclipse會(huì)將src目錄下的文件對(duì)應(yīng)其目錄結(jié)構(gòu)中的文件拷貝到WEB-INF/classes下)如下所示:









Package類似于Java中的package,其實(shí)就是可以將Action分類,劃分到不同的package中。extends="struts-default"顧名思義繼承,那么繼承誰(shuí)呢?請(qǐng)大家查看struts2-core.jar包里有個(gè)struts-default.xml文件里面為我們的應(yīng)用程序提供了默認(rèn)配置,應(yīng)用程序從classpath加載struts.xml的時(shí)候會(huì)從classpath中加載struts2-core中并讀取struts-default.xml,以后我也會(huì)經(jīng)常涉及這個(gè)struts-default文件(呵呵,其實(shí)我也不全了解這個(gè)文件里的配置,大家努力!!!)
那么到此Struts2的基本環(huán)境配置的模板搭建好了!
那么新建一個(gè)index.jsp


















在這個(gè)頁(yè)面中我將使用struts2標(biāo)記,先注個(gè)冊(cè)先如下:
<%@ taglib prefix="s" uri="/struts-tags"%>(在struts2-core.jar的META-INF/struts-tags.tld中的標(biāo)記<uri>/struts-tags</uri>剛好與上面uri屬性匹配, struts2的所有標(biāo)記的配置信息估計(jì)都在這文件里,大家一起研究研究吧!)
新建一個(gè)Action代碼如下:



















按我上面所說的struts.xml的package中把這個(gè)Action注冊(cè)進(jìn)去吧






我們回過頭來看看表單:





呵呵,看見message屬性沒,該表單發(fā)出的請(qǐng)求會(huì)被FilterDispatcher(web.xml配置的)攔截,然后讀取struts.xml配置信息并找到HelloWorld這個(gè)Action
通過class屬性找到tutorial.HelloWorld對(duì)象,由于表單有個(gè)message屬性會(huì)調(diào)用set方法設(shè)置message的值(同webwork,hibernate的持久類不也是這樣通過set對(duì)屬性賦值,通過get對(duì)屬性取值的嗎,這里也是一樣的)然后調(diào)用execute()方法返回一個(gè)字符串(我們?cè)趯?/span>Action的時(shí)候可以覆寫這個(gè)方法,框架默認(rèn)調(diào)用這個(gè)方法,當(dāng)然我們也可以選擇不覆寫,定義自己的方法,以后在說好了),呵呵這個(gè)SUCCESS是個(gè)常量,它定義在所實(shí)現(xiàn)的Action接口中:public static final Sring SUCCESS = “success”;里面還定義了其它的常用的字符串,自己看看源碼吧!(實(shí)際上HelloWorld繼承ActionSupport而ActionSupport實(shí)現(xiàn)了Action接口,當(dāng)然還有其它接口,有興趣的去挖挖源碼吧!)扯了半天就是execute()返回個(gè)”success的字符串”,然后從struts.xml的對(duì)應(yīng)action配置中找到所匹配的result,然后將請(qǐng)求轉(zhuǎn)發(fā)到/helloworld.jsp去(result中的name=”success”可以不寫,默認(rèn)的,老實(shí)說:到底struts默認(rèn)了哪些東東,真希望官方搞張表全給我們列出來就好)
那么剩下的最后一個(gè)頁(yè)面就是helloworld.jsp了















<s:property value="message" />就這個(gè)東東了,很簡(jiǎn)單輸出Action中的message屬性值。
運(yùn)行下看看結(jié)果:
提交下
呵呵,大功告成!!!我會(huì)接著寫的,下次也是老套路登錄,呵呵,請(qǐng)關(guān)注博客更新!!!