最近做一個項目遇到一個比較棘手的問題,項目后台采用struts2+Hibernate3+Spring3,前台采用ExtJs4。筆者目前仍是一名大二學生嗎,后台框架完全是毫無任何基礎,從零學,現學現用。
由此貼出在前后台用JSON字符串進行前后台交互中所出現的問題。前台ExtJs不用多說直接在proxy代理里面寫上Action的url即可。最為關鍵的則是在struts.xml配置文件中。由於再開完全不明白完全不懂,所以在struts.xml的配置中沒有單獨將json-default和struts-default寫入兩個package中,而是直接寫在了同一個package中,和同伴百度無數仍然沒有人給出詳細的辦法,最終才發現了應該這樣寫:原因就是命令空間不能相同,因為是不同的estends,否則寫入同一個package中則會出現連登陸界面都會出現Not Found 404。(在此class給出的是一個別名,由此采用spring,具體則在applicationContext.xml配置)
<package name="hr" namespace="/" extends="struts-default"> <action name="login" class="loginAction"> <result name="success">index.jsp</result> </action> </package> <package name="json" namespace="/json" extends="json-default"> <action name="titleAction" class="titleAction" method="allTitleJson"> <result type="json"> <param name="root">title</param> </result> </action> </package>
進行到此算是解決了一半的問題,不會連整個界面都進不去。而新的問題又出現了。
到底是將整個對象都進行傳遞呢?還是先將對象在后台轉換成字符串后再進行傳遞呢?百度一下:我所看到的是所有都是將序列化好了的JSON字符串進行傳遞,都是JSONObject,可試了無數次都無法正確進行返回,返回常常是500狀態碼。
直接切入解決辦法,同伴看到一個傳遞方法用map,想到既然可以用map即可以直接傳遞一個對象。故試着直接傳遞對象(即struts.xml配置文件中的title),OK成功。簡單粗暴。是否能將List直接傳呢?類比ExtJs,應該是可以的。OK果然成果。簡單粗暴。
所以最為簡單粗暴的辦法就是:在將從數據庫中得到數據放到對象過后,直接將對象傳遞,因為在json-default中會進行轉換,后來發現先轉成JSON字符再傳遞也是可以的(會貼出源代碼淺析,主要參考:http://yshjava.iteye.com/blog/1333602),原文作者采用struts2-json-plugin-2.1.8.1.jar。根據原文作者所做的分析,我在struts2-json-plugin-2.2.1稍加了一些修改(閱讀順序:JSONResult.java->JSONUtil.java->JSONWriter.java)。下載:http://pan.baidu.com/s/1hqzIPd6