??? 在本篇將會(huì)通過(guò)一個(gè)簡(jiǎn)單卻經(jīng)典的HelloWorld程序手把手的教你如何編寫(xiě)(其實(shí)我更愿意稱(chēng)之為創(chuàng)建,因?yàn)橛辛诉@么強(qiáng)大的框架需要編寫(xiě)的代碼已經(jīng)很少很少)一個(gè)WebWork應(yīng)用程序。即使你從沒(méi)接觸過(guò)WebWork甚至你從沒(méi)用過(guò)任何其他框架,在本篇結(jié)束的時(shí)候你都能夠輕松的通過(guò)WebWork建立簡(jiǎn)單的Web應(yīng)用程序了。不過(guò)我們約定你必須懂一定的HTML和JAVA知識(shí):)。Let's Go!
??? 首先自然是下載WebWork的開(kāi)發(fā)包,這個(gè)我就不專(zhuān)門(mén)做一節(jié)了。google一下,到WebWork官方站點(diǎn)下載最新的二進(jìn)制版本,解壓后你會(huì)找到范例、文檔、一些jar、甚至是框架的源代碼。現(xiàn)在先不要被這么多的東西嚇倒,先不要管它們(雖然以后你會(huì)非常的需要它們),我們現(xiàn)在只要找出構(gòu)建基本W(wǎng)eb應(yīng)用程序所需的內(nèi)容,一些jar和配置文件。
一、搭建骨架??? 在WebWork的開(kāi)發(fā)包中找到下面一些應(yīng)用程序必須的文件,相信這個(gè)難不倒你:)
??? ?? xwork.jar? WebWork構(gòu)建所依賴的XWork類(lèi)庫(kù)
??? ?? common-logging.jar? 通用的日志類(lèi)庫(kù),WebWork用它為L(zhǎng)og4J或者JDK提供透明的日志記錄
??? ?? oscore.jar? OSCore,一個(gè)來(lái)自O(shè)penSymphony公司的通用功能類(lèi)庫(kù)
??? ?? velocity-dep.jar? 依賴Velocity類(lèi)庫(kù)
??? ?? ognl.jar? 對(duì)象圖導(dǎo)航語(yǔ)言(OGNL),WebWork中使用的表達(dá)式語(yǔ)言
??? ?? xwork.xml? WebWork配置文件,為你的Web應(yīng)用程序定義action、result和interceptor
??? ?? web.xml? J2EE Web應(yīng)用程序配置文件,為你的Web應(yīng)用程序定義servlet、JSP標(biāo)簽庫(kù)等內(nèi)容??? 現(xiàn)在創(chuàng)建一個(gè)名為HelloWorld項(xiàng)目(用你喜歡和習(xí)慣的IDE),在項(xiàng)目下創(chuàng)建一個(gè)源代碼文件夾如src,一個(gè)web文件夾如webApp,把web.xml放在WEB-INF目錄下,而xwork.xml應(yīng)該被放在WEB-INF\classes下,如果是在IDE環(huán)境下就放在源代碼文件夾下編譯后就會(huì)出現(xiàn)在WEB-INF\classes了。相關(guān)的*.jar自然是放在WEB-INF\lib下了。下面我們對(duì)幾個(gè)配置文件進(jìn)行基本的修改。
??? 為了讓W(xué)ebWork正常工作,我們必須配置一個(gè)在
上一篇筆記中提到的前端控制器(Front Controller),使特定URL模式的請(qǐng)求都被提交給WebWork處理。這和Struts是相似的。來(lái)看代碼吧(web.xml):
?1?
<web-app>
?2?
???
?3?
???<servlet>
?4?
??????<servlet-name>webwork</servlet-name>
?5?
??????<servlet-class>
?6?
?????????com.opensymphony.webwork.dispatcher.ServletDispatcher
?7?
??????</servlet-class>
?8?
???</servlet>
?9?
10?
???<servlet-mapping>
11?
??????<servlet-name>webwork</servlet-name>
12?
??????<url-pattern>*.action</url-pattern>
13?
???</servlet-mapping>
14?
???
15?
</web-app> ??? 為了使用WebWork的標(biāo)簽庫(kù),還需要給出一個(gè)告訴程序在哪里可以找到標(biāo)簽苦的配置,還是看代碼吧(web.xml):
?1?
<web-app>
?2?
????
?3?
??<taglib>
?4?
?????<taglib-uri>webwork</taglib-uri>
?5?
?????<taglib-location>
?6?
????????/WEB-INF/lib/webwork-2.1.7.jar
?7?
?????</taglib-location>
?8?
??</taglib>
?9?
??
10?
</web-app> ??? 你是不是有點(diǎn)奇怪為什么taglib配置的是一個(gè).jar而不是一個(gè)TLD文件,其實(shí)根據(jù)規(guī)范程序會(huì)自動(dòng)到.jar中去找指定位置的TLD,我們暫且不管這個(gè)問(wèn)題吧,先去看看WebWork自己的核心配置文件-xwork.xml吧。
??? 說(shuō)明一下,因?yàn)閃ebWork是基于XWork這個(gè)這個(gè)子項(xiàng)目的,所以這個(gè)文件叫做xwork,不要被它弄迷糊了。我們先來(lái)對(duì)xwork.xml做一個(gè)最基本的配置,以后熟悉了再往里面加入自己的東西就很輕松了。(xwork.xml)
1?<xwork>
2?????<include?file="webwork-default.xml">
3?????
4?????<package?name="default"?extends="webwork-default">
5?????????<default-interceptor-ref?name="completeStack"/>
6?????</package>
7?</xwork>
??? 我們暫時(shí)只用關(guān)注一個(gè)問(wèn)題:xwork.xml中包含了一個(gè)名教webwork-default.xml的文件,這個(gè)文件已經(jīng)包含在了webwork的.jar中了,它提供了讓W(xué)ebWork正常運(yùn)行的標(biāo)準(zhǔn)配置,也提供了一些默認(rèn)的處理方式。了解到這里已經(jīng)足夠了,我們繼續(xù)往下走。
??? 下面在xwork.xml同一個(gè)目錄下創(chuàng)建一個(gè)webwork.properties配置文件,它定義了一些告訴webwork如何工作的信息,暫時(shí)不用關(guān)注它,在里面加入一行內(nèi)容:(webwork.properties)
1?webwork.tag.altSyntax?=?true
??? 到此,基本的骨架就搭成了,其實(shí)并不復(fù)雜。下面我們就開(kāi)始進(jìn)入真正與業(yè)務(wù)相關(guān)的內(nèi)容吧。
二、你的第一個(gè)action??? 我們現(xiàn)在假設(shè)HelloWorld的需求是這樣的:當(dāng)用戶訪問(wèn)一個(gè)URL的時(shí)候(如http://localhost/helloworld.action? webwork默認(rèn)的后綴是action,后面的筆記中你會(huì)了解到這個(gè)是可以修改的,比如換成現(xiàn)在比較流行的jspa),都會(huì)有一條HelloWorld問(wèn)候語(yǔ)顯示。從上面提到的webwork前端控制器的知識(shí)可以知道,URL請(qǐng)求會(huì)被映射到webwork中,所以我們要實(shí)現(xiàn)這個(gè)需求要做下面3件事情:
??? (1) 創(chuàng)建一個(gè)action類(lèi)(用來(lái)實(shí)現(xiàn)業(yè)務(wù)邏輯,并準(zhǔn)備返回)
??? (2) 創(chuàng)建一個(gè)result,這里是用JSP的形式,熟練后你可以靈活運(yùn)用velocity、FreeMarker等
??? (3) 配置action與result???
??? 第一部創(chuàng)建action類(lèi):HelloWorld.java ,還是先看代碼吧:
?1?package?example
?2?
?3?import?com.opensymphony.xwork.Action;
?4?
?5?public?class?HelloWorld?implements?Action{
?6?????private?String?message;
?7?????
?8?????public?String?execute(){
?9?????????message?=?"Hello,?World!\n";
10?????????message?+=?"The?time?is:\n";
11?????????message?+=?System.currentTimeMillis();
12?????????return?SUCCESS;
13?????}
14?????
15?????public?String?getMessage(){
16?????????return?message;
17?????}
18?}
??? 注意你所編寫(xiě)的action類(lèi)都必須實(shí)現(xiàn)定義了execute()方法的Action接口,而execute()就是在執(zhí)行這個(gè)action的時(shí)候被WebWork調(diào)用的。
??? 在action中定義了message的getter方法,以便JSP標(biāo)簽取得message的值顯示給客戶端。
??? 最后execute()方法返回了SUCCESS(其實(shí)就是一個(gè)值為“success”的字符串常量),并且所有的WebWork的action都必須返回一個(gè)result code(一個(gè)說(shuō)明執(zhí)行結(jié)果的字符串)。它告訴WebWork現(xiàn)在的執(zhí)行結(jié)果和下一步應(yīng)該對(duì)應(yīng)到哪個(gè)result,雖然result code不一定必須對(duì)應(yīng)一個(gè)result但是通常都是。既然業(yè)務(wù)已經(jīng)處理完了,下面就來(lái)創(chuàng)建一個(gè)JSP頁(yè)面顯示HelloWorld問(wèn)候語(yǔ)。
?1?<%@?taglib?prefix="ww"?uri="webwork"?%>
?2?????<html>
?3?????????<head>
?4?????????????<title>Hello?Page</title>
?5?????????</head>
?6?????????<body>
?7?????????The?message?generated?by?my?first?action?is:
?8?????????<ww:property?value="message"/>
?9?????????</body>
10?????</html>
11?
??? 用過(guò)頁(yè)面標(biāo)簽的朋友肯定對(duì)這種代碼很熟悉了,即使你沒(méi)用過(guò)也沒(méi)關(guān)系,下面簡(jiǎn)單介紹一下。第一行標(biāo)簽庫(kù)定義將前綴ww和URI webwork(這個(gè)webwork就是前面在web.xml中定義的URI)之間建立了映射關(guān)系。前綴ww指明了所有WebWork標(biāo)簽在使用的時(shí)候以“ww:”開(kāi)頭。property標(biāo)簽包含了一個(gè)value屬性值,通過(guò)設(shè)置value值,標(biāo)簽可以從action中獲得對(duì)應(yīng)表達(dá)式的內(nèi)容。因?yàn)樵赼ction中創(chuàng)建一個(gè)名為getMessage()的方法,value值為message的property標(biāo)簽就會(huì)得到getMessage()方法調(diào)用后的值。把上面的代碼保存為hello.jsp,放在webApp目錄下。
??? 配置你的action與result,已經(jīng)創(chuàng)建了action類(lèi)和視圖,最后還需要將它們聯(lián)系起來(lái)。你可以通過(guò)為action配置一個(gè)特別的URL,以及將SUCCESS這個(gè)result code映射到你剛才創(chuàng)建的JSP來(lái)完成這一步。當(dāng)你配置一個(gè)WebWork action的時(shí)候,必須清楚下面3個(gè)方面:
??? (1) action類(lèi)的全名,包含完整的包名
??? (2) 你打算將action存放于Web應(yīng)用程序什么位置,即應(yīng)用什么URL
??? (3) action可能返回所有結(jié)果碼?1?<xwork>
?2?????<include?file="webwork-default.xml">
?3?????
?4?????<package?name="default"?extends="webwork-default">
?5?????????<default-interceptor-ref?name="completeStack"/>
?6?????????
?7?????????<action?name="helloWorld"?class="example.HelloWorld">
?8?????????????<result?name="success">hello.jsp</result>
?9?????????</action>
10?????</package>
11?</xwork>
??? 到這個(gè)時(shí)候就已經(jīng)差不多了,編譯程序并發(fā)布在你喜歡的web容器中。啟動(dòng)服務(wù)器你就可以在瀏覽器中輸入U(xiǎn)RL看看效果了,如http://localhost/helloWorld.action(如果端口為8080,還需要加上端口),這個(gè)時(shí)候你就會(huì)看到瀏覽器中顯示了HelloWorld的信息。這并不是一個(gè)令人興奮的網(wǎng)頁(yè),但是你至少開(kāi)始使用WebWork了,這難道不令人激動(dòng)嗎?
??? 當(dāng)然畢竟上這是一個(gè)很簡(jiǎn)單的應(yīng)用,實(shí)際的應(yīng)用會(huì)比這復(fù)雜千倍萬(wàn)倍,你將會(huì)在后面的筆記中慢慢深入WebWork的殿堂,下一篇將會(huì)詳細(xì)講述WebWork中三最為重要的概念-action、result、interceptor并告訴你如何最好的使用它們。讓我們一起期待吧!
posted on 2007-02-09 12:39
cresposhi 閱讀(3270)
評(píng)論(17) 編輯 收藏