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中有,设置为不显示就好了,例如我就是这么做的



这样的话,要更改的数据等都能通过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文件


xmlns:s="library:

//https://www.360docs.net/doc/1a11067730.html,/flex/spark"
xmlns:mx="library://https://www.360docs.net/doc/1a11067730.html,/flex/mx" width="668" height="326"
creationComplete="initComponent()"
title="指标计量单位"
fontSize="15"
close="closeWindow()">





tooShortError="字符串太短了,请输入最少4个字符. "
tooLongError="字符串太长了,请输入最长20个字符. "
minLength="4" maxLength="20"
trigger="{myButton}" triggerEvent="click"
/>
tooShortError="字符串太短了,请输入最少4个字符. "
tooLongError="字符串太长了,请输入最长20个字符. "
minLength="4" maxLength="20"
trigger="{myButton}" triggerEvent="click"
/>



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(https://www.360docs.net/doc/1a11067730.html,PLETE, 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(https://www.360docs.net/doc/1a11067730.html,PLETE,comp);
}else{
Alert.show("新增失败");
}

}
private func

tion 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(https://www.360docs.net/doc/1a11067730.html,PLETE,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(https://www.360docs.net/doc/1a11067730.html,PLETE,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;
}

]]>






n visible="false" dataField="targetCalId" />







































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

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

FindTargetCalServlet

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
TTargetCalDAO dao=new TTargetCalDAO();
List 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主要代码


xmlns:s="library://https://www.360docs.net/doc/1a11067730.html,/flex/spark"
xmlns:mx="library://https://www.360docs.net/doc/1a11067730.html,/flex/mx" width="100%" height="100%"
creationComplete="init()">

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("");
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(https://www.360docs.net/doc/1a11067730.html,PLETE,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("");
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"] = va

rValue; //把参数键,值对放到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(https://www.360docs.net/doc/1a11067730.html,PLETE,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("");
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(https://www.360docs.net/doc/1a11067730.html,PLETE,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(https://www.360docs.net/doc/1a11067730.html,PLETE,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;kxml=list[k] as XML;
var parent:XML=xml.parent();
if(parent!=null) {
var children:XMLList=parent.children();
for(var i:int=0;iif(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(https://www.360docs.net/doc/1a11067730.html,PLETE,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;ivar 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);
}




]]>



















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

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



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



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



com.jadetrust.test.FindTreeNode





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

//把数据库中的无限级联表中数据拼装成一个XML文档
public String convertDataToXml()
{
UserService sf=new UserService();
List cates=sf.findCategoriesAll();
System.out.println(cates);
List

ory> listTop=sf.findCategoriesTop();
String treedata="\n\n";
for(TCategory cate:listTop){
treedata=treedata+"\n";
treedata=CreateXmlNode(cates,cate.getCateId(),treedata);
treedata=treedata+"
\n";
}
treedata=treedata+"
\n";


System.out.println(treedata);
return treedata;
}
/**
* 递归解析list –> Xml
*/
public String CreateXmlNode(List list,int nodepid,String cratedata){
for (int a=0;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+"\n";
cratedata=CreateXmlNode(list,cate.getCateId(),cratedata);
cratedata=cratedata+"
\n";
}else{
cratedata=cratedata+"\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 l

astId=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 TCategories = new HashSet(0);

// Constructors

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

/** full constructor */
public TCategory(TCategory TCategory, String name,
Set TCategories) {
this.TCategory = TCategory;
https://www.360docs.net/doc/1a11067730.html, = 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 = https://www.360docs.net/doc/1a11067730.html,ZY)
@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 https://www.360docs.net/doc/1a11067730.html,;
}

public void setName(String name) {
https://www.360docs.net/doc/1a11067730.html, = name;
}

@OneToMany(cascade = CascadeType.ALL, fetch = https://www.360docs.net/doc/1a11067730.html,ZY, mappedBy = "TCategory")
public Set getTCategories() {
return this.TCategories;
}

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



}



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

package com.jadetr

ust.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 https://www.360docs.net/doc/1a11067730.html,mon.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);
https://www.360docs.net/doc/1a11067730.html,mit();
session.close();

}
public void delete(TCategory cate){
Session session=HibernateSessionFactory.getSession();
Transaction tc=session.beginTransaction();
session.delete(cate);
https://www.360docs.net/doc/1a11067730.html,mit();
session.close();
}
public void update(TCategory cate){
Session session=HibernateSessionFactory.getSession();
Transaction tc=session.beginTransaction();
session.merge(cate);
https://www.360docs.net/doc/1a11067730.html,mit();
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 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 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 findCategoriesAll() {
System.out.println("查询顶级父目录.................");
String hql = "from TCategory";
return HibernateSessionFactory.getSession().createQuery(hql).list();
}
public List> findNameById(String id){
List> names=new ArrayList>();

UserService sf=new UserService();
Set cates=sf.findById(id).getTCategories();
for(TCategory cate:cates){
Map maps=new HashMap();
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目录下




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=pageS

izeDropDownListData;
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(pageNu

mber.text)-1;
if(pageIndex>0&&pageIndexrefreshDataProvider(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);
}
]]>



























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

HTTPService的方式一

mxml内容




xmlns:s="library://https://www.360docs.net/doc/1a11067730.html,/flex/spark"
xmlns:mx="library://https://www.360docs.net/doc/1a11067730.html,/flex/mx"
xmlns:control="com.control.*"
creationComplete="creationCompleteHandle();myservice.send()"
minWidth="955" minHeight="600">

Application{
fontSize:12;
}







import com.adobe.serialization.json.JSON;

import mx.collections.Array

Collection;
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;
https://www.360docs.net/doc/1a11067730.html,Data=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;
https://www.360docs.net/doc/1a11067730.html,Data=dataArray;
clientPagingBar2.dataBind();
}

]]>


































taGrid>









HTTPService的方式二




xmlns:s="library://https://www.360docs.net/doc/1a11067730.html,/flex/spark"
xmlns:mx="library://https://www.360docs.net/doc/1a11067730.html,/flex/mx"
xmlns:control="com.control.*"
creationComplete="creationCompleteHandle()"
minWidth="955" minHeight="600">

Application{
fontSize:12;
}







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;
https://www.360docs.net/doc/1a11067730.html,Data=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;
https://www.360docs.net/doc/1a11067730.html,Data=dataArray;
clientPagingBar2.dataBind();
}
private function hsFaultHandler(e:FaultEvent):void{
Alert.show(e.fault.toString(),'http请求错误');
}



]]>










































第二:URLRequest方式获取

mxml内容




xmlns:s="library://https://www.360docs.net/doc/1a11067730.html,/flex/spark"
xmlns:mx="library://https://www.360docs.net/doc/1a11067730.html,/flex/mx"
xmlns:control="com.control.*"
creationComplete="creationCompleteHandle()"
minWidth="955" minHeight="600">

Application{
fontSize:12;
}






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;
https://www.360docs.net/doc/1a11067730.html,Data=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(https://www.360docs.net/doc/1a11067730.html,PLETE,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;
https://www.360docs.net/doc/1a11067730.html,Data=dataArray;
clientPagingBar2.dataBind();
}


]]>


























相关文档
最新文档