如果我有一个运行JVM1.4.2的servlet,它正在接收带有表单数据字段的POST请求。我使用req.getParameterNames()来获取我所期望的所有查询字符串和表单数据。但是,我得到的只是查询字符串参数。
来自各种reading的文件sources表示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;
}
This问题也同意我的期望,但servlet没有提取表单数据。显然我错过了一些东西......
更新:帖子数据非常简单,不是Multipart表单或富媒体。只是通过AJAX POST提交的普通文本,在帖子正文中看起来像这样
C1 =值%20A&安培; C2 =值%20B&安培; C3 =值%20℃
答案 0 :(得分:0)
这是真的。 getParameterNames(),getParameterValues()和getParameter()方法是访问表单数据的方法,除非它是一个多部分表单,在这种情况下你必须使用像Commons Fileupload之类的东西在您可以访问所有参数之前解析多部分请求。
编辑:您可能没有在AJAX调用中正确编码POST数据。 POST数据必须包含application/x-www-form-urlencoded的内容类型或多部分/表单数据。如果您将其作为其他内容发送,则它不符合请求参数,我希望您能看到您所描述的行为。您设计的解决方案主要包括设置自定义内容的自定义解析。
答案 1 :(得分:0)
我设法找出问题所在。因为有来自JDK 1.5+的讨论很多,并且谈论了1.5的getParameterMaps()方法,关于1.4如何处理表单数据的信息很少且含糊不清。 (如果您发现特定于1.4的内容,请发表评论)。
1.5之前,您必须通过getInputStream手动获取表单数据,然后解析出来。我在java sun网站上找到了this方法(在下面发布),它使用Hashtable做得很好。我不得不为弃用的方法制作一个小mod。但似乎工作非常稳健,“开箱即用”,所以你应该能够切割n-paste。我知道这是“老技术”,但我认为对于那些可能和我一样坚持解决(似乎是)直接问题的人来说,这是值得的。
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;
}