Flex4之DataGrid增删改同步数据库及页面数据示例总结


有关Flex的DataGrid文章的确不少,都是零零碎碎的,目前还没有发现有个完整的例子供网友参考,这次我花了两天时间做了下Flex关于DataGrid一个指标数据管理系统,当然设计到的mxml会很多,大都是与DataGrid相关,我就抽取最常用的DataGrid的增删改同步数据库及页面数据来讲解

首先整理下思路,首先无论是删除还是修改,必须得获取当前行所在的记录,那么可以设置个全局变量,当DataGrid的itemClick事件出发时将选中的行赋给全局变量

[Bindable]public var acItemsSelected:Object;;

//事件方法

protected function myGrid_itemClickHandler(event:ListEvent):void
   {
    acItemsSelected = myGrid.selectedItem;
   }

这样的话就可以获得了当前选中的对象了

如果删除和修改的话,通常传到后台的肯定含有对象的ID项,那么这个ID是怎么获取的呢,通过acItemsSelected.xxxId能获取,那么这个xxxId必须是在DataGrid中有,设置为不显示就好了,例如我就是这么做的

<mx:DataGridColumn visible="false" dataField="targetCalId" />

这样的话,要更改的数据等都能通过ID传到后台查询相应对象更改删除了,接下来的事是比较重要的,如果光删除数据库是不行的,页面数据也要保持同步,关于dataGrid也没有好的刷新方法,所以你上网一搜,可能有的人会告诉你对于删除这样做:dataArray.removeItemAt(myGrid.selectedIndex);

增加这样做:dataArray.addItemAt(obj,0);

修改这样做:dataArray.setItemAt(obj,myGrid.selectedIndex);

这里说的dataArray是指的是DataGrid的DataProvider的值集合【当然肯定得声明称全局变量】

这样的写法呢可能你觉得,哎,是对的,其实不然,这并没有真正起到作用,对于FLEX来说缓存是相当大的,不行的话你通过这个修改行记录的属性后,再点这行记录的属性编辑页面发现值根本没改,所以所没有进行二次查询数据库了,利用的是缓存。即便是你调用了初始化查询数据库的那个方法,也是不行的,还是有缓存,最好的做法就是,抛弃上面的三种写法,只需要两步就可以实现刷新,第一初始化DataGrid的那个方法请求必须是URLRequest 的,添加一个参数类似于

var u:URLVariables=new URLVariables("temp="+Math.random());

当然不一定非要是temp什么名字都行,然后在返回操作成功提示后调用这个初始化方法,你会发现真的起作用了。

其实建议关于URLRequest传参数的最好带上这个参数,也不费事,可以在很多场合下解决缓存不更新问题

说了这么多其实就是先做好个思想准备,理清思路,下面我就贴上我的一段代码

mxml文件

<?xml version="1.0" encoding="utf-8"?>
<s:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009"
   xmlns:s="library://ns.adobe.com/flex/spark"
   xmlns:mx="library://ns.adobe.com/flex/mx" width="668" height="326"
   creationComplete="initComponent()"
   title="指标计量单位"
   fontSize="15"
   close="closeWindow()"> 

<s:layout>
<s:VerticalLayout />
</s:layout>
<fx:Declarations>
<mx:StringValidator id="sval_1" source="{targetTypeName}" property="text"
tooShortError="字符串太短了,请输入最少4个字符. "
tooLongError="字符串太长了,请输入最长20个字符. "
minLength="4" maxLength="20"
trigger="{myButton}" triggerEvent="click"
/>
<mx:StringValidator id="sval_2" source="{targetCal}" property="text"
tooShortError="字符串太短了,请输入最少4个字符. "
tooLongError="字符串太长了,请输入最长20个字符. "
minLength="4" maxLength="20"
trigger="{myButton}" triggerEvent="click"
/>
</fx:Declarations>

<fx:Script>
<![CDATA[
import com.adobe.serialization.json.JSON;

import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.events.CloseEvent;
import mx.events.ListEvent;
import mx.managers.PopUpManager;
import mx.rpc.events.ResultEvent;
import mx.utils.URLUtil;
import mx.validators.Validator;

import org.osmf.utils.URL; 
[Bindable]public static var mainApp:DataCenterTargetPreserve = null;    
[Bindable]public var gsMyString:String;       
[Bindable]public var gnMyNumber:Number;       
[Bindable]public var acItemsSelected:Object;
[Bindable]
public var dataArray:ArrayCollection;

private function initComponent():void 

var u:URLVariables=new URLVariables("temp="+Math.random());
var r:URLRequest=new URLRequest();
r.data=u;
r.method=URLRequestMethod.POST;
r.url=mainApp.urls+"/findTargetCal.do";

var l:URLLoader=new URLLoader();
l.load(r);
l.addEventListener(Event.COMPLETE, comp2);


function comp2(e:Event):void
{
var l:URLLoader=URLLoader(e.target);
var array:Array=JSON.decode(String(l.data)) as Array;
dataArray=new ArrayCollection(array);
myGrid.dataProvider=dataArray;
}
private function closeWindow():void 

PopUpManager.removePopUp(this); 
}//closeWindow 
private function showFinalSelection(oEvent:Event):void 

//mainApp.tiFinalSelection.text = oEvent.target.selectedItem.album; 
}//showFinalSelection 

protected function button1_clickHandler(event:MouseEvent):void
{
PopUpManager.removePopUp(this); 

}

protected function button2_clickHandler(event:MouseEvent):void
{

var all:Array=Validator.validateAll([sval_1,sval_2]);
if(all.length==0){
var v:URLVariables=new URLVariables("targetTypeName="+targetTypeName.text+"&targetCal="+targetCal.text+"&temp="+Math.random());
var r:URLRequest=new URLRequest();
r.url=mainApp.urls+"/addTargetCal.do";
r.method=URLRequestMethod.POST;
r.data=v;
var l:URLLoader=new URLLoader();
l.load(r);
l.addEventListener(Event.COMPLETE,comp);
}else{
  Alert.show("新增失败");
}

}
private function comp(e:Event):void{
var l:URLLoader = URLLoader(e.target); 
var o:Object=URLUtil.stringToObject(l.data,";",true);
    if(o.result=="add"){
  Alert.show("新增成功");
  var obj:Object=(JSON.decode(o.datas) as Object);
  //dataArray.addItemAt(obj,0);
  Alert.show(obj.targetCalId);
}
initComponent();

}

private function myClick(evt:CloseEvent):void{
//Alert.show("本次要删除的为"+mainDataGrid.selectedIndex);
if(evt.detail==Alert.YES){
//Alert.show(acItemsSelected.getItemAt(0).targetId);
var v:URLVariables = new URLVariables("id="+acItemsSelected.targetCalId+"&temp="+Math.random());
var r:URLRequest = new URLRequest(); 
r.url =mainApp.urls+"/deleteTargetCal.do" ; 
r.method = URLRequestMethod.POST; 
r.data=v;
var l:URLLoader = new URLLoader(); 
l.load(r); 

//dataArray.removeItemAt(myGrid.selectedIndex);
l.addEventListener(Event.COMPLETE,comp1); //注册请求完成后 响应获取数据事件方法

}
}
private function comp1(e:Event):void 

var l:URLLoader = URLLoader(e.target);
var o:Object = URLUtil.stringToObject(l.data, ";", true);
if(o.result=="delete"){
Alert.show("删除成功!","友情提示");
}
initComponent();

}
protected function button3_clickHandler(event:MouseEvent):void
{
if(myGrid.selectedItem==null){
Alert.show("请选择一项进行删除","友情提示");
}else{
var dlg_obj:Object=Alert.show("确认删除吗?", "友情提示!", Alert.YES|Alert.NO,null,myClick);
}
}


protected function button4_clickHandler(event:MouseEvent):void
{

if(myGrid.selectedItem==null){
Alert.show("请选择一项进行修订!","友情提示");
}else{
var v:URLVariables = new URLVariables("targetTypeName="+targetTypeName.text+"&targetCal="+targetCal.text+"&id="+acItemsSelected.targetCalId);
var r:URLRequest = new URLRequest(); 
r.url =mainApp.urls+"/updateTargetCal.do"; 
r.method = URLRequestMethod.POST; 
r.data = v; 
var l:URLLoader = new URLLoader(); 
l.load(r); 
l.addEventListener(Event.COMPLETE,comp3); //注册请求完成后 响应获取数据事件方法
}
}
private function comp3(e:Event):void 

var l:URLLoader = URLLoader(e.target); 
var o:Object = URLUtil.stringToObject(l.data, ";", true);
if(o.result=="update"){
Alert.show("更新成功!","友情提示");
var obj:Object=(JSON.decode(o.datas) as Object);
//dataArray.setItemAt(obj,myGrid.selectedIndex);
}else{
Alert.show("操作失败!","友情提示");
}
initComponent();

protected function myGrid_itemClickHandler(event:ListEvent):void
{
acItemsSelected =myGrid.selectedItem;
}

]]>
</fx:Script>
<mx:Form width="651" height="282">
<mx:DataGrid width="616" height="160" id="myGrid" itemClick="myGrid_itemClickHandler(event)">
<mx:columns>
<mx:DataGridColumn headerText="计量名称" dataField="targetTypeName"/>
<mx:DataGridColumn headerText="计量符号" dataField="targetCal"/>
<mx:DataGridColumn visible="false" dataField="targetCalId" />
</mx:columns>
</mx:DataGrid>
<mx:HBox>
<s:Label  width="33"/>
<mx:FormItem label="计量名称" >
<s:TextInput id="targetTypeName"/>
</mx:FormItem>
<mx:FormItem label="计量符号" >
<s:TextInput id="targetCal"/>
</mx:FormItem>
<mx:FormItem >
<s:Button label="新增" id="myButton" click="button2_clickHandler(event)" />
</mx:FormItem>

</mx:HBox>
<mx:FormItem >
</mx:FormItem>

<mx:HBox>
<s:Label  width="250"/>
<mx:FormItem >
<s:Button label="删除" click="button3_clickHandler(event)"/>
</mx:FormItem>
<mx:FormItem >
<s:Button label="修改" click="button4_clickHandler(event)"/>
</mx:FormItem>
<mx:FormItem >
<s:Button label="刷新"/>
</mx:FormItem>
<mx:FormItem >
<s:Button label="关闭" click="button1_clickHandler(event)"/>
</mx:FormItem>
</mx:HBox>

</mx:Form>
</s:TitleWindow>

关于上面这个程序的mainApp就不用管它,它只是主应用程序而已,细心的可以发现这个是个弹出窗口程序

关于这个程序的三个Servletet处理类【只贴上关键代码】

FindTargetCalServlet

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
TTargetCalDAO dao=new TTargetCalDAO();
List<TTargetCal> cals=dao.findAll();
JSONArray json = JSONArray.fromObject(cals);
String datas = json.toString();
System.out.println(datas);
System.out.println(datas);
response.setCharacterEncoding("UTF-8");
response.getWriter().write(datas);

}

DeleteTargetCalServlet

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
TTargetCalDAO dao = new TTargetCalDAO();
String id = request.getParameter("id");
if (DataOptUtils.isNotNull(id)) {
TTargetCal rr = dao.findById(Integer.valueOf(id));
dao.delete(rr);
}
response.setCharacterEncoding("UTF-8");
response.getWriter().write("result=delete");

}

AddTargetCalServlet

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    TTargetCalDAO dao=new TTargetCalDAO();
    String targetCal=request.getParameter("targetCal");
    String targetTypeName=request.getParameter("targetTypeName");
    TTargetCal cal=new TTargetCal();
    cal.setTargetCal(targetCal);
    cal.setTargetTypeName(targetTypeName);
    dao.save(cal);
TTargetCal re =dao.findById(dao.findLastId());
JSONObject json = JSONObject.fromObject(re);
String datas = json.toString();
response.getWriter().write("result=add;datas=" + datas);


}

UpdateTargetCalServlet

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
TTargetCalDAO dao = new TTargetCalDAO();
String targetTypeName = request.getParameter("targetTypeName");
String targetCal = request.getParameter("targetCal");
String id = request.getParameter("id");
if (DataOptUtils.isNotNull(id)) {
TTargetCal rr = dao.findById(Integer.valueOf(id));
if(DataOptUtils.isNotNull(targetCal)){
rr.setTargetCal(targetCal);
}
if(DataOptUtils.isNotNull(targetTypeName)){
rr.setTargetTypeName(targetTypeName);
}
dao.merge(rr);
TTargetCal tc = dao.findById(rr.getTargetCalId());
JSONObject json = JSONObject.fromObject(tc);
String datas = json.toString();
response.getWriter().write("result=update;datas=" + datas);
}


}

这里的DataOptUtils是我写的一个数据处理类,判断是否为空什么的

还有就是TTargetCal

@Entity
@Table(name = "t_target_cal", catalog = "sxtele")
public class TTargetCal implements java.io.Serializable {

// Fields

private Integer targetCalId;
private String targetCal;
private String targetTypeName;

// Constructors

/** default constructor */
public TTargetCal() {
}

/** minimal constructor */
public TTargetCal(String targetCal) {
this.targetCal = targetCal;
}

/** full constructor */
public TTargetCal(String targetCal, String targetTypeName) {
this.targetCal = targetCal;
this.targetTypeName = targetTypeName;
}

// Property accessors
@Id
@GeneratedValue
@Column(name = "Target_cal_id", unique = true, nullable = false)
public Integer getTargetCalId() {
return this.targetCalId;
}

public void setTargetCalId(Integer targetCalId) {
this.targetCalId = targetCalId;
}

@Column(name = "Target_cal", nullable = false, length = 50)
public String getTargetCal() {
return this.targetCal;
}

public void setTargetCal(String targetCal) {
this.targetCal = targetCal;
}

@Column(name = "Target_type_name", length = 50)
public String getTargetTypeName() {
return this.targetTypeName;
}

public void setTargetTypeName(String targetTypeName) {
this.targetTypeName = targetTypeName;
}

}


已有 0 人发表留言,猛击->> 这里<<-参与讨论


JavaEye推荐

    * 上海:高薪诚聘Python开发人员
    * 北京:手机之家网站诚聘PHP程序员


阅读全文...
本站相关内容:
Flex4之Tree开发【三】——与JAVA后台交互的树,实现增删改查

今天的第三篇文章,把我两天学习的Flex4树的最重要的与实际开发相关的示例总结一下,实现与JAVA后台交互操作也就是增删改功能

第一:首先是MXML主要代码

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" width="100%" height="100%"
creationComplete="init()">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;
import mx.utils.URLUtil;
protected function init():void{
listResult.convertDataToXml();
}
var xmlList:XML;
protected function listResult_resultHandler(event:ResultEvent):void
{
xmlList=XML(event.result.toString());
mytree.dataProvider=xmlList;

}

protected function tree1_clickHandler(event:MouseEvent):void
{
if(mytree.selectedItem.hasOwnProperty("@value" ))
{

var u:URLRequest=new URLRequest(mytree.selectedItem.@value);
//navigateToURL(new URLRequest(mytree.selectedItem.@value));
navigateToURL(u);
} else
{
//没有那就展开,如果展开了就收缩
mytree.expandItem(mytree.selectedItem,!mytree.isItemOpen(mytree.selectedItem),true);
}
}
var child:XML;
//添加兄弟节点
protected function addBefore():void
{
var xml:XML=mytree.selectedItem as XML;
var text:String=nextName.text;
if(xml!=null && text.length>0) {
var parent:XML=xml.parent();
if(parent!=null) {
child=new XML("<node foddersortName=\"\" foddersortId=\"\"  parentid=\"\" />");
child.@foddersortName=text;
parent.insertChildBefore(xml,child);
var v:URLVariables = new URLVariables("method=add&editName="+text+"&parentId="+parent.@foddersortId); 
/*
也可以是这种方式
var vars: URLVariables = new URLVariables ();
vars["varName"] = varValue; //把参数键,值对放到vars对象中.
vars["var2Name"] = var2Value;
*/
var r:URLRequest = new URLRequest(); 
r.url = "http://localhost:8080/FlexBlazeDS/treeOperate.do"; 
r.method = URLRequestMethod.POST; 
r.data = v; 

var l:URLLoader = new URLLoader(); 
l.load(r); 

l.addEventListener(Event.COMPLETE,txtCompleteHandler);
} else {
Alert.show("不能选中根节点");
}
} else {
Alert.show("需要先选中节点和填入文字");
}
}

private function txtCompleteHandler(e:Event):void 

var l:URLLoader = URLLoader(e.target); 
var o:Object = URLUtil.stringToObject(l.data,";",true);
var result:String=o.result;
var operateId:String=o.operateId;
if(operateId!=null){
//Alert.show(o.operateId);
//每次添加完毕节点后,就需要将刚插入数据库中的最大的ID查询出来赋给刚刚新增的XML节点的属性中
child.@foddersortId=operateId;
}

if(result=="update"){
Alert.show("更新成功!");
}else if(result=="delete"){
Alert.show("删除成功!");
}else if(result=="add"){
Alert.show("新增成功!");
}else{
Alert.show("操作失败!");
}


protected function addAfter():void
{
var xml:XML=mytree.selectedItem as XML;
var text:String=nextName.text;
if(xml!=null && text.length>0) {
var parent:XML=xml.parent();
if(parent!=null) {
child=new XML("<node foddersortName=\"\" foddersortId=\"\"  parentid=\"\" />");
child.@foddersortName=text;
parent.insertChildAfter(xml,child);

var v:URLVariables = new URLVariables("method=add&editName="+text+"&parentId="+parent.@foddersortId); 
/*
也可以是这种方式
var vars: URLVariables = new URLVariables ();
vars["varName"] = varValue; //把参数键,值对放到vars对象中.
vars["var2Name"] = var2Value;
*/
var r:URLRequest = new URLRequest(); 
r.url = "http://localhost:8080/FlexBlazeDS/treeOperate.do"; 
r.method = URLRequestMethod.POST; 
r.data = v; 

var l:URLLoader = new URLLoader(); 
l.load(r); 

l.addEventListener(Event.COMPLETE,txtCompleteHandler);
} else {
Alert.show("不能选中根节点");
}
} else {
Alert.show("需要先选中节点和填入文字");
}
}

protected function addSon():void
{
var xml:XML=mytree.selectedItem as XML;
var text:String=nextName.text;
if(xml!=null && text.length>0) {
var parent:XML=xml.parent();
child=new XML("<node foddersortName=\"\" foddersortId=\"\"  parentid=\"\" />");
child.@foddersortName=text;
xml.appendChild(child);
mytree.expandChildrenOf(xml,true);

var v:URLVariables = new URLVariables("method=add&editName="+text+"&parentId="+xml.@foddersortId); 
/*
也可以是这种方式
var vars: URLVariables = new URLVariables ();
vars["varName"] = varValue; //把参数键,值对放到vars对象中.
vars["var2Name"] = var2Value;
*/
var r:URLRequest = new URLRequest(); 
r.url = "http://localhost:8080/FlexBlazeDS/treeOperate.do"; 
r.method = URLRequestMethod.POST; 
r.data = v; 

var l:URLLoader = new URLLoader(); 
l.load(r); 

l.addEventListener(Event.COMPLETE,txtCompleteHandler);
} else {
Alert.show("需要先选中节点和填入文字");
}
}
protected function editNode():void
{
var xml:XML=mytree.selectedItem as XML;
var text:String=nextName.text;
if(xml!=null && text.length>0) {
xml.@foddersortName=text;
} else {
Alert.show("需要先选中节点和填入文字");
}

var v:URLVariables = new URLVariables("method=update&editName="+text+"&parentId="+xml.@foddersortId); 
/*
也可以是这种方式
var vars: URLVariables = new URLVariables ();
vars["varName"] = varValue; //把参数键,值对放到vars对象中.
vars["var2Name"] = var2Value;
*/
var r:URLRequest = new URLRequest(); 
r.url = "http://localhost:8080/FlexBlazeDS/treeOperate.do"; 
r.method = URLRequestMethod.POST; 
r.data = v; 

var l:URLLoader = new URLLoader(); 
l.load(r); 

l.addEventListener(Event.COMPLETE,txtCompleteHandler);
}
protected function deleteNode():void
{
var xml:XML=mytree.selectedItem as XML;
if(xml!=null) {
var list:Array=mytree.selectedItems as Array;
for(var k:int=0;k<list.length;k++) {
xml=list[k] as XML;
var parent:XML=xml.parent();
if(parent!=null) {
var children:XMLList=parent.children();
for(var i:int=0;i<children.length();i++) {
if(children[i]==xml) {
delete children[i];
var v:URLVariables = new URLVariables("method=delete&parentId="+xml.@foddersortId); 
/*
也可以是这种方式
var vars: URLVariables = new URLVariables ();
vars["varName"] = varValue; //把参数键,值对放到vars对象中.
vars["var2Name"] = var2Value;
*/
var r:URLRequest = new URLRequest(); 
r.url = "http://localhost:8080/FlexBlazeDS/treeOperate.do"; 
r.method = URLRequestMethod.POST; 
r.data = v; 

var l:URLLoader = new URLLoader(); 
l.load(r); 

l.addEventListener(Event.COMPLETE,txtCompleteHandler);
break;
}
}
} else {
Alert.show("不能选中根节点");
}
}
} else {
Alert.show("需要先选中节点");
}
}
protected function selectNode():void
{
var text:String=nextName.text;
if(text.length>0) {
var items:Array=[];
var list:XMLList=new XMLList();
list[0]=mytree.dataProvider[0];
searchItems(list,text,items);
mytree.selectedItems=items;
} else {
Alert.show("输入查找的文字");
}
}
private function searchItems(list:XMLList,find:String,items:Array):void {
for(var i:int=0;i<list.length();i++) {
var one:XML=list[i];
var label:String=one.@foddersortName;
if(label!=null && label.indexOf(find)>=0) {
items.push(one);
}
searchItems(one.children(),find,items);
}
}

protected function closeAll():void{
mytree.openItems=[];

}

protected function openAll():void{
mytree.expandChildrenOf(mytree.selectedItem,true);
}


]]>
</fx:Script>
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
<s:RemoteObject destination="findName" id="listResult" result="listResult_resultHandler(event)"/>
</fx:Declarations>
<s:TextInput id="nextName" x="432" y="40"  />
<mx:Tree x="30" y="10" width="264" height="600" id="mytree"  showRoot="false" labelField="@foddersortName" ></mx:Tree>
<s:Button x="443" y="82" label="增加为哥" click="addBefore()"/>
<s:Button x="443" y="111" label="增加为弟" click="addAfter()"/>
<s:Button x="444" y="144" click="addSon()" label="增加为孩子"/>
<s:Button x="444" y="178" click="editNode()" label="修改节点"/>
<s:Button x="444" y="211" click="deleteNode()" label="删除节点"/>
<s:Button x="443" y="244" click="selectNode()" label="选择节点"/>
<s:Button x="443" y="277" click="closeAll()" label="全部收缩"/>
<s:Button x="443" y="306" click="openAll()" label="全部展开"/>
</s:Group>

这里写的是组件形式,在主程序中调用下文件名,如这个叫做FlexTree.mxml,其位于components目录下

那么在主程序中应该这样写

<components:FlexTree/>

就是这么一小行代码就可以执行主程序显示树了

第二:web-info/flex/remoteConfig.xml中关键配置

<destination id="findName" >
     <properties>
        <source>com.jadetrust.test.FindTreeNode</source>
     </properties>
     </destination>

第三:后台两个主要处理程序,一个是用来查询所有树节点拼装XML的程序FindTreeNode.java

//把数据库中的无限级联表中数据拼装成一个XML文档
public String convertDataToXml()
{
   UserService sf=new UserService();
       List<TCategory> cates=sf.findCategoriesAll();
       System.out.println(cates);
       List<TCategory> listTop=sf.findCategoriesTop();
       String treedata="<?xml version='1.0' encoding='utf-8'?>\n<node foddersortId='0' foddersortName='所有分类'>\n";
  for(TCategory cate:listTop){
treedata=treedata+"<node foddersortId='"+cate.getCateId() +"' foddersortName='"+cate.getName()+"'>\n";
treedata=CreateXmlNode(cates,cate.getCateId(),treedata);
treedata=treedata+"</node>\n";
}
treedata=treedata+"</node>\n";


System.out.println(treedata);
return treedata;
}
/**
* 递归解析list –> Xml
*/
public String CreateXmlNode(List<TCategory> list,int nodepid,String cratedata){
for (int a=0;a<list.size();a++)
{
TCategory cate=list.get(a);

if(cate.getTCategory()==null || cate.getTCategory().equals("")){
 
}else{
if (cate.getTCategory().getCateId()==nodepid){
if(cate.getTCategories()!=null){
cratedata=cratedata+"<node foddersortId='"+cate.getCateId() +"' foddersortName='"+cate.getName()+"' parentid='"+cate.getTCategory().getCateId()+"'>\n";
cratedata=CreateXmlNode(list,cate.getCateId(),cratedata);
cratedata=cratedata+"</node>\n";
}else{
cratedata=cratedata+"<node foddersortId='"+cate.getCateId()+"'foddersortName='"+cate.getName()+"' parentid='"+cate.getTCategory().getCateId()+"'/>\n";
}
}
}
}
return cratedata;
}


还有一个处理增删改的servleet程序

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("执行了树操作。。。。。。。。。。。。。。。");
request.setCharacterEncoding("utf-8");
         String childName=request.getParameter("editName");
         String parentId=request.getParameter("parentId");
         String method=request.getParameter("method");
        UserService sf=new UserService();
         response.setCharacterEncoding("utf-8");
         try{
         if(method.equals("delete")){
        System.out.println("此次删除的ID为"+parentId);
              if(parentId!=null){
              TCategory cate1=sf.findById(parentId);
              System.out.println(cate1);
              sf.delete(cate1);
              response.getWriter().write("result=delete");
              }
       
         }else if(method.equals("update")){
        System.out.println("此次更新的ID为"+parentId);
        if(childName!=null&&parentId!=null){
          TCategory cate1=sf.findById(parentId);
          cate1.setName(childName);
          System.out.println(cate1);
          sf.update(cate1);
          response.getWriter().write("result=update");
        }
         }else if(method.equals("add")){
          if(childName!=null&&parentId!=null){
          TCategory category=new TCategory();
                 category.setName(childName);
                 TCategory cate1=sf.findById(parentId);
                 category.setTCategory(cate1);
                 sf.add(category);
                 Integer lastId=sf.findLastId();
                 response.getWriter().write("result=add;operateId="+lastId);
              }
 
         }
         }catch(Exception e){
        System.out.println(e.toString());
          response.getWriter().write("result=error");
         }
}

第三,就是介绍相关的数据库表的结构了MYSQL

CREATE TABLE `t_category` (
  `name` varchar(255) DEFAULT NULL,
  `parent_id` int(11) DEFAULT NULL,
  `cate_id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`cate_id`),
  KEY `parent_id` (`parent_id`),
  CONSTRAINT `t_category_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `t_category` (`cate_id`)
) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8;

对应的Category实体类

package com.jadetrust.dao;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
* TCategory entity. @author MyEclipse Persistence Tools
*/
@Entity
@Table(name = "t_category", catalog = "test")
public class TCategory implements java.io.Serializable {

// Fields

@Override
public String toString() {
return "[ cateId=" + cateId + ", name=" + name + "]";
}

private Integer cateId;
private TCategory TCategory;
private String name;
private Set<TCategory> TCategories = new HashSet<TCategory>(0);

// Constructors

/** default constructor */
public TCategory() {
}

/** full constructor */
public TCategory(TCategory TCategory, String name,
Set<TCategory> TCategories) {
this.TCategory = TCategory;
this.name = name;
this.TCategories = TCategories;
}

// Property accessors
@Id
@GeneratedValue
@Column(name = "cate_id", unique = true, nullable = false)
public Integer getCateId() {
return this.cateId;
}

public void setCateId(Integer cateId) {
this.cateId = cateId;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
public TCategory getTCategory() {
return this.TCategory;
}

public void setTCategory(TCategory TCategory) {
this.TCategory = TCategory;
}

@Column(name = "name")
public String getName() {
return this.name;
}

public void setName(String name) {
this.name = name;
}

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "TCategory")
public Set<TCategory> getTCategories() {
return this.TCategories;
}

public void setTCategories(Set<TCategory> TCategories) {
this.TCategories = TCategories;
}


                                 
}

第四:具体数据库操作类UserService

package com.jadetrust.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.jadetrust.common.HibernateSessionFactory;
import com.jadetrust.dao.TCategory;

public class UserService {

public void add(TCategory cate){
Session session=HibernateSessionFactory.getSession();
Transaction tc=session.beginTransaction();
session.save(cate);
tc.commit();
session.close();

}
public void delete(TCategory cate){
Session session=HibernateSessionFactory.getSession();
Transaction tc=session.beginTransaction();
session.delete(cate);
tc.commit();
session.close();
}
public void update(TCategory cate){
Session session=HibernateSessionFactory.getSession();
Transaction tc=session.beginTransaction();
session.merge(cate);
tc.commit();
session.close();
}
public TCategory findById(String id){
String hql = "from TCategory where cateId=:id";
return (TCategory)HibernateSessionFactory.getSession().createQuery(hql).setString("id", id).uniqueResult();
}

public List<TCategory> findChildCategories(String id) {
if(id.equals("cate_root")||id==null||id.equals(" ")){
     return findCategoriesTop();
}else{
return HibernateSessionFactory.getSession().
createQuery("from TCategory cate where cate.TCategory.cateId=:id").setString("id", id).list();
}
}
public List<TCategory> findCategoriesTop() {
System.out.println("查询顶级父目录.................");
String hql = "select distinct cate,childs from TCategory cate left join fetch cate.TCategories childs where cate.TCategory.cateId is null";
return HibernateSessionFactory.getSession().createQuery(hql).list();
}
public List<TCategory> findCategoriesAll() {
System.out.println("查询顶级父目录.................");
String hql = "from TCategory";
return HibernateSessionFactory.getSession().createQuery(hql).list();
}
public List<Map<String,String>> findNameById(String id){
List<Map<String,String>> names=new ArrayList<Map<String,String>>();

UserService sf=new UserService();
Set<TCategory> cates=sf.findById(id).getTCategories();
for(TCategory cate:cates){
Map<String,String> maps=new HashMap<String,String>();
maps.put("CATALOGSID", cate.getCateId().toString());
maps.put("CATALOGNAME", cate.getName());
names.add(maps);
}
return names;

}

public Integer findLastId(){
String hql="select max(cateId) from TCategory";
return (Integer)HibernateSessionFactory.getSession().createQuery(hql).uniqueResult();
}
}

这个示例只用了Hibernate,至于这个HibernateSessionFactory,它是利用MyEclipse反转数据库自动生成的,如果不知道可以参考我之前关于数据库反转的文章

相关视图

这个是选择节点,输入插入内容,点击选择节点按钮


已有 0 人发表留言,猛击->> 这里<<-参与讨论


JavaEye推荐

    * 北京:手机之家网站诚聘PHP程序员
    * 上海:高薪诚聘Python开发人员


Flex4之DataGrid四个的示例【客户端和服务器端】

由于我的DataGrid与JAVA后台交互需要返回JSON格式的字符串,所以需要在客户端来解析JSON串,用到JSON相关类,所以Flex4还缺少一个文件corelib.swc
将corelib.swc拷贝到Flex安装目录的sdks\4.0.0\frameworks\libs下

这个文件导入后重启MyEclipse就可以使用JSON类了

1,客户端、服务端

  (1)客户端分页:将数据一次性取到客户端,客户要看哪一页的数据,显示哪一页的数据。

  (2)服务端分页:客户要看哪一页的数据,向服务端请求哪一页的数据,客户端将请求到的数据显示给用户(可以在客户端、服务端分别做缓存,加快数据的读取),由于flex本身不具有数据库访问能力,可以考虑通过 WebServices向服务器传递数据,数据的表示形式可以是XML、JSON(本文采用XML的形式)

2,分页表示层的设计

  (1)页码条中4个按钮;这四个按钮分别为转到第一页,前一页,后一页,最后一页;当这四个按钮中的任意一点被点击时,页码要重绘,当前页码变化;且还要考虑当页码中有第一页时,前两个按钮要隐藏起来;当页码中有最后一页时,后两个按钮要隐藏起来。

  (2)页码条中页码;当点击页码条中的页码时,DataGrid中更新显示数据即可,当前页码变化。
 (3)显示总页数,总记录数;

  (4)每页记录数,让用户通过下拉框选择;当用户选择新的每页显示记录数时,页码要重绘,总页数发生变化,当前页码变化。

  (5)页码输入框,让用户输入任意页码(要检查输入数据是否合法),DataGrid显示页码中的数据,页码要重绘,总页数变化。

  (6)查看所有;分页中的特殊情况,将每页记数置为记录总数即可达到要求!页码要重绘,总页数发生变化,当前页码变化

代码说明
(1)分页功能条,做一个自定义组件
(2)页码条绘制方法,传参数为页码中的第一个页码
3.分页触发的方法,组件中有一个属性为pagingFunction,为向服务端请求数据的函数;当该函数为空时,调用客户端分页;反之调用该方法进行服务端分页。

首先说明下:以下的四个例子中每一个都含有客户端获取DataGrid数据的代码

下面的每个mxml中都涉及用到的组件mxml,位于com/control目录下

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" backgroundColor="white">
<mx:Script>
<![CDATA[
                  import mx.collections.ArrayCollection;
                  import mx.events.ItemClickEvent;
                  import flash.events.KeyboardEvent;
                  import mx.controls.DataGrid;
                  import mx.validators.NumberValidator;

        [Bindable]
  [Embed(source='assets/first.jpg')]
  private var firstIcon:Class;  
  private var firstPage:uint;
 
        [Bindable]
  [Embed(source='assets/pre.jpg')]
  private var preIcon:Class;
  private var prePage:uint;

        [Bindable]
  [Embed(source='assets/next.jpg')]
  private var nextIcon:Class;
  private var nextPage:uint;

        [Bindable]
  [Embed(source='assets/last.jpg')]
  private var lastIcon:Class;
  private var lastPage:uint;
                          
                  //页码条数据,绑定
                  [Bindable]
                  private var nav:ArrayCollection = new ArrayCollection();
                 
                  //默认起始页码,第1页
                  private var currentPageIndex:uint = 0;
                 
                  //是否已初始化
                  private var isInit:Boolean=true;                 
   
    //总页数
  private var totalPages:uint = 0;
 
  //是否重绘页码条,当使用服务端分页时使用
  private var isCreateNavBar:Boolean = true;
    
  /************************************************************/
 
                  //显示到Grid的数据
                  [Bindable]
                  public var viewData:ArrayCollection=null;
                 
                  //所有的数据
                  public var orgData:ArrayCollection=null;
                 
                  //每页记录数下拉框
                  public var pageSizeDropDownListData:ArrayCollection=null;
                 
                  // 每页记录数
                  public var pageSize:uint = 5;
                
                  // 页码条上显示页码的个数
                  public var navSize:uint = 5;
                
                 //记录总数,调用服务端发页时使用
                  public var totalRecord:int=0;
                 
                  //分页函数
                  public var pagingFunction:Function=null;
                 
                  //分页条对应的Grid
                  public var dataGrid:DataGrid=null;
                 
                  /***************************************************************/
                 
                  public function dataBind(isServerSide:Boolean=false):void{
        //是否初始化
    if(isInit){
if(pageSizeDropDownListData==null){
pageSizeDropDownListData = new ArrayCollection();
pageSizeDropDownListData.addItem({label:5,data:5});
pageSizeDropDownListData.addItem({label:10,data:10});
pageSizeDropDownListData.addItem({label:20,data:20});
pageSizeDropDownListData.addItem({label:30,data:30});        
}
pageSizeComobox.dataProvider=pageSizeDropDownListData;
isInit=false;
    }
    //                        
    refreshDataProvider(currentPageIndex,isCreateNavBar,pageSize,isServerSide);
                  }
                 
                 
                 
                  /**
* 构建页码条
                  * pages:总页数
                  * pageIndex:当前页(注意,从0开始)
                  *
                   */
                  private function createNavBar(pageIndex:uint = 0):void{
                      nav.removeAll();
                      //向前图标操作,first,Pre
                      if( pageIndex > 1 ){
                            firstPage=0;
                            firstNavBtn.visible=true;
                            //
                            var intLFive:int = pageIndex-navSize; // calculate start of last 5;
                            //
                            prePage=intLFive;
                            preNavBtn.visible=true;
                      }
                      else{
                        firstNavBtn.visible=false;
                        preNavBtn.visible=false;
                      }
                      //页码条       
                      for( var x:uint = 0; x < navSize; x++){
                            var pg:uint = x + pageIndex;
                            nav.addItem({label: pg + 1,data: pg});
//
var pgg:uint = pg+1;
if(pgg>=totalPages){ //搜索到最后一个页码,停止添加到navbar
x=navSize;
}
                      }
  //计算最后一组页码条中第一个页码的页码编号
  var lastpage:Number = 0;
  for( var y:uint = navSize; y <= totalPages-1;y = y + navSize ){ //lets calculate the lastpage button
  if(y+5 > navSize){
  lastpage = y;
  }
  }  
  //向后图标
                      if( pg < totalPages - 1 ){
                            nextPage=pg + 1;
                            nextNavBtn.visible=true;
                            lastPage=lastpage;
                      lastNavBtn.visible=true;
                      }
                      else{                             
                      nextNavBtn.visible=false;
                      lastNavBtn.visible=false;
                      }
                  }
                 
                  /**
                  * 页码按钮按下(页码条点击)
                  */
                  private function navigatePage(event:ItemClickEvent):void
                  {
                        refreshDataProvider(event.item.data,false);  
                  }
                 
                  /**
                  * 页码按钮按下,first,pre,next,last
                  */
                  private function navigateButtonClick(pageString:String):void{
                  var pageIndex:uint=0;
                  switch(pageString){
                  case "firstPage":
                  pageIndex=firstPage;
                  break;
                  case "prePage":
                  pageIndex=prePage;
                  break;
                  case "nextPage":
                  pageIndex=nextPage;
                  break;
                  default: //lastPage
                  pageIndex=lastPage;
                  }
                  //
                  refreshDataProvider(pageIndex);
                  }
                 
                  /**
                  * 更新数据源,更新表格显示数据
                  */
                  private function refreshDataProvider(pageIndex:uint,isCreateNavBar:Boolean=true,pageSize:uint=0,resultReturn:Boolean=false):void{
                  //分页函数
                  if(dataGrid==null) return;
                  currentPageIndex=pageIndex;
          if(pageSize==0){
          pageSize=this.pageSize;
          }else{
          this.pageSize=pageSize;
         if(!resultReturn) totalPages = Math.ceil(orgData.length/pageSize);
          }                  
                  if(!resultReturn){                                                   
                  if(this.pagingFunction!=null){
pagingFunction(pageIndex,pageSize);
this.isCreateNavBar=isCreateNavBar;
                  }
                  else{
                  viewData = new ArrayCollection( orgData.source.slice((pageIndex * pageSize),(pageIndex * pageSize) + pageSize) );                 
                  dataGrid.dataProvider=viewData;
                  pageNumber.text=(pageIndex+1).toString();
                
                totalRecordLabel.text = '总记录数:' + orgData.length.toString();                                  
                  }
                  }
                  else{
                  dataGrid.dataProvider=orgData;
                  totalPages = Math.ceil(totalRecord/pageSize);
                  pageNumber.text=(pageIndex+1).toString();
                  totalRecordLabel.text = '总记录数:' + totalRecord.toString()
                  }
                  totalPagesLabel.text = '总页数:' + totalPages;
                  if(isCreateNavBar) createNavBar(pageIndex);
                  }
                  //
                  /**
                  * 每页记录数变更(下拉框选择)
                  */
                  private function pageSizeSelectChange():void{
                  refreshDataProvider(0,true,uint(pageSizeComobox.value));
                  }               
                  /**
                  * 页码变更(直接输入)
                  */
                  private function pageIndexInsertChange(event:Event):void{
                  var keyboardEvent:KeyboardEvent=event as KeyboardEvent;
                  if(keyboardEvent!=null&&keyboardEvent.keyCode== Keyboard.ENTER){
                  var pageIndex:uint=uint(pageNumber.text)-1;
                  if(pageIndex>0&&pageIndex<totalPages&&pageIndex!=currentPageIndex){
                   refreshDataProvider(pageIndex);
                   }
                   else{               
                   pageNumber.text = (currentPageIndex+1).toString();
                   }
                  }
                  }    
                  /**
                  * 查看所有
                  */
                  private function viewAll():void{
                  var tempTotalRecord:uint=0;              
if(pagingFunction!=null) tempTotalRecord=totalRecord;
else tempTotalRecord=orgData.length;
//
pageSizeComobox.text=tempTotalRecord.toString();
pageSizeComobox.selectedIndex=-1;
refreshDataProvider(0,true,tempTotalRecord);
                  }
]]>
</mx:Script>
    <mx:HBox paddingTop="8">
<mx:Button id="firstNavBtn" icon="{firstIcon}" width="10" height="10" click="navigateButtonClick('firstPage');" />
    <mx:Button id="preNavBtn" icon="{preIcon}" width="7" height="10" click="navigateButtonClick('prePage');"/>
</mx:HBox>
<mx:LinkBar id="pageNav" itemClick="navigatePage(event)" dataProvider="{nav}"/>
<mx:HBox paddingTop="8">
    <mx:Button id="nextNavBtn" icon="{nextIcon}" width="7" height="10" click="navigateButtonClick('nextPage');"/>
    <mx:Button id="lastNavBtn" icon="{lastIcon}" width="10" height="10" click="navigateButtonClick('lastPage');"/>
</mx:HBox>
<mx:VRule height="25"/>
<mx:Label paddingTop="3" id="totalPagesLabel" text=""/>
<mx:Label paddingTop="3" id="totalRecordLabel" text=""/>
<mx:Label paddingTop="3" text="每页记录:"/>
<mx:ComboBox id="pageSizeComobox" cornerRadius="0" paddingLeft="0" fontWeight="normal" width="50" arrowButtonWidth="10" change="pageSizeSelectChange()"/>
<mx:Label paddingTop="3" text="页码:"/>
<mx:TextInput id="pageNumber" width="40" keyDown="pageIndexInsertChange(event);"/>
<mx:LinkButton id="viewAllLinkBtn" label="查看所有" click="viewAll();"/>            
</mx:HBox>  


第一:  HTTPService获取服务器端数据显示DataGrid

         HTTPService的方式一

         mxml内容

    

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
   xmlns:s="library://ns.adobe.com/flex/spark"
   xmlns:mx="library://ns.adobe.com/flex/mx"
   xmlns:control="com.control.*"
   creationComplete="creationCompleteHandle();myservice.send()"
   minWidth="955" minHeight="600">
<fx:Style>
Application{
fontSize:12;
}
</fx:Style>
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 这个HTTPService使用时一定要提前调用send方法-->
<s:HTTPService id="myservice" url="http://localhost:8080/ClientServerDataGrid/find.do" result="myservice_resultHandler(event)" />
</fx:Declarations>

<fx:Script>
<![CDATA[
import com.adobe.serialization.json.JSON;

import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;

private var pageIndex:int=0;

private var pageSize:int=5;

private function creationCompleteHandle():void{
var orgData:ArrayCollection = new ArrayCollection();
for( var x:uint = 1; x <= 555; x++ )
{
var obj:Object = new Object();
obj.ID = "id " + x.toString();
obj.Code="order "+x;
obj.Total=x*1000;
obj.Customer= "customer "+x;
obj.Register = "employee";
obj.Memo="memo "+x;            
obj.State="auditing state";            
orgData.addItem(obj);
}
clientPagingBar1.dataGrid=DataGrid1;
clientPagingBar1.orgData=orgData;
clientPagingBar1.dataBind();


}


protected function myservice_resultHandler(event:ResultEvent):void
{
var rawData:String = String(event.result); 
//decode the data to ActionScript using the JSON API 
//in this case, the JSON data is a serialize Array of Objects.

var arr:Array = (JSON.decode(rawData) as Array); 
var dataArray:ArrayCollection = new ArrayCollection(arr);
//Alert.show(dataArray.getItemAt(0).id);
clientPagingBar2.dataGrid=DataGrid2;
clientPagingBar2.orgData=dataArray;
clientPagingBar2.dataBind();
}

]]>
</fx:Script>

<mx:VBox>
<mx:Label text="客户端分页" />
<mx:Canvas backgroundColor="white">
<mx:VBox width="100%" height="100%" paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10" verticalScrollPolicy="off" horizontalScrollPolicy="off">
<mx:DataGrid id="DataGrid1" verticalScrollPolicy="on" horizontalScrollPolicy="off">
<mx:columns>
<mx:DataGridColumn headerText="订单ID" dataField="ID" />
<mx:DataGridColumn headerText="订单编码" dataField="Code" />
<mx:DataGridColumn headerText="金额" dataField="Total" />
<mx:DataGridColumn headerText="客户" dataField="Customer" />
<mx:DataGridColumn headerText="销售员" dataField="Register" />
<mx:DataGridColumn headerText="备注说明" dataField="Memo" />
<mx:DataGridColumn headerText="状态" dataField="State" />    
</mx:columns>
</mx:DataGrid>
<control:PagingBar id="clientPagingBar1" />
</mx:VBox>
</mx:Canvas>

<mx:Label text="服务器端分页" />
<mx:Canvas backgroundColor="white">
<mx:VBox width="100%" height="100%" paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10" verticalScrollPolicy="off" horizontalScrollPolicy="off">
<mx:DataGrid id="DataGrid2" verticalScrollPolicy="on" horizontalScrollPolicy="off">
<mx:columns>
<mx:DataGridColumn headerText="订单ID" dataField="id" />
<mx:DataGridColumn headerText="订单编码" dataField="code" />
<mx:DataGridColumn headerText="金额" dataField="total" />
<mx:DataGridColumn headerText="客户" dataField="customer" />
<mx:DataGridColumn headerText="销售员" dataField="register" />
<mx:DataGridColumn headerText="备注说明" dataField="memo" />
<mx:DataGridColumn headerText="状态" dataField="state" />    
</mx:columns>
</mx:DataGrid>
<control:PagingBar id="clientPagingBar2" />
</mx:VBox>
</mx:Canvas>
</mx:VBox>

</s:Application>

     HTTPService的方式二

 

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
   xmlns:s="library://ns.adobe.com/flex/spark"
   xmlns:mx="library://ns.adobe.com/flex/mx"
   xmlns:control="com.control.*"
   creationComplete="creationCompleteHandle()"
   minWidth="955" minHeight="600">
<fx:Style>
Application{
fontSize:12;
}
</fx:Style>
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 这个HTTPService使用时一定要提前调用send方法-->
<s:HTTPService id="myservice"  />
</fx:Declarations>

<fx:Script>
<![CDATA[
import com.adobe.serialization.json.JSON;

import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.utils.URLUtil;

private var pageIndex:int=0;

private var pageSize:int=5;

private function creationCompleteHandle():void{
var orgData:ArrayCollection = new ArrayCollection();
for( var x:uint = 1; x <= 555; x++ )
{
var obj:Object = new Object();
obj.ID = "id " + x.toString();
obj.Code="order "+x;
obj.Total=x*1000;
obj.Customer= "customer "+x;
obj.Register = "employee";
obj.Memo="memo "+x;            
obj.State="auditing state";            
orgData.addItem(obj);
}
clientPagingBar1.dataGrid=DataGrid1;
clientPagingBar1.orgData=orgData;
clientPagingBar1.dataBind();

myservice.url="http://localhost:8080/ClientServerDataGrid/find.do";
myservice.showBusyCursor=true;
myservice.send();
myservice.addEventListener(ResultEvent.RESULT,hsResultHandler);
myservice.addEventListener(FaultEvent.FAULT,hsFaultHandler);
}
private function hsResultHandler(event:ResultEvent):void{  
var rawData:String = String(event.result); 
//decode the data to ActionScript using the JSON API 
//in this case, the JSON data is a serialize Array of Objects.

var arr:Array = (JSON.decode(rawData) as Array); 
var dataArray:ArrayCollection = new ArrayCollection(arr);
//Alert.show(dataArray.getItemAt(0).id);
clientPagingBar2.dataGrid=DataGrid2;
clientPagingBar2.orgData=dataArray;
clientPagingBar2.dataBind();
}  
private function hsFaultHandler(e:FaultEvent):void{  
Alert.show(e.fault.toString(),'http请求错误');  
}  

]]>
</fx:Script>

<mx:VBox>
<mx:Label text="客户端分页" />
<mx:Canvas backgroundColor="white">
<mx:VBox width="100%" height="100%" paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10" verticalScrollPolicy="off" horizontalScrollPolicy="off">
<mx:DataGrid id="DataGrid1" verticalScrollPolicy="on" horizontalScrollPolicy="off">
<mx:columns>
<mx:DataGridColumn headerText="订单ID" dataField="ID" />
<mx:DataGridColumn headerText="订单编码" dataField="Code" />
<mx:DataGridColumn headerText="金额" dataField="Total" />
<mx:DataGridColumn headerText="客户" dataField="Customer" />
<mx:DataGridColumn headerText="销售员" dataField="Register" />
<mx:DataGridColumn headerText="备注说明" dataField="Memo" />
<mx:DataGridColumn headerText="状态" dataField="State" />    
</mx:columns>
</mx:DataGrid>
<control:PagingBar id="clientPagingBar1" />
</mx:VBox>
</mx:Canvas>

<mx:Label text="服务器端分页" />
<mx:Canvas backgroundColor="white">
<mx:VBox width="100%" height="100%" paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10" verticalScrollPolicy="off" horizontalScrollPolicy="off">
<mx:DataGrid id="DataGrid2" verticalScrollPolicy="on" horizontalScrollPolicy="off">
<mx:columns>
<mx:DataGridColumn headerText="订单ID" dataField="id" />
<mx:DataGridColumn headerText="订单编码" dataField="code" />
<mx:DataGridColumn headerText="金额" dataField="total" />
<mx:DataGridColumn headerText="客户" dataField="customer" />
<mx:DataGridColumn headerText="销售员" dataField="register" />
<mx:DataGridColumn headerText="备注说明" dataField="memo" />
<mx:DataGridColumn headerText="状态" dataField="state" />    
</mx:columns>
</mx:DataGrid>
<control:PagingBar id="clientPagingBar2" />
</mx:VBox>
</mx:Canvas>
</mx:VBox>

</s:Application>

第二:URLRequest方式获取

  mxml内容

  

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
   xmlns:s="library://ns.adobe.com/flex/spark"
   xmlns:mx="library://ns.adobe.com/flex/mx"
   xmlns:control="com.control.*"
   creationComplete="creationCompleteHandle()"
   minWidth="955" minHeight="600">
<fx:Style>
Application{
fontSize:12;
}
</fx:Style>
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 这个HTTPService使用时一定要提前调用send方法-->
</fx:Declarations>

<fx:Script>
<![CDATA[
import com.adobe.serialization.json.JSON;

import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.utils.URLUtil;

private var pageIndex:int=0;

private var pageSize:int=5;

private function creationCompleteHandle():void{
var orgData:ArrayCollection = new ArrayCollection();
for( var x:uint = 1; x <= 555; x++ )
{
var obj:Object = new Object();
obj.ID = "id " + x.toString();
obj.Code="order "+x;
obj.Total=x*1000;
obj.Customer= "customer "+x;
obj.Register = "employee";
obj.Memo="memo "+x;            
obj.State="auditing state";            
orgData.addItem(obj);
}
clientPagingBar1.dataGrid=DataGrid1;
clientPagingBar1.orgData=orgData;
clientPagingBar1.dataBind();


//var v:URLVariables = new URLVariables("name=jacky&age=35&address=HongKong China"); 
/*
也可以是这种方式
var vars: URLVariables = new URLVariables ();
vars["varName"] = varValue; //把参数键,值对放到vars对象中.
vars["var2Name"] = var2Value;
*/
var r:URLRequest = new URLRequest(); 
r.url ="http://localhost:8080/ClientServerDataGrid/find.do"; 
r.method = URLRequestMethod.POST; 
//r.data = v; 

var l:URLLoader = new URLLoader(); 
l.load(r); 

l.addEventListener(Event.COMPLETE,txtCompleteHandler); //注册请求完成后 响应获取数据事件方法
}
private function txtCompleteHandler(e:Event):void 

var l:URLLoader = URLLoader(e.target); 
/* URLUtil的stringToObject方法解释
从字符串返回对象。字符串包含 name=value 对,它们成为返回对象的动态属性。这些属性对由指定的 separator 分隔。该方法可转换数字、布尔值、数组(由“[]”定义)以及子类(由“{}”定义)。默认情况下,%XX 格式的 URL 模式将转换为相应的字符串字符。
例如:
var s:String = "name=Alex;age=21";
var o:Object = URLUtil.stringToObject(s, ";", true);
返回对象:{ name: "Alex", age: 21 }。
*/
//直接获取返回值内容:  URLLoader(e.target).data
// Alert.show(l.data);
// var o:Object = URLUtil.stringToObject(l.data,";",true); //使用URLUtil对将数据进行反序列化以方便使用 


var rawData:String = String(l.data); 
//decode the data to ActionScript using the JSON API 
//in this case, the JSON data is a serialize Array of Objects.

var arr:Array = (JSON.decode(rawData) as Array); 
var dataArray:ArrayCollection = new ArrayCollection(arr);
//Alert.show(dataArray.getItemAt(0).id);
clientPagingBar2.dataGrid=DataGrid2;
clientPagingBar2.orgData=dataArray;
clientPagingBar2.dataBind();


]]>
</fx:Script>

<mx:VBox>
<mx:Label text="客户端分页" />
<mx:Canvas backgroundColor="white">
<mx:VBox width="100%" height="100%" paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10" verticalScrollPolicy="off" horizontalScrollPolicy="off">
<mx:DataGrid id="DataGrid1" verticalScrollPolicy="on" horizontalScrollPolicy="off">
<mx:columns>
<mx:DataGridColumn headerText="订单ID" dataField="ID" />
<mx:DataGridColumn headerText="订单编码" dataField="Code" />
<mx:DataGridColumn headerText="金额" dataField="Total" />
<mx:DataGridColumn headerText="客户" dataField="Customer" />
<mx:DataGridColumn headerText="销售员" dataField="Register" />
<mx:DataGridColumn headerText="备注说明" dataField="Memo" />
<mx:DataGridColumn headerText="状态" dataField="State" />    
</mx:columns>
</mx:DataGrid>
<control:PagingBar id="clientPagingBar1" />
</mx:VBox>
</mx:Canvas>

<mx:Label text="服务器端分页" />
<mx:Canvas backgroundColor="white">
<mx:VBox width="100%" height="100%" paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10" verticalScrollPolicy="off" horizontalScrollPolicy="off">
<mx:DataGrid id="DataGrid2" verticalScrollPolicy="on" horizontalScrollPolicy="off">
<mx:columns>
<mx:DataGridColumn headerText="订单ID" dataField="id" />
<mx:DataGridColumn headerText="订单编码" dataField="code" />
<mx:DataGridColumn headerText="金额" dataField="total" />
<mx:DataGridColumn headerText="客户" dataField="customer" />
<mx:DataGridColumn headerText="销售员" dataField="register" />
<mx:DataGridColumn headerText="备注说明" dataField="memo" />
<mx:DataGridColumn headerText="状态" dataField="state" />    
</mx:columns>
</mx:DataGrid>
<control:PagingBar id="clientPagingBar2" />
</mx:VBox>
</mx:Canvas>
</mx:VBox>

</s:Application>

针对上面两种方式的servlet处理类为

 

package com.test;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;

public class FindDataServlet extends HttpServlet {


public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
             this.doPost(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("执行Servlet了哦。。。。。。。。。。。。");
List<MyObject> orgData=new ArrayList<MyObject>();
for(int x= 1; x <= 555; x++ )
{
MyObject ob=new MyObject();
ob.setId("CHENEY"+x);
        ob.setCode("HENAN"+x);
ob.setTotal(x*10);
ob.setCustomer("CUS"+x);
ob.setRegister("EMP"+x);
            ob.setMemo("MEMO"+x);
ob.setState("STATE"+x);
orgData.add(ob);
}
   JSONArray json=JSONArray.fromObject(orgData);
   String datas=json.toString();
   System.out.println(datas);
   response.getWriter().write(datas);
}

}

当然这里JAVA程序也用到JSON相关类,一般要使用JSON的话要使用到六个包

第三:RemoteObject 获取方式

    mxml内容

  

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
   xmlns:s="library://ns.adobe

原文地址:https://www.cnblogs.com/tianlangshu/p/2502672.html