1 如何安裝 1.1 下載后,解包到你選擇的目錄 復制/lib/webwork.jar到你自己的web應用的/WEB-INF/lib目錄下,webwork在某些功能方面需要依靠其他的支持包,這些包是在supporting-jars的文件夾里,你需要做的是把這些包包含到你的classpath中。 1.2 修改web.xml文件 修改web.xml文件以包含webwork的設置,如何設置的內容,請察看$WEBWORK/src/resource/web/WEB-INF/web.xml文件。 1.3 Taglib部分的選擇 假如你不打算使用taglib、Velocity、或者XSLT,僅僅只需要在web.xml中不要包含這些內容就可以了。 1.4 Log的設置 Webwork使用log4j,假如你的app server沒有安裝log4j,你需要增加log4j,復制log4j.jar文件到合適的lib目錄。假如你使用tomcat,那么安裝目錄是$TOMCAT_HOMElib,當然也可以安裝到你的web應用的路徑。但需要注重的是假如appserver也適用log4j,你需要小心版本沖突。 1.5 (可選)javaclient 假如你打算在一個javaclient中使用webwork,那么需要將webworkclient.jar增加到你的client的classpath中,這將答應webwork使用ClientServlet的dispatch方法。另外client還需要引用log4j.jar. 到此,安裝已經完成,你可以開始開發你的webwork的action和view了。來組建你的應用 2 設置webwork 2.1 Framework部分 2.1.1 基本配置文件 webwork和其他的mvc框架一樣,通過設置PRoperty文件就可以配置webwork,通過配置文件,你可以設置webwork的行為。缺省情況下,webwork尋找兩個property文件:webwork.properties和default.properties,來發現webwork.configuration.properties屬性,這個屬性的值是用來裝載你實際配置webwork的配置文件。 webwork.configuration.properties的缺省值是:views,webwork,webwork/default. 這個用逗號分割的列表是告訴webwork去尋找views.properties、webwork.properties和default.properties屬性文件。你可以在webwork.properties文件中定義任何屬性設置來覆蓋default.properties中的設置,也可以為你的應用定義新的屬性值。還需要在views.properites中定義你的views。 下面是webwork識別的屬性列表: Properties ? webwork.action.packages - When you refer to actions in URLs, you may include the absolute or a relative package name. If you use a relative name, WW will prefix the name with your list of prefixes to see if it can find the action. You will normally override this property. ? webwork.action.factory - The action factory WW will use to retrieve the desired action. DefaultActionFactory is the default. It chains together factories to provide a chain of responsibility. It will ask the first factory in the chain for the action. This factory will either return the appropriate action or pass the request up the chain for the next factory to service the request. ? webwork.configuration - Class WW will use to load configurations. The default is DefaultConfiguration. ? webwork.configuration.properties - The list of property files WW will load. By default, WW will load webwork.properties and default.properties files to look for this property setting. It will then load all indicated property files and XML view config file indicated by webwork.configuration.xml. Only these last configuration files are used. By default this property is set to views,webwork,webwork/default. ? webwork.configuration.xml - The XML view configuration file. The default is actions. You can null it by setting its = to nothing if you do not plan to map your views this way. ? webwork.log4j.configfile - The configuration file to use to configure log4j logger. You can null it by setting its = to nothing if you do not want WW to configure log4j. ? webwork.action.extension - The extension WW will use to identify an action. You will need to modify your web.xml as well if you change it from the default “action.” ? webwork.multipart.parser - The parser WW should use for multi-part content. ? webwork.multipart.saveDir - The Directory WW should save the multi-part content to. ? webwork.multipart.maxSize - The maximum file size WW will allow for multi-part content 作為實例你可以參看缺省配置文件:default.properties. 2.1.2 如何覆蓋一個屬性 覆蓋一個ww的屬性是很輕易的,它在你的classpath路徑中搜索webwork.properties文件。通常你可以將這個文件放在你的WEB-INF/classes目錄下。在這個文件中,你增加你想要覆蓋的屬性。另外,你也可以增加你程序中需要使用的其他屬性,并可以通過webwork.config.Configuration的靜態方法來訪問這些屬性。 例如:我們可以在webwork.properties使用如下行,包含(Acme公司的action)來覆蓋webwork.action.packages屬性。 Webwork.action.packages=com.acme.action 2.2 Views Views.properties文件定義了對應于Action或者jsp mappings的別名,這樣可以答應你抽象的引用Actions和JSP。例如:你可以為testfoo.action定義一個別名為Test,那么ww將從views.properties中解析testfoo.action為Test.
<form action="<webwork:url page="testfoo.action"/>" method="POST"> 下面列示的是一個views.properties文件的范例。注重:Test!foo定義了驅動action的命令,這意味著testfoo.action別名將導致ww獲取Test action并調用doFoo方法。返回值是sUCcess,那么ww將解析別名testfoo.success并將test.jsp顯示出來。 Testfoo.action=Test!foo testfoo.success=test.jsp 假如你喜歡在xml文件中定義你的view。,而不是在一個properties文件中,那么你可以提供一個actions.xml文件來解決這個問題。缺省情況下,ww將讀取該文件中定義的任何views,這里有一個actions.xml文件的實例。 這個xml文件的DTD文件是webwork的發布包的/etc/actions.dtd文件。 是使用如下得的算法來從配置文件中找到一個view的: 查詢一個配置文件的actionName.viewName入口,若找到,就使用這個屬性值,假如找不到,那么action的名稱中就被移去部分,直到找到匹配項。例如:我們有如下的一個view mapping,并有一個foo.bar的action被執行,它的返回為success。Ww將要搜索foo.bar.success,然而,并不能找到匹配項。所以按照該算法。bar被移去,然后搜索foo.success,結果是找到。這答應你定義象login,error,success或任何你需要的得全局mapping。 foo.success=foo.jsp 2.3 Logger Ww使用log4j來記錄日志的,這是一個強大的彈性的日志器,為你的應用提供服務。Ww通過一個property文件log4j.properties來配置logger,如下: # A log4j properties file ### The WebWork console appender log4j.category.webwork=DEBUG,WebWorkConsole log4j.additivity.webwork=false log4j.appender.WebWorkConsole=org.apache.log4j.ConsoleAppender log4j.appender.WebWorkConsole.Threshold=DEBUG log4j.appender.WebWorkConsole.layout=org.apache.log4j.PatternLayout log4j.appender.WebWorkConsole.layout.ConversionPattern=[%x (%c{1})] %m%n log4j.category.webwork.action.test=INFO 2.3.1 如何在actions中使用log 大部分應用的actions是從基礎action ActionSupport繼續來的,這個基礎action提供了一個protected的log屬性給你,用來在你的actions中輸出logs 2.3.2 如何將log記錄到一個文件 用一個符合你需要的log4j配置來覆蓋ww的webwork.log4j.configfile屬性,你可以指定一個屬性或者一個XML文件。 3 Model-1與Model-2 一個web應用的framework最重要的任務就是支持邏輯、內容、和表現層的分離,假如沒有實現這些,維護起來是很麻煩的。假如這樣進入小組開發,那么開發過程是很困難的。而實現這些分離的流行辦法是采用MVC的設計模式,MVC的模式將這些代碼分離成幾部分來處理model(商業邏輯)、controller(應用邏輯)、view。隨著這種分離,下一個問題就是controller如何和view之間進行交互。現在有兩種流行的模型:Model-1和Model-2 3.1 Model-1 Model-1的基本思路是從界面層調用controller的代碼。如:JSP或模版,假如你使用JSP,那就意味著webwork的action是通過“webwork:action”tag來執行的或通過使用“webwork:bean”來調用javabean來執行的。 3.2 Model-2 Model-2的方法:對于那些代碼被調用,使用哪個view來顯示,通常由第三方(通常是一個servlet dispatcher),這個分發器(dispatcher)將對HTTP的請求的URL進行解碼,然后決定應該執行什么代碼。代表控制代碼的java對象被找到并執行,然后進行一些自定義的應用邏輯和商業邏輯的處理,執行完成后,分發器(dispatcher)將forward訪問請求到一個view處理器(如:JSP),然后前面處理的數據就被這個view顯示出來。 3.3 如何使用MVC 因為controller邏輯和顯示的產生是完全分離的,那么根據執行的結果而顯示不同的view給用戶是完全可能的,如:假如處理過程出錯,那么一個錯誤頁面將被顯示出來。 Model-1的優點如下: l 不需要在代碼和顯示間建立一個映射。 l 很輕易就能從JSP或模版中知道是什么代碼被執行。 Model-2的優點: l 清楚的代碼和顯示層的劃分,同一個顯示頁可以被許多不同的action復用,每個action可以相異地訪問數據,但使用相同的方式來顯示。 l 假如Action的處理結果有許多不同的狀態,如:“success”、“need more input”、“error occurred”等,那么使用Model-2就很輕松的針對不同的狀態使用不同的葉面。 關于什么時候使用什么模式,一個簡明扼要的規則是:在為顯示而查詢數據的read-type的代碼,就使用Model-1,而對于數據被action更新或一個流程需要處理就使用Model-2。 4 Action API Actions 是webwork的中心,是你應用的controller,例如:讓我們來看一個表單發布的普通流程。用戶輸入信息并發布它,使用ww你應該將這個表單post給一個action(*.action)的URI。Servlet容器看到所有action URI被映射到分發器(dispatcher)servlet。所以這個post也被送到分發器來處理。分發器在URI的基礎上找到合適的action并建立它的context,context建立好之后,分發器將調用action的執行方法,action將執行它的工作并返回一個字符串給分發器,讓分發器用來決定什么視圖應該顯示給用戶。大多數情況,你將返回SUCCESS, ERROR, INPUT, 或者 LOGIN。為完成這些你需要提供一個view mapping entry來將這些映射到view。 Ww需要所有的action有相應的view,但這個規則有2處例外,第一個是:假如你的action是一個chain中的一部分,那么你不需要相應的view,只有chain中的最后一個action需要一個view。第二個例外是:假如你的action返回NONE,這是一個非凡的標示。Ww用來指示分發器不要forward這個請求到一個view。這個假設是你提供任何請求的必須的處理,如:respond.sendRedirect()。 Action的強大功能來自于它的context,當得到一個action,那么它的context由DefaultActionFactory來構建,這個類將其他設置action的context的factories鏈接在一起。例如:假設你的action是一個java action,缺省action factory將委派查找action給ParametersActionFactory,這個類將又委派給下一個factory,依次往下委派。直到JavaActionFactory 來處理這個調用并返回 Java action. ParametersActionFactory 然后在request的參數的基礎上設置這個action的所有 setters .。而各層次的factories可能也可能不參與設置這個action的context。某個factories 是通過檢查一個marker接口來決定是否參與設置action的context。. WW 提供了幾個 marker 接口,action可以有選擇的來實現 that an action may choose to implement. 另外,這些層次的 factories 答應你從Java, JSP, Javascript, 和 XML 文件來創建action. 但是,大多數情況下你的action是繼續自ActionSupport 的Java文件。 (未完待續)