一、WebWork的框架初始化過程
利用WebWork做的項目,在服務器啟動時完成WebWork的框架初始化。具體是通過
Web.xml中配置好的FilterDispatcher過濾器中的init(FilterConfig filterConfig)方法完成。
并且web.xml中配置好FilterDispatcher的映射,當用戶用映射好的結尾資源請求瀏覽器時,FillterDispather會進行請求處理.
具體實現是通過以下步驟:
1、 通過FilterDispatcher中的
public void init(FilterConfig filterConfig) throws ServletException方法,進行框架的初始化
2、 Init方法又同過調用DispatcherUtils類的
public static void initialize(ServletContext servletContext)方法創建
DispatcherUtils實例,同時間接調用DispatcherUtils類的
protected void init(ServletContext servletContext)方法初始化Configuration
配置,創建對象創建的工廠ObjectFactory和ObjectTypeDeterminer。
至此完成WebWork框架的初始化。
二、WebWork的用戶請求處理過程
所有以web.xml中映射FilterDispatcher結尾的服務請求將由FilterDispatcher進行處理。 1、從用戶請求的服務名中解析出對應Action的名稱。
具體完成是:戶按webwork規則請求時,服務器會調用FilterDispatcher的doFilter方法,完成第二步的內容。
2、遍歷 HttpServletRequest、HttpSession、ServletContext 中的數據,并將其復制到
Webwork的Map中,為下一步創建Action事例打下基礎。
具體完成是:過調用DispatcherUtils的serviceAction方法中的
Map extraContext = createContextMap(request, response, mapping, context);完成以上信息的封裝。
3、以上一步封裝好的信息為參數,調用 ActionProxyFactory創建對應的 ActionProxy實例。ActionProxyFactory 將根據 Xwork 配置文件(xwork.xml)中的設定,創建ActionProxy實例,ActionProxy中包含了 Action的配置信息(包括 Action名稱,對應實現類等等)。
具體完成是:通過
ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(namespace, name, extraContext, true, false);//創建動態代理
DefaultActionProxyFactory實現ActionProxyFactory的createActionProxy方法,返回new DefaultActionProxy(namespace, actionName, extraContext, true, true);
DefaultActionProxy是對ActionProxy的默認實現,
通過DefaultActionProxy類的DefaultActionProxy(namespace, actionName, extraContext, true, true)構造方法實例化DefaultActionProxy,同時得到用戶請求的actionName及namespace,
并通過
config = ConfigurationManager.getConfiguration().getRuntimeConfiguration().getActionConfig(namespace, actionName);
ConfigurationManager的
publicstaticsynchronized Configuration getConfiguration() {
if (configurationInstance == null) {
configurationInstance = new DefaultConfiguration();
try {
configurationInstance.reload();
} catch (ConfigurationException e) {
configurationInstance = null;
throw e;
}
} else {
conditionalReload();
}
returnconfigurationInstance;
}
1. 完成對xwork.xml(具體操作類是XmlConfigurationProvider)配置信息的讀取。獲得與此次請求相關的ActionConfig
4、ActionProxy創建對應的Action實例,并根據配置進行一系列的處理程序。
通過DefaultActionProxy類的
invocation = ActionProxyFactory.getFactory().createActionInvocation(this, extraContext);
//通過createActionInvocation方法創建動作調用類ActionInvocation,處理被Action調用的方法
privatevoid resolveMethod() {
// if the method is set to null, use the one from the configuration
// if the one from the configuration is also null, use "execute"
if (!TextUtils.stringSet(this.method)) {
this.method = config.getMethodName();
if (!TextUtils.stringSet(this.method)) {
this.method = "execute";
}
}
}
然后調用DispatcherUtils的serviceAction方法中的
if (mapping.getResult() != null) {
Result result = mapping.getResult();
result.execute(proxy.getInvocation());
} else {
proxy.execute();
}
完成用戶的最終要執行的action方法。
public String execute() throws Exception {
ActionContext nestedContext = ActionContext.getContext();
ActionContext.setContext(invocation.getInvocationContext());
String retCode = null;
try {
retCode = invocation.invoke();
} finally {
if (cleanupContext) {
ActionContext.setContext(nestedContext);
}
}
return retCode;
}
最終處理ActionContext對象
將Action調用提交給ActionInvocation處理
三、WebWork的執行流程圖
