jquery可以对form进行数据的收集,然后序列化,它的ajax的data也被默认使用了序列化。
它使用的序列化是 url-encode的格式,看起来是 a=1&b=2
它提供三个函数:
param: 序列化函数,URI-encode
序列化form有两个:
serialize: param( serializeArray() )
serializeArray:负责收集form的数据,即处理 form.elements
,然后返回的是一个数组,[{name:a,value:a},{name:b,value:2}]
,如果checkbox是多个那么返回的也是多个。不收集file文件。可以用jquery.form来收集(他有$.fn.formToArray),然后把它创建FormData对象。post上传。
如何解析,servlet里的HttpUtils
public static Hashtable<String,String[]> parseQueryString(String s) {
String valArray[] = null;
if (s == null) {
throw new IllegalArgumentException();
}
Hashtable<String,String[]> ht = new Hashtable<>();
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(s, "&");
while (st.hasMoreTokens()) {
String pair = st.nextToken();
int pos = pair.indexOf('=');
if (pos == -1) {
// XXX
// should give more detail about the illegal argument
throw new IllegalArgumentException();
}
String key = parseName(pair.substring(0, pos), sb);
String val = parseName(pair.substring(pos+1, pair.length()), sb);
if (ht.containsKey(key)) {
String oldVals[] = ht.get(key);
valArray = Arrays.copyOf(oldVals, oldVals.length + 1);
valArray[oldVals.length] = val;
} else {
valArray = new String[1];
valArray[0] = val;
}
ht.put(key, valArray);
}
return ht;
}
private static String parseName(String s, StringBuilder sb) {
sb.setLength(0);
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '+':
sb.append(' ');
break;
case '%':
try {
sb.append((char) Integer.parseInt(s.substring(i+1, i+3),
16));
i += 2;
} catch (NumberFormatException e) {
// XXX
// need to be more specific about illegal arg
throw new IllegalArgumentException();
} catch (StringIndexOutOfBoundsException e) {
String rest = s.substring(i);
sb.append(rest);
if (rest.length()==2)
i++;
}
break;
default:
sb.append(c);
break;
}
}
return sb.toString();
}