1. 程式人生 > >Struts Action例項化,從原始碼上分析

Struts Action例項化,從原始碼上分析

/**
     * Load Action class for mapping and invoke the appropriate Action method, or go directly to the Result.
     * <p/>
     * This method first creates the action context from the given parameters,
     * and then loads an <tt>ActionProxy</tt> from the given action name and namespace.
     * After that, the Action method is executed and output channels through the response object.
     * Actions not found are sent back to the user via the {@link Dispatcher#sendError} method,
     * using the 404 return code.
     * All other errors are reported by throwing a ServletException.
     *
     * @param request  the HttpServletRequest object
     * @param response the HttpServletResponse object
     * @param mapping  the action mapping object
     * @throws ServletException when an unknown error occurs (not a 404, but typically something that
     *                          would end up as a 5xx by the servlet container)
     * @param context Our ServletContext object
     */
    public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context,
                              ActionMapping mapping) throws ServletException {

        Map<String, Object> extraContext = createContextMap(request, response, mapping, context);

        // If there was a previous value stack, then create a new copy and pass it in to be used by the new Action
        ValueStack stack = (ValueStack) request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
        boolean nullStack = stack == null;
        if (nullStack) {
            ActionContext ctx = ActionContext.getContext();
            if (ctx != null) {
                stack = ctx.getValueStack();
            }
        }
        if (stack != null) {
            extraContext.put(ActionContext.VALUE_STACK, valueStackFactory.createValueStack(stack));
        }

        String timerKey = "Handling request from Dispatcher";
        try {
            UtilTimerStack.push(timerKey);
            String namespace = mapping.getNamespace();
            String name = mapping.getName();
            String method = mapping.getMethod();

            Configuration config = configurationManager.getConfiguration();
            ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
                    namespace, name, method, extraContext, true, false);

            request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, proxy.getInvocation().getStack());

            // 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 (!nullStack) {
                request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, stack);
            }
        } catch (ConfigurationException e) {
            // WW-2874 Only log error if in devMode
            if(devMode) {
                String reqStr = request.getRequestURI();
                if (request.getQueryString() != null) {
                    reqStr = reqStr + "?" + request.getQueryString();
                }
                LOG.error("Could not find action or result\n" + reqStr, e);
            }
            else {
                    if (LOG.isWarnEnabled()) {
                LOG.warn("Could not find action or result", e);
                    }
            }
            sendError(request, response, context, HttpServletResponse.SC_NOT_FOUND, e);
        } catch (Exception e) {
            sendError(request, response, context, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e);
        } finally {
            UtilTimerStack.pop(timerKey);
        }
    }

相關推薦

Struts Action例項原始碼分析

/**      * Load Action class for mapping and invoke the appropriate Action method, or go directly to the Result.      * <p/>      * This method first

資料視覺在地圖分析供應鏈/銷售/物流網路

這是一位圖表仿會員諮詢我的問題。 她在一家著名的跨國集團公司從事Supply Network方面的工作,其中一項任務是每月要繪製一種銷售網路圖,見下圖示意。她們使用大海報紙畫或visio畫,每個產品組為單位繪製一張圖,每個產品組內一般有10-40對發運關係,也就是箭頭

原始碼分析ListView的addHeaderView和setAdapter的呼叫順序

ListView想要新增headerview的話,就要通過addHeaderView這個方法,然後想要為ListView設定資料的話,就要呼叫setAdapter方法了。但是,在呼叫addHeaderView和setAdapter的順序上,有時會爆出java.lang.Il

硬核乾貨:4W字原始碼分析JUC執行緒池ThreadPoolExecutor的實現原理

![](https://throwable-blog-1256189093.cos.ap-guangzhou.myqcloud.com/202008/j-u-c-t-p-e-logo.png) ## 前提 很早之前就打算看一次JUC執行緒池`ThreadPoolExecutor`的原始碼實現,由於近段時間

Fragment例項Fragment生命週期原始碼分析

Fragment的例項化,Fragment的生命週期 android.support.v4.app.FragmentActivity#onCreate @Override protected void onCreate(Bundle savedI

struts action例項原始碼

struts-config.xml配置actionJava action類package com.anlai.ticket.action;import java.io.IOException;import java.util.ArrayList;import java.uti

VEFX維億:全新限價止盈損系統根源杜絕滑點

成本 選擇 log ffffff 靈活 競爭 客戶服務 機制 行業 如今市場經濟發展迅速,人們已經把生活重心放在了資金的保值增值方面。股指投資作為一種比較新型的投資方式,在投資人中廣受好評。股指行業中的優質平臺VEFX維億,因其全方位保障用戶利益而獲得了眾多投資者的青睞。

Java 抽象類可以間接實現例項無法直接例項

抽象類無法直接例項化, 它的例項化方式並不是通過普通的new方式來建立物件,而是通過父類的應用來指向子類的例項間接地實現父類的例項化,因為子類在例項化之前,一定會先例項化它的父類。這樣建立了繼承抽象類的子類物件,也就把其父類(抽象類)給例項化了。 注意:介面與抽象類非常類似,但是它不可以被例項化

JAVA中建立HTTP通訊伺服器獲取HTML程式碼通過HTTP請求來下載圖片或其他二進位制檔案的程式下載結果要按下載到的檔案型別進行存檔中。

通過HTTP請求來下載圖片或其他二進位制檔案的程式,下載結果要按下載到的檔案型別進行存檔 將程式碼從伺服器的中獲取下來的程式碼,在我之前已經講過了這裡寫連結內容 這裡我們就直接將原始碼稍加改動,加入一個檔案並請將builder 寫入即可。 import

一文讀懂PID控制演算法(拋棄公式原理真正理解PID控制)

PID控制演算法的C語言實現一 PID演算法原理    最近兩天在考慮一般控制演算法的C語言實現問題,發現網路上尚沒有一套完整的比較體系的講解。於是總結了幾天,整理一套思路分享給大家。    在工業應用中PID及其衍生演算法是應用最廣泛的演算法之一,是當之無愧的萬能演算法

圖片或檔案傳到伺服器或伺服器讀取(圖片可根據路徑src回顯展示伺服器讀出來)

不需要配置虛擬路徑,存的時候資料庫裡只存了圖片的名稱(隨機重新命名的形式),存在指定伺服器上,取的時候也是根據圖片名稱從伺服器上找到,並用OutputStream 讀出來 前臺頁面(用的bootstrap): html程式碼(可回顯,回顯的時候也是去後臺根據路徑查詢到圖片):

ios通過圖片的URL地址網路獲取圖片(UIImage型別)

-(UIImage *) getImageFromURL:(NSString *)fileURL  { UIImage * result; NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithSt

讓員工、使用者粉絲選好社群軟體開始

在粉絲經濟大熱的今天,很多企業都想依靠搭建粉絲社群來讓自己的使用者、員工粉絲化,讓自己的產品、品牌和企業被粉絲所熱愛,因此需要一個社群讓粉絲們互動成長。或者讓自己的員工有一個互相交流的平臺,不管是吐槽煩心事,還是分享喜悅,都能有的放矢。亦或是讓自己的客戶們有一個互相溝通業務的社群,為企業間的互利共贏群策群力。

hashMap的執行緒不安全原始碼談起

HashMap的原理以及如何實現,之前在JDK7與JDK8中HashMap的實現中已經說明了。 那麼,為什麼說HashMap是執行緒不安全的呢?它在多執行緒環境下,會發生什麼情況呢? resize死迴圈 我們都知道HashMap初始容量大小為16,一般來說,當有資料要插入時,

前臺資料json序列post或get中取py資料型別:QueryDict轉字典dict

前端 $.ajax({ url:"/count_home/", type:"GET", data:JSON.stringify({ first_num:$("

面向物件程式設計(一)建立類例項屬性引用

  在python中,用變量表示特徵,用函式表示技能,因而類是變數與函式的結合體,物件是變數與方法(指向類的函式)的結合體。 class 類名:#定義一個類 類體   類有兩種作用:屬性引用和例項化 t=類名()#例項化 類名加括號就是例項化,會自動觸發__in

Opengl-例項(不知道為啥叫例項感覺應該叫一次批量渲染)

核心:glDrawArraysInstanced 和以往的不同就是這句Draw的時候改成這個API 補充:glVertexAttribDivisor 這個函式告訴了OpenGL該什麼時候更新頂點屬性的內容至新一組資料。它的第一個引數是需要的頂點屬性

百度編輯器例項相當於from表單中的內容直接post到後臺

<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8"> &

mybatis與spring整合是對映器介面無法例項空指標異常

問題:   DeBug執行 mabite中Mapper介面的例項化物件找不到,顯示為NULL解決:問題一:我一直是以為Mapper的注入出了問題,,結果恰恰不是,問題出在了service ,因為在service裡面是通過注入的方式獲得Mapper的例項化物件的,所以servi