????? WebWork發(fā)展到現(xiàn)在已經(jīng)到了2.X版本,因?yàn)榻佑|的晚,所以一開始就用上了WebWork2的版本,據(jù)說WebWork2.x+XWork1.x 的架構(gòu)分離了與Servlet API的緊偶合,使系統(tǒng)結(jié)構(gòu)更加清晰,因?yàn)楣ぷ鞯年P(guān)系,我開始用上了WebWork2,現(xiàn)在就用的過程做一個總結(jié),再把WebWork2過上一遍,以便我更深入的學(xué)習(xí)WebWork2。(本文參考了夏昕的<<Webwork2_Guide>>,以及CSDN上阿明的專欄,并非原創(chuàng),只是自己寫出來參考學(xué)習(xí)!)
?????
在新的架構(gòu)中WebWork2.x的作用是負(fù)責(zé)將用戶的HTTP請求分離出來,使的請求完全的脫離Servlet API,然后將這些請求用Map的方式傳入XWork1.x,且XWork1.x通過Interceptor 將Map中的數(shù)據(jù)傳到我們的VO中,然后由對應(yīng)的自定義Action來調(diào)用.
?????? 首先打開DispatcherUtils.java,它在com.opensymphony.webwork.dispatcher包下面。
?????? 找到serviceAction這個方法,它實(shí)例化了Map請求,從請求的服務(wù)中解析出對應(yīng)的Action名稱。
?????? HashMap extraContext = createContextMap(requestMap, params, session, application, request, response, context);
?????? OgnlValueStack stack = (OgnlValueStack) request.getAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY);
??????? if (stack != null) {
??????????? extraContext.put(ActionContext.VALUE_STACK, new OgnlValueStack(stack));
??????? }
?????? try {
??????????? String namespace = mapping.getNamespace();
??????????? String name = mapping.getName();
??????????? String method = mapping.getMethod();
??????????? String id = request.getParameter("continue");
??????????? if (id != null) {
??????????????? extraContext.put("__continue", id);
??????????? }
?????? // if the ActionMapping says to go straight to a result, do it!
??????????? if (mapping.getResult() != null) {
??????????????? Result result = mapping.getResult();
??????????????? result.execute(proxy.getInvocation());
??????????? } else {
??????????????? proxy.execute();
??????????? }
??????????? // If there was a previous value stack then set it back onto the request
??????????? if (stack != null) {
??????????????? request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY, stack);
??????????? }
??????? } catch 。。。。。。。
?????? 找到createContextMap這個方法,它遍歷了HttpServletRequest,HttpSession,ServletContext中的數(shù)據(jù),將他們復(fù)制到Map中從而內(nèi)部結(jié)構(gòu)與Servlet API相分離。
???????? public HashMap createContextMap(Map requestMap,
??????????????????????????????????? Map parameterMap,
??????????????????????????????????? Map sessionMap,
??????????????????????????????????? Map applicationMap,
??????????????????????????????????? HttpServletRequest request,
??????????????????????????????????? HttpServletResponse response,
??????????????????????????????????? ServletContext servletContext) {
??????? HashMap extraContext = new HashMap();
//存放HTTP中上傳文件的request? session請求
??????? extraContext.put(ActionContext.PARAMETERS, new HashMap(parameterMap));
??????? extraContext.put(ActionContext.SESSION, sessionMap);
??????? extraContext.put(ActionContext.APPLICATION, applicationMap);
??????? extraContext.put(ActionContext.LOCALE, (locale == null) ? request.getLocale() : locale);
??????? extraContext.put(ActionContext.DEV_MODE, Boolean.valueOf(devMode));
??????? extraContext.put(WebWorkStatics.HTTP_REQUEST, request);
??????? extraContext.put(WebWorkStatics.HTTP_RESPONSE, response);
??????? extraContext.put(WebWorkStatics.SERVLET_CONTEXT, servletContext);
??????? extraContext.put(ComponentInterceptor.COMPONENT_MANAGER, request.getAttribute(ComponentManager.COMPONENT_MANAGER_KEY));
??????? // 這里用于存放HTTP中的request? session請求
??????? extraContext.put("request", requestMap);
??????? extraContext.put("session", sessionMap);
??????? extraContext.put("application", applicationMap);
??????? extraContext.put("parameters", parameterMap);
??????? AttributeMap attrMap = new AttributeMap(extraContext);
??????? extraContext.put("attr", attrMap);
??????? return extraContext;
??? }
?????? 創(chuàng)建Action,由ActionProxy來完成。
??????????? ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(namespace, name, extraContext);
??????????? proxy.setMethod(method);
??????????? request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY, proxy.getInvocation().getStack());