下面逐一解答上面文章提出的问题。我们使用struts2官网给的demo工程struts2-blank 。struts-2.3.16.1-all.zip解压后,进入struts-2.3.16.1-all\struts-2.3.16.1\apps\文件夹,将struts2-blank.war解压。eclipse里新建一个Dynamic
Web Project工程,工程名叫struts2-blank。然后将相应的文件拷贝到新建的工程的相应路径下。源码见文章最后。
先来看看jquery的serialize和serializeArray两个方法。

I.可以看到radio和checkbox的值都是“on",checkbox是on还可以区分开来,但是radio怎么办?
如果我们把form改成这样会序列化成什么样子?
II.可以看到disabled的input框和没有选中的checkbox不会被序列化。这里还有一个问题,checkbox的value不是0和1。这个要么在提交表单前将所有选中的checkbox值设置为1,要么在后台进行处理,将experienceFlag的值为"on"变为1。为null就置为0。
Notation。
III.将表单序列化成一个js对象还有一个问题,假如form里有多个text框的name是一样的怎么办?这里介绍一个网友的给出的方法,我仔细的看过,写的非常好。
<a target="_blank" href="http://www.tashan10.com/jquery-jiang-biao-dan-xu-lie-hua-wei-jsondui-xiang/">表单序列化为Json对象</a>
这里做成了插件的形式,非常好用。
以上就是form表单序列化经常遇到的问题,就说到这儿。解决了第一个问题,就算是入门了。
据我所知有两种方式:
I.用struts2自带的json拦截器,自动将json填充到List<Bean>里。
文章里已经说的很详细了,这里不再赘述。注意这种方式除了 II里提到的jar包,还需要 struts2-json-plugin-2.3.16.1.jar 这个Jar包。
II.将json转成json字符串,在后台用jar包里的方法手动解析。
需要用到下面几个Jar包。
json-lib-2.3-jdk15.jar
commons-lang-2.4.jar
commons-beanutils-1.8.0.jar
commons-collections-3.1.jar
commons-logging-1.1.3.jar
ezmorph-1.0.6.jar
假设jsonStr是前台传过来的字符串。我们可以手动解析,手动解析比较灵活。解析完了还可以做些处理,比如用element()方法给json添加元素,或者remove()方法删除某个元素等。 输出结果: 3
jquery用ajax请求后台。
后台定义一个map,注意map不能为Null,要有setter和getter。
注意json的key必须是双引号。
有些时候我们从一个action跳转到一个页面的时候希望将json数据保存下来供插件使用。我们首先想到的就是用隐藏的input框保存。
但是input框不能存储json字符串,因为json字符串里有冒号!
不能。这个问题搞不清基本上可以肯定你不合格。JavaScript王者归来那本书里已经提到,js是运行在客户端的,EL表达式是运行在服务端的。怎么可能取到!
那为什么我确实取到了呢?我这样写不就取到了吗?<script>var aa = "${aa}"</scirpt>。这是一个投机的办法。有一个弊端就是你的js代码不能放在一个单独的js文件里,切记!这样写之所以可以取到,是因为 服务端的jsp编译成servlet之后,通过out.print()将所有html标签以字符串的形式发给浏览器,浏览器会把<script>标签里所有的东西都当作js代码来解析。<script>var
aa = "${aa}"</scirpt>在servlet里就是
out.print("<script>var aa = {name:ccc,age:23}</scirpt>");
所以这个时候我们应该怎么做? 用ajax。 我们在使用各种插件的时候基本上都是这种方式。先到达页面,等页面加载完了之后再发一个ajax请求然后拿到数据。虽然有两次请求感觉上很慢,但是真正运行的时候基本上是感觉不到的。所以别犹豫,就用ajax吧。
Java对象-----> map
Java对象-----> json对象
json对象------> map
json对象------> Java对象
map ------> Java对象
map ------> json对象
先举几个小例子
如果通过struts2将一个map转成json返回给前台,(<resut type="json"></result>)
那么你的map里的value不能为null,否则会报错。
如果你在struts.xml里配置了全局的异常处理,像这样
因为这里有一个重定向的处理。所以struts2在转json的时候出现异常就会返回一个302的错误。 debug调试代码的时候没有任何问题,return SUCCESS;后就会报错,切记。
一般struts2报重定向错误就是因为你的代码里某个地方有重定向行为,比如上面说的全局异常处理,或者是自定义的拦截器里的重定向行为。
再说一遍,struts2将一个map转成json返回给前台,那么你的map里的value不能为null,否则会报错。
json对象由许多个element构成。element就是一个key-value的键值对。 就键值对来说它是无序的。
对于一个json对象,我们几乎完全可以把它当作一个map来用。说它是无序的,原则上是没错的。但是有人可能会因此而忽悠你说因为json是无序的,所以我从db里查出东西后不能排序,这个你得自己重新排个序。
想想如果value是一个List<Object>。因为list里的元素是有序的。所以json里的数据可以是“已排好序的”。不要被忽悠了。
// todo
源码链接