//前段時間比較忙,很久不寫日誌了。總結個基礎的問題,在Grails中寫java代碼果真會遭報應,出錯了常常沒提示...
問題重現:爲了便於處理分頁,在前端頁面添加了一個參數,定義以下: javascript
<input id="pagination" type="hidden" value="0" />
【1】Append數據後,自動更改分頁參數: html
$('#pagination').val($('#pagination').val() + 10);
經過Ajax傳參給後端,進行處理,參數定義以下: 前端
"pagination" : (typeof ($('#pagination')) == "undefined") ? 0:$('#pagination').val(),
【2】Controller中如此處理此參數: java
Intege pagination = request.getParameter("pagination");// input: 0
經驗證,上述代碼均有問題... apache
【1】這段的思路是頁面每次追加新數據後,自動增長分頁參數的值...但是javascript會把這個$('#pagination').val()當成字符串去加...因而第二頁可能出現這樣的結果: 後端
010
...好吧,前端陷阱就是很多...以下解決方案: api
$('#pagination').val(parseInt($('#pagination').val()) + 10); $('#pagination').val(Number($('#pagination').val()) + 10);
【2】由於servlet裏處理頁碼的方法的參數是整形,因此這裏直接用Integer接收了。 tomcat
print("pagination:" + pagination);// pagination:48
直接輸出ASCII值 ...不是我想要的...用一個"-48"? 超出0-9後就會報錯的... oracle
找緣由... 測試
http://download.oracle.com/otn-pub/jcp/servlet-3_1-fr-spec/servlet-3_1-final.pdf
http://tomcat.apache.org/tomcat-7.0-doc/servletapi/
參見Servlet規範及Tomcat的實現,原來這個request.getParameter()方法返回的是String!
至於爲嘛返回48?試試...
System.out.println((int) '1');//49 System.out.println((int) '11');//Invalid character constant System.out.println((Integer) "1");//Cannot cast from String to Integer System.out.println((Integer) "11");//Cannot cast from String to Integer
按理說這個"1"應該報錯啊,不該該顯示49...參考Tomcat 實現理應是個String的"1"吧,應該編譯就有問題啊?沒看到哪裏轉換爲'1'...此處有個疑問...
public String getParameter(String name ) { handleQueryParameters(); ArrayList<String> values = paramHashValues.get(name); if (values != null) { if(values.size() == 0) { return ""; } return values.get(0); } else { return null; } }
____________分割線_ 20131121補充_____________________
今天想起那是個Groovy的Controller,測試下,終於明白爲嘛1變變成49了,跟容器無關。
groovy> class HelloWorld groovy> { groovy> static void main(String[] args) { groovy> int a = 'a'; groovy> int b ='1'; groovy> int c = "1"; groovy> println a; groovy> println b; groovy> println c; groovy> } groovy> } 97 49 49