發現一個問題,使用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之后都沒有再還原。
tomcat、jdk1.4下出現The output format must have a '{http://xml.apache.org/xalan}content-handler' property!的原因:
這是因為系統、tomcat或者jdk使用了老版本的xalan.jar。系統如果本身沒有使用,而tomcat/common/lib、tomcat/common/endorsed/lib、tomcat/shared/lib下又沒有xalan.jar的話,那就是jdk使用了老版本的xalan.jar——在jre\lib\rt.jar里面。下載最新的xalan.jar然后放到tomcat/common/endorsed下即可解決這一問題。
暫時記下,沒想透徹,思考所得、個人見解以后再加入。
企業發展的4個階段:
產品階段
資產階段
資本階段
品牌階段
企業管理的4個階段:
人治,嘴上說
法治,建立制度
企業文化
目標管理,充分發揮員工的積極主動型,自我管理
blog很好,blogjava暫時感覺也很好,可是為什么不能寫只允許自己看的日志呢?雖說blog就是為了大家能夠分享彼此的觀點感想,但是總有一些東西是不便公開或者暫時不能公開的。如果允許寫只允許自己看的日志,blog的應用范圍就會更大,價值也會被充分挖掘了。
也可能是我愚昧,對blog了解還不深吧,上述所說的blog也許已經出現了(自己搞一個得了,笑談)。