真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

WebWork的框架初始化過(guò)程和用戶(hù)請(qǐng)求處理過(guò)程

本篇內(nèi)容主要講解“WebWork的框架初始化過(guò)程和用戶(hù)請(qǐng)求處理過(guò)程”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“WebWork的框架初始化過(guò)程和用戶(hù)請(qǐng)求處理過(guò)程”吧!

你所需要的網(wǎng)站建設(shè)服務(wù),我們均能行業(yè)靠前的水平為你提供.標(biāo)準(zhǔn)是產(chǎn)品質(zhì)量的保證,主要從事成都網(wǎng)站制作、成都做網(wǎng)站、企業(yè)網(wǎng)站建設(shè)、手機(jī)網(wǎng)站制作設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、品牌網(wǎng)站制作、網(wǎng)頁(yè)制作、做網(wǎng)站、建網(wǎng)站。成都創(chuàng)新互聯(lián)公司擁有實(shí)力堅(jiān)強(qiáng)的技術(shù)研發(fā)團(tuán)隊(duì)及素養(yǎng)的視覺(jué)設(shè)計(jì)專(zhuān)才。

一、WebWork的框架初始化過(guò)程

WebWork做的項(xiàng)目,在服務(wù)器啟動(dòng)時(shí)完成WebWork的框架初始化。具體是通過(guò)Web.xml中配置好的com.opensymphony.xwork.dispatcher.ServletDispatcher(FilterDispatcher)過(guò)濾器中的init(ServletConfig servletConfig)方法完成。

并且web.xml中配置好ServletDispatcher的映射,當(dāng)用戶(hù)用映射好的結(jié)尾資源請(qǐng)求瀏覽器時(shí),ServletDispatcher會(huì)進(jìn)行請(qǐng)求處理(ServletDispatcher是一個(gè)HttpServlet)。

具體實(shí)現(xiàn)是通過(guò)以下步驟:

1、通過(guò)ServletDispatcher中的init方法進(jìn)行框架的初始化工作:

public void init(ServletConfig servletConfig)        throws ServletException    {        super.init(servletConfig);        DispatcherUtils.initialize(getServletContext());      }

2、init方法又同時(shí)調(diào)用DispatcherUtils類(lèi)的initialize方法創(chuàng)建DispatcherUtils實(shí)例,同時(shí)間接調(diào)用DispatcherUtils類(lèi)的init方法初始化Configuration配置,創(chuàng)建對(duì)象創(chuàng)建的工廠ObjectFactory和ObjectTypeDeterminer。

至此完成WebWork框架的初始化。

二、WebWork的用戶(hù)請(qǐng)求處理過(guò)程

所有以web.xml中映射ServletDispatcher結(jié)尾的服務(wù)請(qǐng)求將由ServletDispatcher進(jìn)行處理。

1、從用戶(hù)請(qǐng)求的服務(wù)名中解析出對(duì)應(yīng)Action的名稱(chēng)。

public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException {    //....      try      {          request = du.wrapRequest(request, getServletContext());      }      catch(IOException e)      {          String message = "Could not wrap servlet request with MultipartRequestWrapper!";          LOG.error(message, e);          throw new ServletException(message, e);      }      du.serviceAction(request, response, getServletContext(), mapping);  }

2、遍歷HttpServletRequest、HttpSession、ServletContext 中的數(shù)據(jù),并將其復(fù)制到Webwork的Map中,為下一步創(chuàng)建Action實(shí)例打下基礎(chǔ)。

實(shí)現(xiàn):通過(guò)過(guò)調(diào)用DispatcherUtils的serviceAction方法中的Map extraContext = createContextMap(request, response, mapping, context);完成以上信息的封裝。

3、以上一步封裝好的信息為參數(shù),調(diào)用ActionProxyFactory創(chuàng)建對(duì)應(yīng)的ActionProxy實(shí)例。ActionProxyFactory 將根據(jù)Xwork 配置文件(xwork.xml)中的設(shè)定,創(chuàng)建ActionProxy實(shí)例,ActionProxy中包含了Action的配置信息(包括Action名稱(chēng),對(duì)應(yīng)實(shí)現(xiàn)類(lèi)等等)。

實(shí)現(xiàn):通過(guò)ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(namespace, name, extraContext, true, false);//創(chuàng)建動(dòng)態(tài)代理DefaultActionProxyFactory實(shí)現(xiàn)ActionProxyFactory的createActionProxy方法,返回new DefaultActionProxy(namespace, actionName, extraContext, true, true);DefaultActionProxy是對(duì)ActionProxy的默認(rèn)實(shí)現(xiàn),通過(guò)DefaultActionProxy類(lèi)的DefaultActionProxy(namespace, actionName, extraContext, true, true)構(gòu)造方法實(shí)例化DefaultActionProxy,同時(shí)得到用戶(hù)請(qǐng)求的actionName及namespace,并通過(guò)config = ConfigurationManager.getConfiguration().getRuntimeConfiguration().getActionConfig(namespace, actionName);
ConfigurationManager的

public static synchronized Configuration getConfiguration()  {      if(configurationInstance == null)      {          configurationInstance = new DefaultConfiguration();          try          {              configurationInstance.reload();          }          catch(ConfigurationException e)          {              configurationInstance = null;              throw e;          }      } else      {          conditionalReload();      }      return configurationInstance;  }

完成對(duì)xwork.xml(具體操作類(lèi)是XmlConfigurationProvider)配置信息的讀取。獲得與此次請(qǐng)求相關(guān)的ActionConfig。

4、ActionProxy創(chuàng)建對(duì)應(yīng)的Action實(shí)例,并根據(jù)配置進(jìn)行一系列的處理程序。

通過(guò)DefaultActionProxy類(lèi)的invocation = ActionProxyFactory.getFactory().createActionInvocation(this, extraContext); 

//通過(guò)createActionInvocation方法創(chuàng)建動(dòng)作調(diào)用類(lèi)ActionInvocation,處理被Action調(diào)用的方法

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";              }          }  }

然后調(diào)用DispatcherUtils的serviceAction方法中的

if (mapping.getResult() != null) {                  Result result = mapping.getResult();                  result.execute(proxy.getInvocation());              } else {                  proxy.execute();  }

完成用戶(hù)的最終要執(zhí)行的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對(duì)象,將Action調(diào)用提交給ActionInvocation處理。

5、 一旦Action方法返回,ActionInvocation就要查找xwork.xml文件中這個(gè)Action的結(jié)果碼(Action Result Code)(一個(gè)String如success、input)所對(duì)應(yīng)的result,然后執(zhí)行這個(gè)result。通常情況下,result會(huì)調(diào)用JSP或FreeMarker模板來(lái)呈現(xiàn)頁(yè)面。當(dāng)呈現(xiàn)頁(yè)面時(shí),模板可以使用WebWork提供的一些標(biāo)簽,其中一些組件可以和ActionMapper一起工作來(lái)為后面的請(qǐng)求呈現(xiàn)恰當(dāng)?shù)腢RL。

下面我們來(lái)看action部分的定義:

   /common/loginedHomeAction!init.action  

這里的result結(jié)點(diǎn)有一個(gè)type屬性,這表示此action的結(jié)果應(yīng)該怎樣處理。

再來(lái)看看dispatcher類(lèi)型的result是怎么定義的:

到這里就可以知道了處理是交給ServletDispatcherResult類(lèi)來(lái)做的。

ServletDispatcherResult類(lèi)繼承了WebWorkResultSupport類(lèi),而WebWorkResultSupport實(shí)現(xiàn)了com.opensymphony.xwork.Result接口,此接口用來(lái)處理action的結(jié)果。WebWorkResultSupport類(lèi)定義了一個(gè)抽象的方法——doExecute,此方法用于實(shí)現(xiàn)對(duì)Result的處理。

下面來(lái)看看ServletDispatcherResult是怎么處理的:

public void doExecute(String finalLocation, ActionInvocation invocation) throws Exception {           PageContext pageContext = ServletActionContext.getPageContext();           if (pageContext != null) {              pageContext.include(finalLocation);          } else {              HttpServletRequest request = ServletActionContext.getRequest();              HttpServletResponse response = ServletActionContext.getResponse();              RequestDispatcher dispatcher = request.getRequestDispatcher(finalLocation);               // if the view doesn't exist, let's do a 404              if (dispatcher == null) {                  response.sendError(404, "result '" + finalLocation + "' not found");                   return;              }               // If we're included, then include the view              // Otherwise do forward               // This allow the page to, for example, set content type               if (!response.isCommitted() && (request.getAttribute("javax.servlet.include.servlet_path") == null)) {                  request.setAttribute("webwork.view_uri", finalLocation);                  request.setAttribute("webwork.request_uri", request.getRequestURI());                   dispatcher.forward(request, response);              } else {                  dispatcher.include(request, response);              }          }      }

我們看到,最終調(diào)用的是dispatcher.forward(request, response);這樣就可以成功轉(zhuǎn)到我們的目標(biāo)頁(yè)了。

以下代碼為DispatcherUtils中的serviceAction方法中的:

public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context, ActionMapping mapping)      throws ServletException  {      Map extraContext = createContextMap(request, response, mapping, context);      OgnlValueStack stack = (OgnlValueStack)request.getAttribute("webwork.valueStack");      if(stack != null)          extraContext.put("com.opensymphony.xwork.util.OgnlValueStack.ValueStack", new OgnlValueStack(stack));      try      {          String namespace = mapping.getNamespace();          String name = mapping.getName();          String method = mapping.getMethod();          String id = request.getParameter("__continue");          if(id != null)          {              Map params = (Map)extraContext.get("com.opensymphony.xwork.ActionContext.parameters");              params.remove("__continue");              extraContext.put("__continue", id);          }          ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(namespace, name, extraContext, true, false);          proxy.setMethod(method);          request.setAttribute("webwork.valueStack", proxy.getInvocation().getStack());          if(mapping.getResult() != null)          {              Result result = mapping.getResult();              result.execute(proxy.getInvocation());          } else          {              proxy.execute();          }          if(stack != null)              request.setAttribute("webwork.valueStack", stack);      }      catch(ConfigurationException e)      {          LOG.error("Could not find action", e);          sendError(request, response, 404, e);      }      catch(Exception e)      {          String msg = "Could not execute action";          LOG.error(msg, e);          throw new ServletException(msg, e);      }  }

三、WebWork的執(zhí)行流程圖

WebWork的框架初始化過(guò)程和用戶(hù)請(qǐng)求處理過(guò)程

到此,相信大家對(duì)“WebWork的框架初始化過(guò)程和用戶(hù)請(qǐng)求處理過(guò)程”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!


本文名稱(chēng):WebWork的框架初始化過(guò)程和用戶(hù)請(qǐng)求處理過(guò)程
轉(zhuǎn)載來(lái)于:http://weahome.cn/article/giedpi.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部