认真做 flex + spring + blazeDS + google app JDO 分页.每次查询总数.

简介: 认真做 flex + spring + blazeDS + google app JDO 分页.每次查询总数. 最近被 BlazeDS 折腾的不行了.. 都有点想换成 e4x 格式的 xml 那样来的比较简单.但是终没有放弃.收获还是不错的. 首先是在 explore 里面 使用 SWFLoader 做动态加载. 根据不同的菜单 显示不同

认真做 flex + spring + blazeDS + google app JDO 分页.每次查询总数.


最近被 BlazeDS 折腾的不行了..


都有点想换成 e4x 格式的 xml 那样来的比较简单.但是终没有放弃.收获还是不错的.


首先是在 explore 里面 使用 SWFLoader 做动态加载.


根据不同的菜单 显示不同的tab 页.


但是 切换 多个标签的时候出现 问题报错:


***TypeError: Error #1034: 强制转换类型失败:无法将 Object@b932bf1 转换为 mx.messaging.messages.IMessage。


经查找是由于模块加载 是 共享类库.


有些东西没有找到..加载不全.


http://www.iteye.com/topic/297813


参考下..


做法:


将.//var swfLoader:SWFLoader = new SWFLoader();
//swfLoader.source = nodeApp + ".swf";
替换成.
var swfLoader:ModuleLoader = new ModuleLoader();
加载模块.
swfLoader.applicationDomain = ApplicationDomain.currentDomain;
//解决[TypeError: Error #1034: 强制转换类型失败:]模块加载问题.
swfLoader.loadModule(nodeApp + ".swf");
并将application进行复制.


成功加载多个模块.并且..开始出现的模块加载慢的问题解决了.


使用BlazeDS 也是挺快的.看来坚持是对的.



下面开始写分页.


引用以前的一个分页 类..转换成as

 

package common.page
{
	import mx.controls.Label;
	import mx.events.ItemClickEvent;
	
	public class PageConf
	{
		/** 分页类开始.*./ /** 排序字段. */
		public var sortField:String;
		/** 排序升降.des,aesc. */
		public var sortDir:String;
		/** 分页开始. */
		private var start:Number;
		/** 分页结束. */
		private var end:Number;
		/** 每页最大数. */
		private var limit:Number;
		/** 分页总数. */
		public var total:Number;
	
		public function getStart():Number {
			return this.start;
		}
		public function getEnd():Number {
			//每次都重新计算End.因为.有可能在查询时,数据增加.
			return Math.min(this.start + this.limit, this.total);
		}
		
		public function getCurrPage():Number {//得到当前页.
			return Number(Math.floor(start / limit));
		}
	
		public function getTotalPage():Number {
			/** 取得总共的页数. */
			return Number(Math.ceil(total / limit));
		}
	
		public function getGo(page:Number):void {/* 页面跳转函数.输入要跳转的页面. */
			var totalPage:Number = getTotalPage();
			var currentPage:Number = getCurrPage();
			if (page <= 1) {/* 如果小于1.跳到首页. */
				getFirst();
				return;
			} else if (page >= totalPage) {/* 如果大于总页数跳到末页. */
				getLast();
				return;
			} else if (page == currentPage) {/* 当前页返回. */
				return;
			} else {/* 否则进行页面跳转.也就是计算start和end. */
				this.start = (page - 1) * limit;
				this.end = Math.min(page * limit, total);
			}
		}
	
		public function getNext():void  {
			trace("getNextPage");
			var currentPage:Number = getCurrPage();
			var tempStart:Number = (currentPage + 1) * limit;
			if (tempStart >= total)
				return;
			this.start = tempStart;
			this.end = Math.min((currentPage + 2) * limit, total);
		}
	
		public function getFirst():void  {
			trace("getFirst");
			this.start = 0;
			this.end = Math.min(limit, total);
		}
	
		public function getLast():void {
			trace("getEnd");
			var lastPage:Number = getTotalPage();
			/** 如果刚好总页数刚好被整除.就往前一页. */
			if ((lastPage * limit) >= total) {
				lastPage--;
			}
			this.start = lastPage * limit;
			this.end = Math.min((lastPage + 1) * limit, total);
		}
	
		public function getPrev():void {
			trace("getPrevpage");
			var currentPage:Number = getCurrPage();
			/** 前一页等于当前页数乘以每页记录数. */
			this.start = Math.max((currentPage - 1) * limit, 0);
			this.end = Math.max((currentPage) * limit, limit);
		}
	
		public function hasNext():Boolean{
			if (this.end == this.total) {
				return false;
			} else if (this.getTotalPage() <= 1) {
				return false;
			} else {
				return true;
			}
		}
	
		public function hastPrev():Boolean {
			if (this.start == 0) {
				return false;
			} else {
				return true;
			}
		}
	
		public function PageConf(start:Number, limit:Number, total:Number) {/* 构造函数.设置开始.和分页数. */
			this.start = start;
			this.limit = limit;
			this.end = this.limit;
			this.total = total;
		}
		
		public function pageItemClick(itemClick:ItemClickEvent, pageInfo:Label):void {
				if(itemClick.index == 0){
					getFirst();
				}else if(itemClick.index == 1){
					getPrev();
				}else if(itemClick.index == 2){
					getNext();
				}else if(itemClick.index == 3){
					getLast();
				}else{
					return;
				}
	    }
	    
	    public function showPageInfo(pageInfo:Label):void {//通用显示Info页面.
				var tempStart:Number = 0;
				var tempEnd:Number = 0;
				if(total != 0){//解决显示数字从0开始问题.App上面是从0开始.
					tempStart = (start+1);
				}
				if(getCurrPage() == 0){
					tempEnd = Math.min(getEnd(), total);
				}else{
					tempEnd = getEnd();
				}
				pageInfo.text = "["+tempStart+"-"+tempEnd+"/"+total+"]";
	    }
	    
	    public function toString():String{
	    	return "start["+start+"]end["+
	    	end+"]total["+total+"]limit["+limit;
	    }
	}
}

 

然后是在建立一个 模块..

 

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" >
<mx:HBox width="100%">
    <mx:Label textAlign="right" paddingTop="4" id="pageInfo" width="90" height="22" fontWeight="bold" fontSize="12"></mx:Label>
	<mx:LinkBar id="pageLikBar">
		<mx:dataProvider>
                <mx:Array>
                    <mx:String>首页</mx:String>
                    <mx:String>上一页</mx:String>
                    <mx:String>下一页</mx:String>
                    <mx:String>末页</mx:String>
                </mx:Array>
        </mx:dataProvider>
	</mx:LinkBar>
</mx:HBox>
</mx:Canvas>

 

可以在别的 文件里面 引用这个模块.

 

分页做的最简单 的一个分页.

 

而且还学会了分文件夹 进行模块管理.

 



 


 
 分页如同显示.

 

其中调用方法.

 

<?xml version="1.0" encoding="utf-8"?>
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml"
  backgroundColor="#EEEEEE" width="100%" fontSize="12" initialize="initApp();" height="100%"
  xmlns:common="common.page.*">
  
<mx:RemoteObject id="systemUserDAO" destination="systemUserDAO">
	<mx:method name="list" result="listHandler(event)"/>
	<mx:method name="listSize" result="listSizeHandler(event)"/>
</mx:RemoteObject>
<mx:Script>
	<![CDATA[
		import mx.collections.ArrayCollection;
		import mx.events.ItemClickEvent;
		import mx.rpc.events.ResultEvent;
		import common.page.PageConf;
		import mx.controls.Alert;
		import mx.managers.PopUpManager;
		
		private var myPageConf:PageConf;
		//初始化函数.
		private function initApp():void{
			//定义一个默认加载类.
	        myPageConf = new PageConf(0,15,0);
	        //第一次默认查询数据.
	        systemUserDAO.listSize();
	        //给通用分页Bar绑定事件.
	        commonPageBar.pageLikBar.addEventListener(ItemClickEvent.ITEM_CLICK,
        		function(event:ItemClickEvent):void{//匿名函数.
	        		myPageConf.pageItemClick(event, commonPageBar.pageInfo);
	        		systemUserDAO.listSize();
	        });
		}
		//列表显示数据.
		[Bindable]
      	private var listData:ArrayCollection;
      	//查询总数响应处理.
		private function listSizeHandler(event:ResultEvent):void
		{
			var pageSize:Number = event.result as Number;
			myPageConf.total = pageSize;
			systemUserDAO.list(myPageConf.getStart(), myPageConf.getEnd());
			//查询出总记录数时.显示信息.
			myPageConf.showPageInfo(commonPageBar.pageInfo);
		}
		//查询数据响应处理.
		private function listHandler(event:ResultEvent):void
		{
			 listData = event.result as ArrayCollection;
		}
	]]>
</mx:Script>
	
<mx:VBox>
	<mx:DataGrid width="100%" height="386" 
		editable="false" dataProvider="{listData}">
	    <mx:columns>
	        <mx:DataGridColumn headerText="id" width="10" />
	        <mx:DataGridColumn headerText="登录名" dataField="loginName"/>
	        <mx:DataGridColumn headerText="姓名" dataField="name"/>
	        <mx:DataGridColumn headerText="电话" dataField="phone"/>
	        <mx:DataGridColumn headerText="email" dataField="email"/>
	        <mx:DataGridColumn headerText="创建时间" dataField="createDate"/>
	    </mx:columns>
	</mx:DataGrid>
	<mx:HBox width="100%">
		<mx:Button label="新增" click="addForm();"/>
		<mx:Button label="删除"/>
		<mx:Spacer width="100"/>
        <common:PageBar id="commonPageBar"/>
	</mx:HBox>
</mx:VBox>

</mx:Module>

 

这里有个问题..我是用的两次调用 remote 方法.

第一次 查询总的页数.然后 根据这个翻页. 再查询

数据.每次都是要查询这个总数的. 写了两个方法. 目前还没有想到太好的方法去查询.

 

后台用了一个泛型dao 发现 google app 上面是支持 反射的. 借用下别人的代码.

 

查询DAO 泛型 类.

 

package com.freewebsys.dao.impl;

import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Map;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import org.springframework.orm.jdo.support.JdoDaoSupport;
import com.freewebsys.dao.IGenericDAO;
import com.freewebsys.jdo.BaseBean;
import com.freewebsys.jdo.SystemUser;

@SuppressWarnings("unchecked")
public abstract class GenericDAOImpl<T extends BaseBean> extends JdoDaoSupport
		implements IGenericDAO {

	private Class<T> entityClass;

	public GenericDAOImpl() {
		// 经典的通过反射得到类.
		entityClass = (Class<T>) ((ParameterizedType) getClass()
				.getGenericSuperclass()).getActualTypeArguments()[0];
	}

	@Override
	public boolean delete(BaseBean item) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean save(BaseBean item) {
		PersistenceManager pm = getPersistenceManager();
		System.out.println(this.entityClass + "调用save方法.");
		try {
			if (item.getId() == null) {
				pm.makePersistent(item);
			} else {
				BaseBean itemOld = pm.getObjectById(item.getClass(), item
						.getId());
				pm.makePersistent(itemOld);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			pm.close();
		}
		return false;
	}

	@Override
	public T findById(long id) {
		return null;
	}

	@Override
	public List<T> findByProp(Map value) {
		return null;
	}

	@Override
	public List<T> list(long start, long end) {
		PersistenceManager pm = getPersistenceManager();
		try {
			Query query = pm.newQuery(entityClass);
			/** 查询添加排序.sort是排序字段.dir是顺序还是倒序. */
			System.out.println("JDO pageList:[" + query.toString() + "]start:["
					+ start + "]end:[" + end + "]");
			query.setRange(start, end);
			List<T> results = (List<T>) query.execute("Smith");
			// for(int i = 0; i < results.size(); i ++){
			// T t = results.get(i);
			// System.out.println(t);
			// }
			/** 设置开始和结束. */
			System.out.println("results size:[\t" + results.size());
			return results;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			pm.close();
		}
		return null;
	}

	@Override
	public long listSize() {
		PersistenceManager pm = getPersistenceManager();
		try {
			long size = 0;
			/** 查询最大数. */
			Query query = pm.newQuery("select count(id) from "
					+ entityClass.getName());
			/** 条件查询总数. */
			// query = commonListQuery(query, null);

			/** 强制转换成int */
			size = Long.parseLong(query.execute("Smith").toString());
			//System.out.println("JDO pageSize:\t" + query.toString());
			return size;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			pm.close();
		}
		return 0;
	}
}

 

同时也解决了.在翻页的时候插入新数据.翻页更新.

 

比较满意的分页.

 

附件是代码.

 

http://myflexeye.appspot.com

 

部署到 google 服务器上. 可以运行.

 

附件是工程 . 没有 BlazeDS 和 app spring的jar 文件.

 

 

目录
相关文章
|
2月前
|
JavaScript 前端开发 API
Google Earth Engine(GEE)扩展——制作的GEE app的误区
Google Earth Engine(GEE)扩展——制作的GEE app的误区
30 0
|
6月前
|
Java 数据库连接 数据库
MyBatis与Spring集成&常用注解以及AOP和PageHelper分页插件整合
MyBatis与Spring集成&常用注解以及AOP和PageHelper分页插件整合
53 0
|
6月前
|
缓存 Java Go
解决Spring Data JPA查询存在缓存问题及解决方案
解决Spring Data JPA查询存在缓存问题及解决方案
357 0
|
2月前
|
机器学习/深度学习 算法 数据可视化
基于Google Earth Engine云平台构建的多源遥感数据森林地上生物量AGB估算模型含生物量模型应用APP
基于Google Earth Engine云平台构建的多源遥感数据森林地上生物量AGB估算模型含生物量模型应用APP
104 0
|
1月前
|
前端开发 Java Spring
Java 新手如何使用Spring MVC 中的查询字符串和查询参数
Java 新手如何使用Spring MVC 中的查询字符串和查询参数
|
2月前
Google Earth Engine APP(GEE)—— 一个简单的加载影像的UI(RGB,NDWI和NDVI)这里使用时间滑块进行时间选择
Google Earth Engine APP(GEE)—— 一个简单的加载影像的UI(RGB,NDWI和NDVI)这里使用时间滑块进行时间选择
28 0
|
2月前
|
机器学习/深度学习 编解码 算法
Google Earth Engine APP(GEE)——加拿大陆地生态系统中的土壤碳储量数据集
Google Earth Engine APP(GEE)——加拿大陆地生态系统中的土壤碳储量数据集
33 0
|
4月前
|
SQL Java Spring
Spring Data JPA之JpaSpecificationExecutor复杂动态查询实例
Spring Data JPA之JpaSpecificationExecutor复杂动态查询实例
32 0
|
4月前
|
SQL Java 数据库
Spring Data JPA 查询方法那些事
Spring Data 提供了几个接口供继承使用,如 JpaRepository,另外还规定了方法查询中的关键字,即你命名的查询方法需要符合规范。
93 0
|
4月前
|
Java 数据库连接 数据库
MyBatis与Spring的集成整合加优化分页功能
MyBatis与Spring的集成整合加优化分页功能