WebWork中xwork.xml文件淺析
示例
- ﹤?xml version="1.0" encoding="ISO-8859-1"?﹥
- ﹤!DOCTYPE xwork
- PUBLIC
- "-//OpenSymphony Group//XWork 1.0//EN"
- "http://www.opensymphony.com/xwork/xwork-1.0.dtd"﹥
- ﹤xwork﹥
- ﹤include file="webwork-default.xml"/﹥
- ﹤package name="default" extends="webwork-default"﹥
- ﹤interceptors﹥
- ﹤interceptor-stack name="defaultComponentStack"﹥
- ﹤interceptor-ref name="component"/﹥
- ﹤interceptor-ref name="defaultStack"/﹥
- ﹤/interceptor-stack﹥
- ﹤/interceptors﹥
- ﹤default-interceptor-ref name="defaultStack"/﹥
- ﹤action name="SimpleCounter" class="com.opensymphony.
- webwork.example.counter.SimpleCounter"﹥
- ﹤result name="success" type="dispatcher"﹥
- /success.jsp﹤/result﹥
- ﹤interceptor-ref name="defaultComponentStack"/﹥
- ﹤/action﹥
- ﹤!--
- - Velocity implementation of the SimpleCounter.
- Also demonstrate a more verbose version of result element
- --﹥
- ﹤action name="VelocityCounter" class="com.opensymphony.webwork.
- example.counter.SimpleCounter"﹥
- ﹤result name="success" type="velocity"﹥
- ﹤param name="location"﹥/success.vm﹤/param﹥
- ﹤/result﹥
- ﹤interceptor-ref name="defaultComponentStack"/﹥
- ﹤/action﹥
- ﹤!--
- - Different method can be used (processForm).
- --﹥
- ﹤action name="formTest" class="com.opensymphony.webwork.example.
- FormAction" method="processForm" ﹥
- ﹤result name="success" type="dispatcher"﹥/formSuccess.jsp﹤/result﹥
- ﹤result name="invalid.token" type="dispatcher"﹥/form.jsp﹤/result﹥
- ﹤interceptor-ref name="defaultStack"/﹥
- ﹤interceptor-ref name="token"/﹥
- ﹤/action﹥
- ﹤/package﹥
- ﹤/xwork﹥
活動
- ﹤action name="formTest"
- class="com.opensymphony.webwork.example.FormAction"
- method="processForm"﹥
活動是WebWork的基本工作單元, 它正是定義了活動. 活動通常有一個請求(通常是點擊按鈕, 或提交表單). 主要的action元素有兩部分, 友好的名字(在URL中引用, 如saveForm.action)和對應(yīng)的"處理(handler)"類.
可選的"method"屬性告訴WebWork應(yīng)當(dāng)調(diào)用活動的哪個方法.
如果你不填寫method屬性, WebWork缺省調(diào)用execute(). 如果活動沒有execute()方法, 也沒有在xml中指定method屬性, WebWork將拋出異常.
同樣, 你也可以在表單中指定"actionName!something"來告訴WebWork調(diào)用"doSomething"方法. 例如, "formTest!save.action"將調(diào)用FormAction的"save"方法. 該方法必須是public且沒有參數(shù):
- public String save() throws Exception
- {
- ...
- return SUCCESS;
- }
活動的所有配置都可以用在"actionName!something"中(截取器, 結(jié)果類型等)
- 〈result name="missing-data" type="dispatcher"〉
- 〈param name="location"〉/form.jsp〈/param〉
- 〈param name="parameterA"〉A(chǔ)〈/param〉
- 〈param name="parameterB"〉B〈/param〉
- 〈/result〉
Result元素告訴WebWork活動執(zhí)行后下一步該做什么. "name"屬性對應(yīng)活動execute() 方法返回的結(jié)果代碼. "type"屬性表示使用哪個結(jié)果類型(參見結(jié)果類型). 可以使用"param"元素向視圖傳遞參數(shù):
- 〈result-types 〉
- ....
- 〈result-type name="header"
- class="com.opensymphony.webwork.dispatcher.
- HttpHeaderResult"/ 〉
- 〈/result-types 〉
- 〈result name="no-content" type="header" 〉
- 〈param name="status" 〉204〈/param 〉
- 〈param name="headers.customHeaderA" 〉A(chǔ)〈/param 〉
- 〈param name="headers.customHeaderB" 〉B〈/param 〉
- 〈/result 〉
下面是WebWork內(nèi)置的標(biāo)準(zhǔn)結(jié)果代碼(定義在Action接口中), 包括:
Action.SUCCESS = "success";
Action.NONE = "none";
Action.ERROR = "error";
Action.INPUT = "input";
Action.LOGIN = "login";
你可以擴(kuò)充你認(rèn)為適合的結(jié)果代碼(如"missing-data"). 大多數(shù)情況下你只需使用SUCCESS和ERROR, SUCCESS將前進(jìn)到下一個頁面.
如果你只需要指定"location"屬性, 可以使用簡寫形式:
- ﹤result name="missing-data"
- type="dispatcher"﹥/form.jsp﹤/result﹥
參閱webwork-default.xml或Result Types以了解標(biāo)準(zhǔn)結(jié)果類型
截取器
截取器允許定義活動執(zhí)行前后的代碼. 截取器是編寫Web應(yīng)用的強(qiáng)大工具. 一些最常用的實現(xiàn)是:
安全檢查(確保用戶已登陸)
跟蹤紀(jì)錄 (記錄每一個活動)
檢查執(zhí)行瓶頸 (在活動前后啟動計時器, 以檢查應(yīng)用瓶頸)
也可以將截取器連接起來創(chuàng)建一個截取器棧. 如果你想完成登陸檢查, 安全檢查, 并記錄每個活動調(diào)用, 使用截取器棧會十分容易.
必須先定義截取器(給它命名)然后才能聯(lián)接成棧:
- ﹤interceptors﹥
- ﹤interceptor name="security"
- class="com.mycompany.security.SecurityInterceptor"/﹥
- ﹤interceptor-stack name="defaultComponentStack"﹥
- ﹤interceptor-ref name="component"/﹥
- ﹤interceptor-ref name="defaultStack"/﹥
- ﹤/interceptor-stack﹥
- ﹤/interceptors﹥
要在活動中使用它們:
- ﹤action name="VelocityCounter"
- class="com.opensymphony.webwork.example.
- counter.SimpleCounter"﹥
- ﹤result name="success"﹥...﹤/result﹥
- ﹤interceptor-ref
- name="defaultComponentStack"/﹥
- ﹤/action﹥
注意: 可以引用攔截器或棧的名字
更多細(xì)節(jié)參見截取器.
視圖
WebWork支持JSP和Velocity作為應(yīng)用表示層. 本例使用JSP文件. Webwork附帶了標(biāo)簽庫(taglibs). 你可以在JSP中項組件一樣使用標(biāo)簽庫.下面是form.jsp的片斷:
- ﹤%@ taglib prefix="ww" uri="webwork" %﹥
- ﹤html﹥
- ﹤head﹥﹤title﹥Webwork Form Example﹤/title﹥
- ﹤/head﹥
- ﹤body﹥
- ﹤ww:form name="myForm" action="'formTest'"
- namespace="/" method="POST"﹥
- ﹤table﹥
- ﹤ww:textfield label="First Name"
- name="'formBean.firstName'"
- value="formBean.firstName"/﹥
- ﹤ww:textfield label="Last Name"
- name="'formBean.lastName'"
- value="formBean.lastName"/﹥
- ﹤ww:submit value="Save Form"/﹥
- ﹤/table﹥
- ﹤/ww:form﹥
- ﹤/body﹥
處理經(jīng)過如下:
WebWork監(jiān)控以.action結(jié)尾的URI(定義在web.xml中)
WebWork在活動定義中查找活動formTest.
WebWork創(chuàng)建formTest并調(diào)用com.opensymphony.webwork.example.FormAction的方法processForm(定義在xwork.xml中).
該方法處理成功并返回SUCCESS
WebWork將返回值SUCCESS轉(zhuǎn)換成地址formSuccess.jsp(定義在b class="strong">xwork.xml中)并執(zhí)行重定向.
包含
為了易于管理大規(guī)模開發(fā)活動(包含大量活動和配置), WebWork允許在xwork.xml中包含其他配置文件 :
- ﹤xwork﹥
- ﹤include file="webwork-default.xml"/﹥
- ﹤include file="user.xml"/﹥
- ﹤include file="shoppingcart.xml"/﹥
- ﹤include file="product.xml"/﹥
- ....
- ﹤/xwork﹥
被包含文件必須與xwork.xml的格式相同(具有相同的doctype及其它)并放置在類路徑中(通常位于/WEB-INF/classes或/WEB-INF/lib的jar文件中).
【編輯推薦】