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();
}