[英]How to retrieve form data posted with jQuery fileupload to Java servlet?
[英]How do you access posted form data in a servlet?
如果我有一個運行 JVM1.4.2 的 servlet,它正在接收一個帶有表單數據字段的 POST 請求。 我使用 req.getParameterNames() 來獲取我所期望的所有查詢字符串和表單數據。 但是,我得到的只是查詢字符串參數。
我從各種來源閱讀的文獻說getParameterNames()和 getParameterValues(String) 應該是獲取瀏覽器為 JDK 1.4 發送的所有查詢字符串和發布的表單數據的方式。 這是我用來提取所有參數的方法,我希望這些參數包括已發布的表單數據:
public Map getParameterMap(HttpServletRequest req) {
Map params= new HashMap();
String name = null;
System.out.println("<< Getting Parameter Map.>>");
Enumeration enumParams = req.getParameterNames();
for (; enumParams.hasMoreElements(); ) {
// Get the name of the request parameter
name = (String)enumParams.nextElement();
// Get the value of the request parameters
// If the request parameter can appear more than once
// in the query string, get all values
String[] values = req.getParameterValues(name);
params.put(name, values);
String sValues = "";
for(int i=0;i<values.length;i++){
if(0<i) {
sValues+=",";
}
sValues +=values[i];
}
System.out.println("Param " + name + ": " + sValues);
}
System.out.println("<< END >>");
return params;
}
這個問題也符合我的預期,但是 servlet 並沒有拾取表單數據。 顯然我錯過了一些東西......
更新:帖子數據非常簡單,不是多部分形式或富媒體。 只是通過 AJAX POST 提交的純文本,在帖子正文中看起來像這樣
c1=價值%20A&c2=價值%20B&c3=價值%20C
確實如此。 getParameterNames()、getParameterValues() 和 getParameter() 方法是訪問表單數據的方法,除非它是一個多部分表單,在這種情況下,您必須使用Commons Fileupload之類的東西來解析多部分請求,然后所有參數都是您可以訪問。
編輯:您可能沒有在 AJAX 調用中正確編碼 POST 數據。 POST 數據的 Content-Type 必須為application/x-www-form-urlencoded或 multipart/form-data。 如果您將其作為其他內容發送,則它不符合請求參數的條件,我希望您會看到您所描述的行為。 您設計的解決方案基本上包括設置自定義內容的自定義解析。
我設法確定了問題所在。 因為來自 JDK 1.5+ 的討論太多了,並且談到了 1.5 的 getParameterMaps() 方法,所以關於 1.4 如何處理表單發布數據的信息很少且模棱兩可。 (如果您發現特定於 1.4 的內容,請發表評論)。
Pre-1.5 您必須通過getInputStream手動獲取表單數據,然后將其解析出來。 我從 java sun 站點找到了這種方法(發布在下面),它使用 Hashtable 做得很好。 我不得不為已棄用的方法制作一個小模組。 但似乎工作得相當穩健,“開箱即用”,所以你應該可以直接剪切粘貼。 我知道這是“老技術”,但我認為對於那些可能與我處於相同情況並堅持解決(似乎是)直截了當的問題的人來說,這是值得的。
public Hashtable parsePostData(int length, ServletInputStream instream) {
String valArray[] = null;
int inputLen, offset;
byte[] postedBytes = null;
boolean dataRemaining=true;
String postedBody;
Hashtable ht = new Hashtable();
//Vector paramOrder = new Vector(10);
StringBuffer sb = new StringBuffer();
if (length <=0) {
return null;
}
postedBytes = new byte[length];
try {
offset = 0;
while(dataRemaining) {
inputLen = instream.read (postedBytes, offset, length - offset);
if (inputLen <= 0) {
throw new IOException ("read error");
}
offset += inputLen;
if((length-offset) ==0) {
dataRemaining=false;
}
}
} catch (IOException e) {
System.out.println("Exception ="+e);
return null;
}
postedBody = new String (postedBytes);
StringTokenizer st = new StringTokenizer(postedBody, "&");
String key=null;
String val=null;
while (st.hasMoreTokens()) {
String pair = (String)st.nextToken();
int pos = pair.indexOf('=');
if (pos == -1) {
throw new IllegalArgumentException();
}
try {
key = URLDecoder.decode(pair.substring(0, pos),"UTF8");
val = java.net.URLDecoder.decode(pair.substring(pos+1,pair.length()),"UTF8");
} catch (Exception e) {
throw new IllegalArgumentException();
}
if (ht.containsKey(key)) {
String oldVals[] = (String []) ht.get(key);
valArray = new String[oldVals.length + 1];
for (int i = 0; i < oldVals.length; i++) {
valArray[i] = oldVals[i];
}
valArray[oldVals.length] = val;
} else {
valArray = new String[1];
valArray[0] = val;
}
ht.put(key, valArray);
String sValues = "";
for(int i=0;i<valArray.length;i++) {
if (0<i) {
sValues+=",";
}
sValues = valArray[i];
}
System.out.println("Form data field " + key + ":" +sValues);
//paramOrder.addElement(key);
}
return ht;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.