日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
WebWork的執(zhí)行流程

 一、WebWork的框架初始化過程

成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供城西企業(yè)網(wǎng)站建設,專注與成都網(wǎng)站建設、成都網(wǎng)站制作、HTML5、小程序制作等業(yè)務。10年已為城西眾多企業(yè)、政府機構(gòu)等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設公司優(yōu)惠進行中。

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

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

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

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

 
 
 
 
  1. public void init(ServletConfig servletConfig)  
  2.       throws ServletException  
  3.   {  
  4.       super.init(servletConfig);  
  5.       DispatcherUtils.initialize(getServletContext());  
  6.  
  7.    } 

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

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

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

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

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

 
 
 
 
  1. public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException {  
  2.   //....  
  3.     try  
  4.     {  
  5.         request = du.wrapRequest(request, getServletContext());  
  6.     }  
  7.     catch(IOException e)  
  8.     {  
  9.         String message = "Could not wrap servlet request with MultipartRequestWrapper!";  
  10.         LOG.error(message, e);  
  11.         throw new ServletException(message, e);  
  12.     }  
  13.     du.serviceAction(request, response, getServletContext(), mapping);  

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

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

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

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

 
 
 
 
  1. public static synchronized Configuration getConfiguration()  
  2. {  
  3.     if(configurationInstance == null)  
  4.     {  
  5.         configurationInstance = new DefaultConfiguration();  
  6.         try  
  7.         {  
  8.             configurationInstance.reload();  
  9.         }  
  10.         catch(ConfigurationException e)  
  11.         {  
  12.             configurationInstance = null;  
  13.             throw e;  
  14.         }  
  15.     } else  
  16.     {  
  17.         conditionalReload();  
  18.     }  
  19.     return configurationInstance;  

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

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

通過DefaultActionProxy類的invocation = ActionProxyFactory.getFactory().createActionInvocation(this, extraContext);

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

 
 
 
 
  1. privatevoid resolveMethod() {  
  2.         // if the method is set to null, use the one from the configuration  
  3.         // if the one from the configuration is also null, use "execute"  
  4.         if (!TextUtils.stringSet(this.method)) {  
  5.             this.method = config.getMethodName();  
  6.             if (!TextUtils.stringSet(this.method)) {  
  7.                 this.method = "execute";  
  8.             }  
  9.         }  

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

 
 
 
 
  1. if (mapping.getResult() != null) {  
  2.                 Result result = mapping.getResult();  
  3.                 result.execute(proxy.getInvocation());  
  4.             } else {  
  5.                 proxy.execute();  

完成用戶的最終要執(zhí)行的action方法。

 
 
 
 
  1. public String execute() throws Exception {  
  2.         ActionContext nestedContext = ActionContext.getContext();  
  3.         ActionContext.setContext(invocation.getInvocationContext());  
  4.    
  5.         String retCode = null;  
  6.    
  7.         try {  
  8.             retCode = invocation.invoke();  
  9.         } finally {  
  10.             if (cleanupContext) {  
  11.                 ActionContext.setContext(nestedContext);  
  12.             }  
  13.         }  
  14.    
  15.         return retCode;  
  16.     } 

最終處理ActionContext對象,將Action調(diào)用提交給ActionInvocation處理。

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

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

 
 
 
 
  1.  name="loginAction" class="loginAction"> 
  2.    name="success" type="dispatcher">/common/loginedHomeAction!init.action 
  3.   

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

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

 
 
 
 
  1.  name="dispatcher" class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult" default="true"/> 

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

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

下面來看看ServletDispatcherResult是怎么處理的:

 
 
 
 
  1. public void doExecute(String finalLocation, ActionInvocation invocation) throws Exception {  
  2.  
  3.         PageContext pageContext = ServletActionContext.getPageContext();  
  4.  
  5.         if (pageContext != null) {  
  6.             pageContext.include(finalLocation);  
  7.         } else {  
  8.             HttpServletRequest request = ServletActionContext.getRequest();  
  9.             HttpServletResponse response = ServletActionContext.getResponse();  
  10.             RequestDispatcher dispatcher = request.getRequestDispatcher(finalLocation);  
  11.  
  12.             // if the view doesn't exist, let's do a 404  
  13.             if (dispatcher == null) {  
  14.                 response.sendError(404, "result '" + finalLocation + "' not found");  
  15.  
  16.                 return;  
  17.             }  
  18.  
  19.             // If we're included, then include the view  
  20.             // Otherwise do forward   
  21.             // This allow the page to, for example, set content type   
  22.             if (!response.isCommitted() && (request.getAttribute("javax.servlet.include.servlet_path") == null)) {  
  23.                 request.setAttribute("webwork.view_uri", finalLocation);  
  24.                 request.setAttribute("webwork.request_uri", request.getRequestURI());  
  25.  
  26.                 dispatcher.forward(request, response);  
  27.             } else {  
  28.                 dispatcher.include(request, response);  
  29.             }  
  30.         }  
  31.     } 

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

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

 
 
 
 
  1. public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context, ActionMapping mapping)  
  2.     throws ServletException  
  3. {  
  4.     Map extraContext = createContextMap(request, response, mapping, context);  
  5.     OgnlValueStack stack = (OgnlValueStack)request.getAttribute("webwork.valueStack");  
  6.     if(stack != null)  
  7.         extraContext.put("com.opensymphony.xwork.util.OgnlValueStack.ValueStack", new OgnlValueStack(stack));  
  8.     try  
  9.     {  
  10.         String namespace = mapping.getNamespace();  
  11.         String name = mapping.getName();  
  12.         String method = mapping.getMethod();  
  13.         String id = request.getParameter("__continue");  
  14.         if(id != null)  
  15.         {  
  16.             Map params = (Map)extraContext.get("com.opensymphony.xwork.ActionContext.parameters");  
  17.             params.remove("__continue");  
  18.             extraContext.put("__continue", id);  
  19.         }  
  20.         ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(namespace, name, extraContext, true, false);  
  21.         proxy.setMethod(method);  
  22.         request.setAttribute("webwork.valueStack", proxy.getInvocation().getStack());  
  23.         if(mapping.getResult() != null)  
  24.         {  
  25.             Result result = mapping.getResult();  
  26.             result.execute(proxy.getInvocation());  
  27.         } else  
  28.         {  
  29.             proxy.execute();  
  30.         }  
  31.         if(stack != null)  
  32.             request.setAttribute("webwork.valueStack", stack);  
  33.     }  
  34.     catch(ConfigurationException e)  
  35.     {  
  36.         LOG.error("Could not find action", e);  
  37.         sendError(request, response, 404, e);  
  38.     }  
  39.     catch(Exception e)  
  40.     {  
  41.         String msg = "Could not execute action";  
  42.         LOG.error(msg, e);  
  43.         throw new ServletException(msg, e);  
  44.     }  

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


文章名稱:WebWork的執(zhí)行流程
本文鏈接:http://m.5511xx.com/article/cocseop.html