作者:
gkm422
鏈接:
http://remind.javaeye.com/blog/203487
發表時間: 2006年11月28日
聲明:本文系JavaEye網站發布的原創博客文章,未經作者書面許可,嚴禁任何網站轉載本文,否則必將追究法律責任!
????? WebWork發展到現在已經到了2.X版本,因為接觸的晚,所以一開始就用上了WebWork2的版本,據說WebWork2.x+XWork1.x 的架構分離了與Servlet API的緊偶合,使系統結構更加清晰,因為工作的關系,我開始用上了WebWork2,現在就用的過程做一個總結,再把WebWork2過上一遍,以便我更深入的學習WebWork2。(本文參考了夏昕的<<Webwork2_Guide>>,以及CSDN上阿明的專欄,并非原創,只是自己寫出來參考學習!)
?????
在新的架構中WebWork2.x的作用是負責將用戶的HTTP請求分離出來,使的請求完全的脫離Servlet API,然后將這些請求用Map的方式傳入XWork1.x,且XWork1.x通過Interceptor 將Map中的數據傳到我們的VO中,然后由對應的自定義Action來調用.
?????? 首先打開DispatcherUtils.java,它在com.opensymphony.webwork.dispatcher包下面。
?????? 找到serviceAction這個方法,它實例化了Map請求,從請求的服務中解析出對應的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中的數據,將他們復制到Map中從而內部結構與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;
??? }
?????? 創建Action,由ActionProxy來完成。
??????????? ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(namespace, name, extraContext);
??????????? proxy.setMethod(method);
??????????? request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY, proxy.getInvocation().getStack());
本文的討論也很精彩,瀏覽討論>>
JavaEye推薦
文章來源:
http://remind.javaeye.com/blog/203487