91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

WebWork的框架初始化過程和用戶請求處理過程

發布時間:2021-09-14 15:04:58 來源:億速云 閱讀:145 作者:chen 欄目:編程語言

本篇內容主要講解“WebWork的框架初始化過程和用戶請求處理過程”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“WebWork的框架初始化過程和用戶請求處理過程”吧!

一、WebWork的框架初始化過程

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

并且web.xml中配置好ServletDispatcher的映射,當用戶用映射好的結尾資源請求瀏覽器時,ServletDispatcher會進行請求處理(ServletDispatcher是一個HttpServlet)。

具體實現是通過以下步驟:

1、通過ServletDispatcher中的init方法進行框架的初始化工作:

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

2、init方法又同時調用DispatcherUtils類的initialize方法創建DispatcherUtils實例,同時間接調用DispatcherUtils類的init方法初始化Configuration配置,創建對象創建的工廠ObjectFactory和ObjectTypeDeterminer。

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

二、WebWork的用戶請求處理過程

所有以web.xml中映射ServletDispatcher結尾的服務請求將由ServletDispatcher進行處理。

1、從用戶請求的服務名中解析出對應Action的名稱。

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 中的數據,并將其復制到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的

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

完成對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處理。

5、 一旦Action方法返回,ActionInvocation就要查找xwork.xml文件中這個Action的結果碼(Action Result Code)(一個String如success、input)所對應的result,然后執行這個result。通常情況下,result會調用JSP或FreeMarker模板來呈現頁面。當呈現頁面時,模板可以使用WebWork提供的一些標簽,其中一些組件可以和ActionMapper一起工作來為后面的請求呈現恰當的URL。

下面我們來看action部分的定義:

<action name="loginAction" class="loginAction">   <result name="success" type="dispatcher">/common/loginedHomeAction!init.action</result>  </action>

這里的result結點有一個type屬性,這表示此action的結果應該怎樣處理。

再來看看dispatcher類型的result是怎么定義的:

<result-type name="dispatcher" class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult" default="true"/>

到這里就可以知道了處理是交給ServletDispatcherResult類來做的。

ServletDispatcherResult類繼承了WebWorkResultSupport類,而WebWorkResultSupport實現了com.opensymphony.xwork.Result接口,此接口用來處理action的結果。WebWorkResultSupport類定義了一個抽象的方法——doExecute,此方法用于實現對Result的處理。

下面來看看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);              }          }      }

我們看到,最終調用的是dispatcher.forward(request, response);這樣就可以成功轉到我們的目標頁了。

以下代碼為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的執行流程圖

WebWork的框架初始化過程和用戶請求處理過程

到此,相信大家對“WebWork的框架初始化過程和用戶請求處理過程”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

萝北县| 和平县| 昌吉市| 来凤县| 昆明市| 工布江达县| 广汉市| 文成县| 庄浪县| 武宁县| 东乡族自治县| 太原市| 沾益县| 永顺县| 湖口县| 法库县| 大新县| 武乡县| 龙口市| 沾益县| 延安市| 乌兰浩特市| 习水县| 墨玉县| 望奎县| 新巴尔虎左旗| 马龙县| 香格里拉县| 彰武县| 岫岩| 淳化县| 甘孜县| 思南县| 南丰县| 集安市| 灵寿县| 乡城县| 寻乌县| 屯留县| 慈利县| 桃园市|