使用SptingMVC3.1.3 對于檔案上傳送出的表單我們都會設定:enctype="multipart/form-data" 的一個設定, 那麼值得注意的問題出現了, 對于表單post送出的資料無法綁定到背景的參數中, 緊接着伺服器會向浏覽器用戶端抛HTTP STATUS 400 的錯誤, 或者出現 類型轉換的的異常, 這個問題從開始一直困擾着我好些天,一直都不能解決這個問題,這個問題一直困擾自己好些天。 先貼出自己的錯誤的 伺服器端會向Broswer傳回 400 的bad request 的錯誤! 看看大家能否看出錯誤的地方?大家一起幫忙找找錯誤在哪裡?
貼以前的錯誤配置代碼 :
web.xml
Web.xml代碼:
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="3.0"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
- <display-name>springmvc</display-name>
- <filter>
- <filter-name>characterEncoding</filter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>characterEncoding</filter-name>
- <url-pattern>
- @Controller
- @Scope("prototype")
- @RequestMapping("/fileupload")
- public class FileUploadActionController {
- @RequestMapping(value ="/uploadOne",method=RequestMethod.POST)
- public String fileUploadOne(
- @RequestParam("file") MultipartFile file) {
- System.err.println("okokoko");
- return "default";
- }
- }
Index.jsp代碼:
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>首頁</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="This is my page">
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css">
- -->
- </head>
- <body>
- <center>
- <a href="<c:url value='/spring/annotation/a'/>">springmvc注解的配置 無參數的測試</a> <br>
- <a href="<c:url value='/spring/annotation/b?name=tom'/>">springmvc注解的配置 無參數為字元串的配置</a><br>
- <a href="<c:url value='/spring/annotation/JACK/c.info'/>">springmvc注解的配置 基于RESTFULL字元串的配置</a><br>
- <a href="<c:url value='/spring/annotation/24/JACK/d_5.html'/>">springmvc注解的配置 基于RESTFULL多參數的配置</a>
- <hr>
- <h2>檔案上傳部分</h2>
- <h3>單個檔案上傳.....</h3>
- <form action="<c:url value='/spring/fileupload/uploadOne'/>" method="post" enctype="multipart/form-data">
- <input type="file" name="file"><br>
- <input type="submit" >
- </form>
- </center>
- </body>
- </html>
代碼上傳完畢!看看能否看出哪裡出錯了 ,去網上求解, 網上有大量檔案上傳的例子, 都看和自己的配置差不多,都是大同小異 , 自己實在是沒有辦法, 自己隻有跟源碼一步一步的進行調試 跟下去,加上log4j日志。 對應Springmvc的調試跟代碼 跟源碼那也要有一個入口點, 就像Struts2一樣 ,的有一個核心過濾器 StrutsPreparedAndExecuteFilter ,而對應我們的springmvc的核心類 那就是DispatcherServlet 此類就是Springmvc的核心, 學springmvc我們都知道這個servlet是做什麼用的,簡單的來說它是處理一個請求,并提供映射和異常處理的功能! 我們看看此Servlet的大綱視圖 看看 有什麼貓咪 ? 暈?? 這怎麼有個成員變量 》???
哦 它的是從 這個命名空間中的bean的工廠中擷取的bean的名稱: ?? 不敢确定 ?
看着像我們在xml中配置的那個bean ???? 難道 ??? 真是? 看看能否有什麼set 方法嗎???
我們繼續往下找, 單可以肯定在啟動項目的時候會進行一系列的初始化我們在 xml配置的那些處理器 也就是我們的handler Resolver
一大片都是 resolver
直接把它卡在源代碼的456行 ::
不看什麼 看logger日志我們都知道 , 要查找名稱為:multipartResolver 的bean 再看我們的代碼: 娘的, 真的少加id=“multipartResolver ”了。
那肯定是我們配置的org.springframework.web.multipart.commons.CommonsMultipartResolver 根本沒有起到作用, 一定要加上id=“multipartResolver ” 不然, 在你的項目進行啟動的時候會找不到這樣的bean的。 小小的錯誤,小小的失誤 真的很煩人。
輸出的日志::
很明顯 我們配置的org.springframework.web.multipart.commons.CommonsMultipartResolver 根本沒有起到作用!! 對應别人的代碼我們隻能參考嗎, 不能一味的去copy 不跟自己有空自己去看看源碼,
正确的是::
原文參考自站長網http://www.software8.co/wzjs/qtyy/2819.html
最後 要注意的是 : 在我們配置的bean中一定要加上 id ="multipartResolver" 不然你配置的也沒有用的 。 不然你的表單設定成 multipart/form-data 是無法綁定參數的 會出現類型轉換的異常!
在寫的地方哪裡有不清楚的地方,請見諒,我也是項目的需要 ,剛剛碰Springmvc 。把正确簡單的demo 上傳上去。
轉載于:https://www.cnblogs.com/wwwroot/archive/2013/01/22/2871560.html