前序 :
首先,知道什么是json,知道json 的格式是什么样子的,其次,理解json 处理的需求是来自于Flex和Java 的Servlet通信不能通过对象的方式传递,因此需要json。最后,注意flex json 和Java的json处理需要引入不同的包 :
flex 中需要:as3corelib.swc
包的添加的位置,flex目录下还是ecplilse 项目路径下(但是这个不确定一定要放在此处)
Java 中需要:json-lib-2.2.2-jdk15.jar 和 jsoup-1.6.3.jar
我自己的放置位置 D:\software\zn,目的是为了我方便找,跟你没关系
案例:
Flex主要的代码:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" creationComplete="init()" >
<mx:Script>
<![CDATA[
import com.adobe.serialization.json.JSON;
private function init():void{
var userid:int = 2;
requestSend(userid);
}
private function requestSend(userid:int):void{
http_service.addEventListener(ResultEvent.RESULT,http_service_resultHandler);
http_service.addEventListener(FaultEvent.FAULT,http_service_faultHandler);
http_service.url="http://localhost:8080/FlexProjectInformation/servlet/GetInformation?userid="+userid;
http_service.send(null);
}
protected function http_service_resultHandler(event:ResultEvent):void{
/** 处理为array resultFormat="object" ***********************************/
var objectStr:String=event.result as String;
var JsonObj:Object =com.adobe.serialization.json.JSON.decode(objectStr);//目的是组装json
var arr:Array =JsonObj as Array;
for(var i=0 ;i<arr.length;i++){
//处理json 中放置的东西
}
/** 处理为array resultFormat="object" ***********************************/
/** 处理为arraycollection resultFormat="object" ***********************************/
var objectStr:String=event.result as String;
var arr:Array = (JSON.decode(objectStr) as Array);
arrAC =new ArrayCollection(arr);
for(var i:int=0;i<arrAC.length;i++){
var o:Object = arrAC.getItemAt(i);
Alert.show(o["projecttable"],o["projectname"],o["dnt"]);
}
/** 处理为arraycollection resultFormat="object" ***********************************/
/** arraycollection 显示***********************************/
<mx:DataGrid id="dg" dataProvider="{arrAC}">
<mx:columns>
<mx:DataGridColumn headerText="ID" dataField="projecttable"/>
<mx:DataGridColumn headerText="姓名" dataField="projectname"/>
<mx:DataGridColumn headerText="年龄" dataField="csq"/>
</mx:columns>
</mx:DataGrid>
/** arraycollection 显示***********************************/
}
protected function http_service_faultHandler(event:FaultEvent):void{
Alert.show("没有数据");
}
]]>
</mx:Script>
<mx:HTTPService id="http_service" url="" method="GET" resultFormat="object"></mx:HTTPService>
</mx:Application>
Java Servlet主要的代码:
String userid = new String(request.getParameter("userid").getBytes("iso-8859-1"),"utf-8");
response.setHeader("Content-type", "text/html;charset=utf8");
response.setCharacterEncoding("utf8");
PrintWriter out = response.getWriter();
//sonprojectArrayList 是一个ArrayList
try {
JSONArray jsonArray = JSONArray.fromObject(sonprojectArrayList);
/*int jsonArraysize =jsonArray.size();
for (int j = 0; j < jsonArraysize; j++) {
JSONObject json = JSONObject.fromObject(jsonArray.get(j));
//out.print("json: "+json+"\n");
out.print(json+",");//输出数据格式 {}
}*/
out.print(jsonArray);//输出数据格式[{},{},{},{},{},{}]
} catch (Exception e) {
System.out.println("json :"+e.getMessage());
}
out.flush();
out.close();
ps :这个流程中最重要的是
resultFormat="object" resultFormat 返回值的设置,默认是object,当然需要的话可以指定输入的格式array xml 等。换句话说Java这端的数据组织格式影响flex端数据处理的效率和方便性,最好的方式是能让俩端的数据处理"统一化",或者说是
/** 可以生成 Arraycollection ,arraycollection中放置的是array
var objectStr:String=event.result as String;
var arr:Array = (JSON.decode(objectStr) as Array);
var arrAC:ArrayCollection =new ArrayCollection(arr);
*/
java 和数据库进行连接检索相关信息时候,将数据库中需要的信息一次性拿出来到内存中进行处理map等,如果内存处理允许的话。