下面逐一解答上面文章提出的問題。我們使用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
源碼連結