//前段时间比较忙,好久不写日志了。总结个基础的问题,在Grails中写java代码果然会遭报应,出错了经常没提示...
问题重现:为了便于处理分页,在前端页面添加了一个参数,定义如下:
<input id="pagination" type="hidden" value="0" />
【1】Append数据后,自动更改分页参数:
$('#pagination').val($('#pagination').val() + 10);
通过Ajax传参给后端,进行处理,参数定义如下:
"pagination" : (typeof ($('#pagination')) == "undefined") ? 0:$('#pagination').val(),
【2】Controller中如此处理此参数:
Intege pagination = request.getParameter("pagination");// input: 0
经验证,上述代码均有问题...
【1】这段的思路是页面每次追加新数据后,自动增加分页参数的值...可是javascript会把这个$('#pagination').val()当成字符串去加...于是第二页可能出现这样的结果:
010
...好吧,前端陷阱就是不少...如下解决方案:
$('#pagination').val(parseInt($('#pagination').val()) + 10); $('#pagination').val(Number($('#pagination').val()) + 10);
【2】因为servlet里处理页码的方法的参数是整形,所以这里直接用Integer接收了。
print("pagination:" + pagination);// pagination:48
直接输出ASCII值 ...不是我想要的...用一个"-48"? 超出0-9后就会报错的...
找原因...
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