struts上传文件,验证失败表单数据丢失的原因
生活随笔
收集整理的這篇文章主要介紹了
struts上传文件,验证失败表单数据丢失的原因
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
struts上傳文件,驗證失敗表單數據丟失的原因
發現一個問題,使用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之后都沒有再還原。
發現一個問題,使用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之后都沒有再還原。
總結
以上是生活随笔為你收集整理的struts上传文件,验证失败表单数据丢失的原因的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Select的OnChange()事件中
- 下一篇: 爱生气的女孩