Dev Zone
          偏執狂才能生存,人生/事業的路上需要再堅持一下
          但是又怎么說得清堅持的結果,道得盡堅持的含義
               發現一個問題,使用struts進行文件上傳,如果有些參數沒有完全定義在ActionForm中,需要從request.getParameter獲取,在表單提交并且validate失敗返回input頁面時,這部分需要從request.getPrameter獲取的參數數據都丟失了,即使再對request進行multipart解析也不能得到。

               經過分析,發現struts的ActionServlet在接收到multipart請求之后,在RequestProcessor中會對request進行封裝:MultiRequestWrapper,然后在Action執行完之后,又將已經封裝的request重新還原。以下是部分代碼,截直RequestProcessor:

          封裝:
              protected HttpServletRequest processMultipart(HttpServletRequest request) {

                  
          if (!"POST".equalsIgnoreCase(request.getMethod())) {
                      
          return (request);
                  }

                  
                  String contentType 
          = request.getContentType();
                  
          if ((contentType != null&&
                      contentType.startsWith(
          "multipart/form-data")) {
                      
          return (new MultipartRequestWrapper(request));
                  }
           else {
                      
          return (request);
                  }


              }

          還原:
             在doForward和doInclude中在forward和include之前都執行了下面的代碼:
                  if (request instanceof MultipartRequestWrapper) {
                      request 
          = ((MultipartRequestWrapper) request).getRequest();
                  }


               問題就出現在這兒。在經過測試之后,發現request只能進行一次multipart解析,這或許和解析request的時候調用了request.inputStream有關,第一次調用之后再調用就不能獲取其中的有效內容了。因此發現request在調用CommonsMultipartRequestHandler.handleRequest進行解析后并還原后,調用common-upload對request進行解析已經得不到任何得提交內容了,因此當Form驗證失敗,返回input頁面時,即使再進行multpart解析,也不能通過request.getPrameter取到你想要的數據。而此時,表單中的數據卻不會丟失(定義在ActionForm中的表單域),這是因為struts的html系列tag在redisplay時值都是從ActionForm獲取的。

                 在將RequestProcessor.doForward和doInclude中還原request的語句注釋后,問題得到了解決。到目前還不清楚為什么struts要還原request,難道是因為chain的原因?

                 webwork中應該不會出現這個問題,因為webwork中無論ServletDispatcher還是FilterDispatcher在對request wrap之后都沒有再還原。
          posted on 2006-03-15 06:10 dev 閱讀(3943) 評論(1)  編輯  收藏 所屬分類: 設計/開發
          Comments
          • # re: struts上傳文件,驗證失敗表單數據丟失的原因
            keith
            Posted @ 2006-03-15 10:15
            關注這個問題  回復  更多評論   
           
          主站蜘蛛池模板: 辉县市| 水富县| 贵州省| 通海县| 延安市| 龙南县| 广宁县| 兴国县| 夏邑县| 个旧市| 赤水市| 山阳县| 尼勒克县| 静安区| 鹤山市| 阳东县| 许昌县| 寿宁县| 瓦房店市| 治多县| 深州市| 大关县| 嵊泗县| 探索| 剑阁县| 南城县| 彭阳县| 慈溪市| 米泉市| 浏阳市| 金昌市| 建德市| 黑水县| 新和县| 绥宁县| 永顺县| 翁源县| 甘洛县| 县级市| 行唐县| 迁西县|