<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>EXT</title>
    <description>UI:USE DWR+EXT TO CREATE A BEATIFULL UI</description>
    <link>http://EXT.group.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>也来show一下我的EXT成果</title>
        <author>yongtree</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yongtree.javaeye.com">yongtree</a>&nbsp;
          链接：<a href="http://EXT.group.javaeye.com/group/blog/211321" style="color:red;">http://EXT.group.javaeye.com/group/blog/211321</a>&nbsp;
          发表时间: 2008年07月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>我们在OA的改版中也使用了EXT做为UI表现，现在项目进入后期了，也提前show一下，请各位多提宝贵意见。</p>
<p>&nbsp;flex登陆：</p>
<p><img src="../../../upload/picture/pic/17215/ff9ee023-b62e-39c7-8b0f-f652eba49e16.jpg" height="463" alt="" width="766" /></p>
<p>由于本人负责工作流模块的开发，下面主要以工作流为主。自己是刚进入软件开发领域只有不到一年的新手，工作流开发的不是非常的好，请各位多多批评指教。更希望EXT的学习者多多指教，共同学习，进步。</p>
<p>流程设计后台：</p>
<p><img src="../../../upload/picture/pic/17237/c3c6ce1e-ff11-36ee-a083-b495c18f3a13.jpg" alt="" /></p>
<p>可编辑表格：</p>
<p><img src="../../../upload/picture/pic/17239/9e3bdd3a-a78a-3dc7-a078-b03722b46449.jpg" alt="" /></p>
<p>ext表单：</p>
<p><img src="../../../upload/picture/pic/17221/0cbd66e4-9f11-31d4-9ede-7aebdd8d3516.jpg" alt="" /></p>
<p>流程详细设计：</p>
<p><img src="../../../upload/picture/pic/17229/c09ec17f-3648-35f8-bda1-a004f9a4f9ca.jpg" alt="" /></p>
<p>使用tab布局做的人员选择：</p>
<p><img src="../../../upload/picture/pic/17231/e6d41009-2da5-3d39-847f-62c7516d07d1.jpg" alt="" /></p>
<p>绑定表单字段（扩展ext）:</p>
<p><img src="../../../upload/picture/pic/17241/cf3e6bff-074b-34dc-9d1e-fbd38c05ba60.jpg" alt="" /></p>
<p>groupgrid:</p>
<p><img src="../../../upload/picture/pic/17223/43b80266-dec1-33e7-84cd-9422e4f98100.jpg" alt="" /></p>
<p><a href="../../../upload/picture/pic/17241/cf3e6bff-074b-34dc-9d1e-fbd38c05ba60.jpg"></a></p>
          <br/>
          <span style="color:red;">
            <a href="http://EXT.group.javaeye.com/group/blog/211321#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 Jul 2008 09:07:39 +0800</pubDate>
        <link>http://EXT.group.javaeye.com/group/blog/211321</link>
        <guid>http://EXT.group.javaeye.com/group/blog/211321</guid>
      </item>
      <item>
        <title>Faceye中对JavaScript动态加载</title>
        <author>ecsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsun.javaeye.com">ecsun</a>&nbsp;
          链接：<a href="http://EXT.group.javaeye.com/group/blog/210441" style="color:red;">http://EXT.group.javaeye.com/group/blog/210441</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在Faceye中,使用到了大量的portlet,每一个portlet都是一个完整的小单元,数量众多的portlet的加载,成了一个思考的问题.<br /><br />在最开始的时候,考虑过把javascripts写到数据库里面,然后在使用的时候,从数据库中加载进来,后来经过与大量网友的讨论,采用了使用文件方式进行加载.<br />首先来看Faceye的数据结构.<br /><br />user--1:1-->PortalContainer--1:n-->Portal--1:n-->PortalColumn--1:n-->portlet<br /><br />就是说,portlet位于最末端,数量最多.<br />先来看一下整体是怎么加载的:<br /><pre name="code" class="java">

/**
 * 创建portlet
 */
com.faceye.portal.BuildPortlet = {
	init : function(portalColumnId) {
		var portalColumn = Ext.getCmp(portalColumnId);
		var portletStore = new Ext.data.JsonStore({
			url : BP + 'portletAction.do?method=getPortletsByPortalColumn',
			root : 'root',
			fields : ['id', 'name', 'source', 'createTime', 'url', 'imageSrc',
					'init']
		});
		portletStore.load({
			params : {
				portalColumnId : portalColumnId
			},
			callback : function(r, options, success) {
				for (var i = 0; i &lt; r.length; i++) {
					var id = r[i].data['id'];
					var name = r[i].data['name'];
					var url = r[i].data['url'];
					Ext.Ajax.request({
						url : r[i].data['url'],
						params : {
							id : id,
							name : name
						},
						success : function(response, options) {
							var source = response.responseText;
							var headerDom = document
									.getElementsByTagName('head').item(0);
							var jsDom = document.createElement('script');
							jsDom.type = 'text/javascript';
							jsDom.language = 'javascript';
							jsDom.defer = true;
							jsDom.text = source;
							headerDom.appendChild(jsDom);
							var portlet = com.faceye.portal.portlet.SinglePortlet
									.init(options.params.id,
											options.params.name);
							portalColumn.add(portlet);
							portalColumn.doLayout();
						}
					});
				}

			}
		});
	}
}
</pre><br /><br /><br />在这一段代码中,最重要的是callback部分.在这里,我们一个portal里面包含数量不等的portalColumn,而一个portalColumn中,又包含数量不等的portlet,所以在这里,我们使用portalColumnId作为加载一个portalColumn中所有portlet的参数,如下:<br /><pre name="code" class="java">
init : function(portalColumnId)
</pre><br /><br />当一个portlet读取之后,我们会调用一个callback方法作加载动作,如下:<br /><pre name="code" class="java">
success : function(response, options) {
							var source = response.responseText;
							var headerDom = document
									.getElementsByTagName('head').item(0);
							var jsDom = document.createElement('script');
							jsDom.type = 'text/javascript';
							jsDom.language = 'javascript';
							jsDom.defer = true;
							jsDom.text = source;
							headerDom.appendChild(jsDom);
							var portlet = com.faceye.portal.portlet.SinglePortlet
									.init(options.params.id,
											options.params.name);
							portalColumn.add(portlet);
							portalColumn.doLayout();
						}
</pre><br /><br />这一段代码,主要是创建一个网页中的&lt;script>标签,同时,将我们指定的portlet文件加载进来.<br />一旦portlet加载进来,我们就会调用另外一个方法:<br /><pre name="code" class="java">
var portlet = com.faceye.portal.portlet.SinglePortlet
									.init(options.params.id,
											options.params.name);

</pre><br />对portlet进行加载.<br />在这里,我们所有的portlet的定义,都是以<br /><pre name="code" class="java">
com.faceye.portal.portlet.SinglePortlet.init(id,name)
</pre><br />方式定义的,这就为我们数量众多的portlet规定了统一的接口,每个portlet只需要进行具体的实现即可,不需要反复的去书写加载代码了.<br /><br />一个示例的portlet定义如下:<br /><br /><pre name="code" class="java">
/**
 * www.faceye.com网络支持系统 作者:宋海鹏
 * 我的博客文章，取得并显示当前用户的博客文章。
 * ecsun@sohu.com/myecsun@hotmail.com/QQ:82676683/技术交流群:56927478 说明:Blog porlet
 */
com.faceye.portal.portlet.SinglePortlet = {
	init : function(id, name) {
		var portlet = new Ext.ux.Portlet({
			id : id + '_' + Ext.id(),
			title : name,
			tools : com.faceye.portal.PortletTools
		});
		var store = new Ext.data.Store({
			// baseParams : {
			// categoryId : categoryId
			// },
			proxy : new Ext.data.HttpProxy({
				url : BP + 'articleAction.do?method=getArticles'
			}),
			reader : new Ext.data.JsonReader({
				root : 'root',
				totalProperty : 'total',
				id : 'id',
				fields : ['id', 'name', 'content', 'createTime',
						'categoryName', 'categoryId','discusCount','clickCount']
			})
		});
		store.load({
			params : {
				start : 0,
				limit : 15
			}
		});
		function renderTopic(value, metadata, record, rowIndex, colIndex, store) {
			var html = '&lt;p>&lt;a href="#" onclick="com.faceye.portal.portlet.ArticleEditForm.detail(\'{0}\')">&lt;span id="user-blog-article-detail-title">{1}&lt;/span>&lt;/a>&lt;/p>' +
					'&lt;hr id="user-blog-article-hr"/>'
					+ '&lt;div id="user-blog-article-list-small-tool">&lt;a href="#" onclick="com.faceye.portal.portlet.ArticleEditForm.detail(\'{0}\')">评论({5})&lt;/a> ' +
							'| &lt;a href="#" onclick="com.faceye.portal.portlet.ArticleEditForm.detail(\'{0}\')">阅读({6})&lt;/a> ' +
							'| 固定链接' +
							'| 类别(&lt;a href="#" onclick="com.faceye.portal.portlet.BlogUtil.reloadGridByCategory(\'{4}\')">{2}&lt;/a>) ' +
							'｜发表于{3}&lt;/div>';
			return String.format(html, record.data.id, record.data.name,
					record.data.categoryName, record.data.createTime,record.data.categoryId,record.data.discusCount,record.data.clickCount);
		}

		var cm = new Ext.grid.ColumnModel([
		// new Ext.grid.CheckboxSelectionModel(),
				{
					id : 'id', // id assigned so we can apply custom css (e.g.
					dataIndex : 'id',
					hidden : true
				}, {
					// header : "标题",
					dataIndex : 'name',
					renderer : renderTopic
				}]);
		// cm.defaultSortable = true;
		var grid = new Ext.grid.GridPanel({
			// el:'topic-grid',
			// renderTo:outGridPanel,
			// title : '我的博客',
			id:'user-blog-grid',
			header : false,
			region : 'center',
			border : false,
			autoHeight : true,
			loadMask : true,
			stripeRows : true,
			trackMouseOver : true,
			layoutConfig : {
				autoWidth : true,
				layout : 'fit'
			},
			// autoExpandMax:1000,
			// width:900,
			store : store,
			cm : cm,
			bodyStyle : 'width:100%;height:100%;',
			trackMouseOver : false,
			// selectRow:Ext.emptyFn，控制选中的记录是否高亮度显示
			sm : new Ext.grid.RowSelectionModel({
				selectRow : Ext.emptyFn
			}),
			// sm : new Ext.grid.CheckboxSelectionModel(),
			loadMask : true,
			viewConfig : {
				forceFit : true,
				enableRowBody : true,
				showPreview : true,
				getRowClass : function(record, rowIndex, p, store) {
					var xf = Ext.util.Format;
					if (this.showPreview) {
						p.body = '&lt;div id="user-blog-article-content-summary">'
								+ xf.ellipsis(
										xf.stripTags(record.data.content), 500)
								+ '&lt;/div>';
						p.body += '&lt;hr  id="user-blog-article-hr"/>&lt;div id="user-blog-article-list-small-tool">&lt;p>评论()|阅读()|固定链接|类别('
								+ record.data.categoryName + ')｜发表于'
								+ record.data.createTime + '&lt;/p>&lt;/div>';
						return 'x-grid3-row-expanded';
					}
					p.body += '&lt;hr id="user-blog-article-hr"/>&lt;div id="user-blog-article-list-small-tool">&lt;p>评论()|阅读()|固定链接|类别('
							+ record.data.categoryName + ')｜发表于'
							+ record.data.createTime + '&lt;/p>&lt;/div>';
					return 'x-grid3-row-collapsed';
				}
			},
			tbar : [{
				id : 'title-only',
				text : '只看标题',
				iconCls : 'detailChange',
				tooltip : '改变标题的显示方式~',
				handler : function(btn) {
					toggleDetails(btn);
				}
			}],
			bbar : com.faceye.ui.util.PaggingToolBar(15, store)
		});
		// 如果用户已登陆,为用户添加新增文章的权限.
		com.faceye.ui.UserLogin.is().load({
			callback : function(r, options, success) {
				if (r[0].data.login === 'yes') {
					var topToolBar = grid.getTopToolbar();
					topToolBar.add('-',{
						id : 'add',
						text : '撰写新日志',
						tooltip : '添加新日志~~',
						iconCls : 'add',
						handler : function(btn) {
							com.faceye.portal.portlet.ArticleEditForm.to();
						}
					});
//					topToolBar.doLayout();
				}
			}
		});
		// grid.setHeight(500);
		function toggleDetails(btn) {
			var view = grid.getView();
			if (view.showPreview) {
				btn.setText('显示摘要');
				view.showPreview = false;
			} else {
				view.showPreview = true;
				btn.setText('只看标题');
			}
			view.refresh();
		}
		portlet.add(grid);
		return portlet;
	}
};
com.faceye.portal.portlet.BlogUtil={
	reloadGridByCategory:function(id){
		var grid=Ext.getCmp('user-blog-grid');
		grid.store.load({
			params : {
				start : 0,
				limit : 15,
				categoryId:id
			}
		});
	}
};
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://EXT.group.javaeye.com/group/blog/210441#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Jul 2008 11:02:46 +0800</pubDate>
        <link>http://EXT.group.javaeye.com/group/blog/210441</link>
        <guid>http://EXT.group.javaeye.com/group/blog/210441</guid>
      </item>
      <item>
        <title>Ext中同时隐藏field和label的方法</title>
        <author>scnujie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://scnujie.javaeye.com">scnujie</a>&nbsp;
          链接：<a href="http://EXT.group.javaeye.com/group/blog/210215" style="color:red;">http://EXT.group.javaeye.com/group/blog/210215</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前几天搞了很久,查了很久的API也没搞定(因为API里面没有这种函数),反而是今天上它<br /><br />的官网去查别的资料的时候看到了一个网友也提出了同样的问题,所以就拿来用了,在此鸣谢那<br /><br />位老兄:<br /><br /><pre name="code" class="javascript">   
function hideField(field)
    {
       field.disable();// for validation
       field.hide();
       field.getEl().up('.x-form-item').setDisplayed(false); // hide label
    }

    function showField(field)
    {
       field.enable();
       field.show();
       field.getEl().up('.x-form-item').setDisplayed(true);// show label
    }
        this.userTypeField=new Ext.ux.EnumField({
                hiddenName:'userinfo.userType',
                fieldLabel:'用户类型',
                tableName:'userinfo',
                fieldName:'userType',
                allowBlank : false,
                listeners:{
                        select:function(){
                                var value = this.getValue();
                                //Ext.log(value);
                                if(value == '2')
                                {
                                        //formPanel.stationidField.setVisible(false); //这种方法只能隐藏field而不能隐藏field                                             //formPanel.hospitalidField.setVisible(true);   对应的label,用下面的方法则可以一起隐藏.
                                        
                                        hideField(formPanel.stationidField);
                                        showField(formPanel.hospitalidField);
                                }
                                if(value == '3')
                                {
                                        //formPanel.hospitalidField.setVisible(false);
                                        //formPanel.stationidField.setVisible(true);
                                        hideField(formPanel.hospitalidField);                
                                        showField(formPanel.stationidField);                        
                                }
                                if(value == '1' || value == '4')
                                {
                                        //formPanel.hospitalidField.setVisible(true);
                                        //formPanel.stationidField.setVisible(true);                                        
                                        showField(formPanel.hospitalidField);
                                        showField(formPanel.stationidField);
                                }
                        }
                }
        });</pre>
          <br/>
          <span style="color:red;">
            <a href="http://EXT.group.javaeye.com/group/blog/210215#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jul 2008 16:59:45 +0800</pubDate>
        <link>http://EXT.group.javaeye.com/group/blog/210215</link>
        <guid>http://EXT.group.javaeye.com/group/blog/210215</guid>
      </item>
      <item>
        <title>用Ext Scaffold插件打造Rails的Ext风格</title>
        <author>taito</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://taito.javaeye.com">taito</a>&nbsp;
          链接：<a href="http://EXT.group.javaeye.com/group/blog/208227" style="color:red;">http://EXT.group.javaeye.com/group/blog/208227</a>&nbsp;
          发表时间: 2008年06月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1、下载这个plugin<br /><br />script/plugin install http://rug-b.rubyforge.org/svn/ext_scaffold<br /><br />2、用这个插件自带的方法生成脚手架<br /><br />./script/generate ext_scaffold post title:string body:text published:boolean<br /><br />3、migrate 数据库<br /><br />4、启动项目运行即可<br /><br /><br />5、在自动生成的源文件里，已经添加了Ext风格的CRUD功能。如果想修改的话，可以直接打开文件修改。<br /><br />6、添加Model的验证，使用方法一样<br /><pre name="code" class="java">class Post &lt; ActiveRecord::Base
  validates_presence_of :title
end</pre>
          <br/>
          <span style="color:red;">
            <a href="http://EXT.group.javaeye.com/group/blog/208227#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 26 Jun 2008 14:20:16 +0800</pubDate>
        <link>http://EXT.group.javaeye.com/group/blog/208227</link>
        <guid>http://EXT.group.javaeye.com/group/blog/208227</guid>
      </item>
      <item>
        <title>Faceye基础版(开源)中对带复选框的树结构的处理</title>
        <author>ecsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsun.javaeye.com">ecsun</a>&nbsp;
          链接：<a href="http://EXT.group.javaeye.com/group/blog/205911" style="color:red;">http://EXT.group.javaeye.com/group/blog/205911</a>&nbsp;
          发表时间: 2008年06月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在Faceye基础版(开源)中,使用了大量的树结构,比如台台管理树,用户RSS订阅及分类树,用户博客分类对,网址导航分类树,开源项目分类树,博客管理树等大量的树形结构,甚至在用户授权,用户分组,资料分类等也都使用了树结构,树结构的处理,在Faceye中相比比较成熟，这些，是基于前期项目中对Struts-menu，Dtree等处理<br />关于Struts－Menu，Dtree的处理，在我早期的博客中都有描述．<br /><br />带有复选框的树，在实际的项目中，特别是授权结构中，有大量的使用．我们来看一下Faceye中如何处理这种带复选框的树形结构．<br /><br />首先，Faceye使用了Ext的树解决方案，所以，所有的数据结构，均转化为Ext中树解决方案的数据结构．在这里，我们可以很方便的把这一结构转化为其它树支持的数据结构，比如Strus-menu,dtreee等．<br />下面是对树完整的脚本处理代码．<br />［code]<br />/**<br />*RoleController<br />*  角色访问权限管理<br />*  管理角色对模块的访问权限<br />*  www.faceye.com网络支持系统<br />* 作者:宋海鹏 ecsun@sohu.com/myecsun@hotmail.com<br />*/<br />Ext.BLANK_IMAGE_URL = 'scripts/ext/resources/images/vista/s.gif';<br />com.faceye.compoents.core.security.RoleVisiteModelPermission={<br />	init:function(roleId){<br />    Ext.QuickTips.init();<br />    if(Ext.getCmp('tree')){<br />    	Ext.get('tree-viewer').remove(true);<br />//      Ext.getCmp('tree').destroy(this);<br />        Ext.getBody().createChild({tag:'div',id:'tree-viewer'});<br />    }<br />	var tree;<br />    var root;<br />//    if(!tree){<br />    var Tree = Ext.tree;<br />    tree = new Ext.tree.TreePanel(<br />    {<br />        el:'tree-viewer',<br />        id:'tree',<br />        autoScroll:true,<br />        animate:true,<br />        border:false,<br />        enableDD:true,<br />        containerScroll: true,<br />        rootVisible:false,<br />        loader: new Ext.tree.TreeLoader({<br />			dataUrl:'/faceye/treeAction.do?method=treeWithCheckBoxForPermission&roleId='+roleId<br />//			uiProviders:{<br />//                'col': Ext.ux.CheckColumnNodeUI<br />//            }<br />		})<br />//		columns:[{<br />////			header:'node',<br />//			dataIndex:'name'<br />//		}]<br />//		<br />    }<br />    );  <br />    //Defint node click event,when node is clicked,send data to inner 'div' and show data in<br />    // set the root node<br />    root = new Tree.AsyncTreeNode({<br />        text: 'Common Platform',<br />        draggable:false,<br />        id:'source',<br />        checked:true<br />//        uiProvider: Ext.tree.CheckboxNodeUI<br />    });<br />    tree.setRootNode(root);<br />    /**<br />    *Open node URL in a target contanier<br />    */<br />    //全部展开<br />    tree.expandAll();<br />    tree.on('checkchange',function(node){<br />    	if(!node.isLeaf()){<br />    		node.toggle();<br />    	}<br />        fireCheckChange(node);<br />//      node.cascade(function(n){<br />//		    		n.getUI().toggleCheck();<br />//				});<br />      <br />    });<br />    <br />    /**<br />     * 当fire checkchange时执行<br />     */<br />     function fireCheckChange(node){<br />     	if(node.getUI().isChecked()){<br />        	checkedChildrenNodes(node);<br />        	checkedParentNodes(node);<br />        }else{<br />          //取得当前节点的所有子节点,包括当前节点<br />          var allChildrenNodes=getAllChildrenNodes(node);<br />          //如果当前节点的所有子节点中,不存在checked=true的节点,那么将当前节点置为checked=false.<br />//          <br />          //如果当前节点有子节点,同时,当前节点checked=false,那么将其所有子节点置为checked=false<br />          for(var i=0;i&lt;allChildrenNodes.length;i++){<br />          	if(allChildrenNodes[i].getUI().isChecked()){<br />          		allChildrenNodes[i].getUI().toggleCheck();<br />          		<br />          	}<br />          }<br />          unCheckedParentNode(node);<br />        }<br />     }<br />    <br />    /**<br />     * 当点击父节点时<br />     * 将其所有子节点选中<br />     */<br />    function checkedChildrenNodes(node){<br />    	//取得本节点的所有子节点,子节点中包括其自己<br />        	var allChildrenNodes=getAllChildrenNodes(node);<br />        	if(allChildrenNodes.length>1){<br />        		for(var i=0;i&lt;allChildrenNodes.length;i++){<br />        			if(!allChildrenNodes[i].getUI().isChecked()){<br />        				allChildrenNodes[i].getUI().toggleCheck();<br />        			}<br />        		}<br />        	}<br />    }<br />    <br />    /**<br />     * 当当前子节点的父节点的所有子节点中<br />     * 不存在checked=true的子节点时,父节点不被选中<br />     */<br />     function unCheckedParentNode(currentChildNode){<br />     	if(currentChildNode.parentNode){<br />     		var parentNode=currentChildNode.parentNode;<br />     		//取得本父节点下所有被选中的子节点<br />     		//包括本父节点本身<br />     		var allCheckedChildrenNodes=getCheckedNodes(parentNode);<br />     		if(allCheckedChildrenNodes.length === 1){<br />     			parentNode.getUI().toggleCheck();<br />     			parentNode.attributes.checked=false;<br />     		}<br />     		if(parentNode.parentNode){<br />     			unCheckedParentNode(parentNode);<br />     		}<br />     	}<br />     }<br />    /**<br />     * 当点击子节点时<br />     * 将父节点选中<br />     */<br />    function checkedParentNodes(node){<br />    		//取得本节点的所有父节点,父节点中包括其自己<br />        	var allParentNodes=getAllParentNodes(node);<br />        	if(allParentNodes.length>1){<br />        		for(var i=0;i&lt;allParentNodes.length;i++){<br />        			if(!allParentNodes[i].getUI().isChecked()){<br />        				allParentNodes[i].getUI().toggleCheck();<br />        			}<br />        		}<br />        	}<br />    }<br />    /**<br />     * 取得所有子节点中checked 为true的节点ID<br />     * 包括本节点<br />     */<br />    function getCheckedNodesId(node){<br />    	var checked = [];<br />    	if( node.getUI().isChecked() || node.attributes.checked ) {<br />//    		alert('dfdf'+node.childNodes.length);<br />		checked.push(node.id);<br />		if( !node.isLeaf() ) {<br />			for(var i = 0; i &lt; node.childNodes.length; i++ ) {<br />				checked = checked.concat( getCheckedNodesId(node.childNodes[i]) );<br />			}<br />		}<br />	}<br />	return checked;<br />    };<br />    /**<br />     * 取得所有子节点中checked为true的节点(TreeNode)<br />     * 包括本节点<br />     */<br />    function getCheckedNodes(node){<br />    	var checked = [];<br />    	if( node.getUI().isChecked() ) {<br />    		   checked.push(node);<br />		if( !node.isLeaf() ) {<br />			for(var i = 0; i &lt; node.childNodes.length; i++ ) {<br />				checked = checked.concat( getCheckedNodes(node.childNodes[i]) );<br />			}<br />		}<br />	}<br />	return checked;<br />    };<br />    <br />    /**<br />     * 取得一个节点的所有子节点<br />     * 包括本节点<br />     */<br />     function getAllChildrenNodes(node){<br />     	var children = [];<br />     	children.push(node);<br />     	if(!node.isLeaf()){<br />     		for(var i=0;i&lt;node.childNodes.length;i++){<br />     			children = children.concat(getAllChildrenNodes(node.childNodes[i]));<br />     		}<br />     	}<br />     	return children;<br />     };<br />    /**<br />     * 取得一个节点的所有父节点<br />     * <br />     */<br />     function getAllParentNodes(node){<br />     	var parentNodes=[];<br />        parentNodes.push(node);<br />     	if(node.parentNode){<br />     		parentNodes = parentNodes.concat(getAllParentNodes(node.parentNode));<br />     	}<br />     	return parentNodes;<br />     };<br />     /**<br />      * 取得所有checked=true的节点ID<br />      */<br />      <br />      function getAllChecked(){<br />      	return getCheckedNodesId(root);<br />      }<br />     tree.on('click', function (node){ <br />      if(node.isLeaf()){ <br />//         Ext.get('content-iframe').dom.src = node.attributes.link+'&node='+node.id;<br />         //define grid;       <br />         return true;<br />     }else{<br />      /**<br />       *open node by single click,not double click.<br />       */<br />        node.toggle();<br />     }<br />    });<br />    <br />    tree.on('dblclick',function(node){<br />    	if(node.isLeaf()){<br />    		return true;<br />    	}else{<br />    		node.toggle();<br />    		fireCheckChange(node);<br />//    		this.fireEvent('checkchange', this.node, true);<br />    	}<br />    }); <br />    // render the tree<br />//    }<br />    <br />    tree.render();<br />    root.expand(); <br />		var win=new Ext.Window({<br />            			layout:'fit',<br />            			//模式窗口<br />            			modal:true,<br />            			width:450,<br />                        height:300,<br />                        closeAction:'hide',<br />                        plain: true,<br />//                        margins:'5 5 5 5',<br />                        <br />                        title:'为角色授权',<br />                        buttonAlign:'center',<br />                        buttons: [{<br />                           text:'确定',<br />                           scope:com.faceye.compoents.core.security.SelectRoles,<br />                           type:'submit',<br />                           disabled:false,<br />                           handler:function(){<br />                            var checked=getAllChecked().join(',');<br />                             Ext.Ajax.request({<br />            			     url:'/faceye/roleAction.do?method=permission',<br />            			     failure:function(){<br />            				 Ext.Msg.alert('角色授权','角色授权失败！');<br />            				 win.hide();<br />            			    },<br />            			   success:function(){<br />            				 Ext.Msg.alert('角色授权','角色授权成功！');<br />            				 win.hide();<br />            			    },<br />            			   params:{<br />            				treeIds:checked,<br />            				roleId:roleId<br />            			    }<br />            		       });<br />                            <br />                           }<br />                              },{<br />                           text: '放弃',<br />                           handler: function(){<br />//                           	　 formItemSelector.getForm().reset();<br />                              if(win.getComponent('tree')){<br />//                              	Ext.get('tree-viewer').remove();<br />//                              	win.destroy();<br />//                                win.remove(tree);<br />                                                 <br />                              }<br />                              win.hide();<br />//                              win.disable();<br />//                              tree.disable();<br />                               }<br />                          }<br />                          ]<br />            		});<br />            		<br />			win.add(tree);<br />			win.show();<br />	}<br />};<br /><br />[/code]<br /><br />在带有复选框的树形结构处理中，主要需要解决这么几个问题：<br />１.我们的树，是无限级别的<br />２.当选中父节点时，其所有子节点，包括直接子节点和间接子节点，一并选中<br />３.当一个节点的所有子节点被取消选中状态时，其父节点要处于未被选中的状态．<br /><br />因为树向来是子子孙孙无穷尽的一个东西，所以在这里，需要用到比较多的递归处理，不管是在脚本方面，还是在后台代码里，都需要用到一些递归处理，比如我们所提供的方法中：<br />[code]
/**
     * 取得一个节点的所有父节点
     * 
     */
     function getAllParentNodes(node){
     	var parentNodes=[];
        parentNodes.push(node);
     	if(node.parentNode){
     		parentNodes = parentNodes.concat(getAllParentNodes(node.parentNode));
     	}
     	return parentNodes;
     };
[/code]<br />在这里，提供了这样一样功能，既：取得当前点击（选中）节点的所有父节点，这些父节点中，包括直接父节点和间接父节点，也就是说，在这里，会取得当前选中节点的父亲节点，父亲节点的父亲节点....一直到根节点为止．<br /><br />类似的方法有：<br />[code]
 /**
     * 取得一个节点的所有子节点
     * 包括本节点
     */
     function getAllChildrenNodes(node){
     	var children = [];
     	children.push(node);
     	if(!node.isLeaf()){
     		for(var i=0;i&lt;node.childNodes.length;i++){
     			children = children.concat(getAllChildrenNodes(node.childNodes[i]));
     		}
     	}
     	return children;
     };
[/code]<br /><br />这是取得一个节点所有子节点的方法．处理跟上面类似．<br /><br />通过以上这些处理，我们就可以很方便的处理带复选框的树形结构．<br />而在这里，我们最终真正关心的，是那些被我们选中的节点，于是，我们需要取得所有被选中的节点，在这里我们需要使用另外一个方法：<br />［code]<br />/**<br />     * 取得所有子节点中checked为true的节点(TreeNode)<br />     * 包括本节点<br />     */<br />    function getCheckedNodes(node){<br />    	var checked = [];<br />    	if( node.getUI().isChecked() ) {<br />    		   checked.push(node);<br />		if( !node.isLeaf() ) {<br />			for(var i = 0; i &lt; node.childNodes.length; i++ ) {<br />				checked = checked.concat( getCheckedNodes(node.childNodes[i]) );<br />			}<br />		}<br />	}<br />	return checked;<br />    };<br />[/code]<br />在这里，我们同样使用到了递归．<br /><br />同时，我们可以看到，在生成树的时候，我们使用了这样一个loader:<br />［code]<br />loader: new Ext.tree.TreeLoader({<br />			dataUrl:'/faceye/treeAction.do?method=treeWithCheckBoxForPermission&roleId='+roleId<br />//			uiProviders:{<br />//                'col': Ext.ux.CheckColumnNodeUI<br />//            }<br />		})<br />[/code]<br />这是我们从后台取数据的方法，同时，要在前台加入check column<br />要加入check column,我们需要看以下代码：<br />在方法：treeWithCheckBoxForPermission中，我们做了以下操作：<br />［code]<br />/**<br />	 * 构造带有checkbox的tree,为角色进行节点授权做准备<br />	 * @param mapping<br />	 * @param form<br />	 * @param request<br />	 * @param response<br />	 * @return<br />	 */<br />	public ActionForward treeWithCheckBoxForPermission(ActionMapping mapping, ActionForm form,<br />			HttpServletRequest request, HttpServletResponse response) {<br />		String json = "";<br />		// JSONArray ja=new JSONArray();<br />	    String roleId=this.getHttp().getParameter(request, "roleId");<br />		if (super.getHttp().getParameter(request, "node").equals("source")) {<br />			json = this.getTreeService().treeJSONWithCheckBox(roleId);<br />		} else {<br />			String currentNode = super.getHttp().getParameter(request, "node");<br />			json = this.getTreeService().treeJSONWithCheckBox(<br />					this.getTreeService().getTransedTrees(),<br />					currentNode,roleId);<br />		}<br />		super.jsonPrint(response, json);<br />		// return mapping.findForward("system.admin.face");<br />		return null;<br />	}<br />[/code]<br />在这里，我们主要对原始的树形结构进行了处理，在每个节点上面，打上了checkbox标识：<br />[code]
public String treeJSONWithCheckBox(Serializable roleId) {
		// TODO Auto-generated method stub
		try {
			List trees = this.getTransedTrees();
			String result = this.treeJSONWithCheckBox(trees, roleId);
			return result;
		} catch (Exception e) {
			log.info(">>>>faceye error in method:treeJSON() is" + e.toString());
			return null;
		}

	}
[/code]<br /><br />这里最主要的一个方法是：<br />[code]
public String treeJSONWithCheckBox(List source, Serializable roleId) {
		// TODO Auto-generated method stub
		if (source == null || source.isEmpty()) {
			return null;
		}
		List roots = this.getRoots(source);
		Iterator it = roots.iterator();
		StringBuffer json = new StringBuffer();
		json.append("[");
		while (it.hasNext()) {
			Map item = (Map) it.next();
			json.append(this.transTree2JSONWithCheckBox(source, item, roleId));
			json.append(",");

		}
		json.deleteCharAt(json.lastIndexOf(","));
		json.append("]");
		return json.toString();
	}
[/code]<br /><br />在这里，我们调用了最终方法：<br />［code]<br />transTree2JSONWithCheckBox<br />[/code]<br />对树结构进行最终处理<br />［code]<br />private String transTree2JSONWithCheckBox(List source, Map tree,<br />			Serializable roleId) {<br />		StringBuffer json = new StringBuffer();<br />		json.append("{");<br />		json.append("\"text\":");<br />		json.append("\"");<br />		json.append(tree.get(StringPool.TREE_NAME).toString());<br />		json.append("\"");<br />		json.append(",");<br />		json.append("\"id\":");<br />		json.append("\"");<br />		json.append(tree.get(StringPool.TREE_ID).toString());<br />		json.append("\"");<br />		json.append(",");<br />		json.append("\"leaf\":");<br />		if (this<br />				.isHaveChildren(source, tree.get(StringPool.TREE_ID).toString())) {<br />			json.append("false");<br />		} else {<br />			json.append("true");<br />		}<br />		json.append(",");<br />		json.append("\"cls\":");<br />		json.append("\"file\"");<br />		if (tree.containsKey(StringPool.TREE_ACTION)<br />				&& null != tree.get(StringPool.TREE_ACTION)) {<br />			json.append(",");<br />			json.append("\"link\":");<br />			json.append("\"");<br />			json.append(tree.get(StringPool.TREE_ACTION).toString());<br />			json.append("\"");<br />		} else {<br />			json.append(",");<br />			json.append("\"link\":");<br />			json.append("\"");<br />			json.append("#");<br />			json.append("\"");<br />		}<br /><br />		json.append(",");<br />		json.append("\"checked\":");<br />		// json.append("true");<br />		json.append(this.isNodeChecked(tree.get(StringPool.TREE_ID).toString(),<br />				roleId));<br /><br />		json.append("}");<br />		return json.toString();<br />	}<br />[/code]<br />可以看到，我们在这里，加入了：[code]checked:true[/code]这样的属性．<br />至此，可以看到完整的带有复选框的树形结构的处理流程，完整代码，请从　http://code.google.com/p/faceye下载．
          <br/>
          <span style="color:red;">
            <a href="http://EXT.group.javaeye.com/group/blog/205911#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 19 Jun 2008 17:36:50 +0800</pubDate>
        <link>http://EXT.group.javaeye.com/group/blog/205911</link>
        <guid>http://EXT.group.javaeye.com/group/blog/205911</guid>
      </item>
      <item>
        <title>Faceye基础版(开源)中对JSON数据的处理.</title>
        <author>ecsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsun.javaeye.com">ecsun</a>&nbsp;
          链接：<a href="http://EXT.group.javaeye.com/group/blog/205882" style="color:red;">http://EXT.group.javaeye.com/group/blog/205882</a>&nbsp;
          发表时间: 2008年06月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Faceye基础版下载:http://code.google.com/p/faceye/downloads/list <br /><br />Faceye基础版中,对JSON数据进行了统一的处理,使得用户在操作时可以不用关注数据的细节问题,直接使用JSON格式的数据.<br /><br />比如在Action中,当要输出JSON数据时,只需要:<br /><br /><pre name="code" class="java">
/**
	 * 博客点击排行榜
	 */
	
	public ActionForward blogClickOrderList(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response){
		String timePeriod=this.get("timePeriod", request);
		PaginationSupport ps=this.getBlogService().getPageOfBlogClickHistoryOrderList(timePeriod, this.getHttp().getCurrentIndex(request), this.getHttp().getCurrentPageSize(request));
		String json=ps.json();
		this.jsonPrint(response, json);
		return null;
	}
</pre><br /><br />在这里面,我们只使用了一句:<br /><pre name="code" class="java">
ps.json();
</pre><br />就完成了json格式数据的转化,其中,PaginationSupport 使用的Robin早期写的一个Hibernate分页对像,对于JSON数据的输出,我们只需要使用:<br /><pre name="code" class="java">
this.jsonPrint(response, json);
</pre><br /><br />对于json数据的转化,我们完全在后台完成.<br />以下是取得分页对像的代码:<br /><pre name="code" class="java">
public PaginationSupport getPageOfBlogClickHistoryOrderList(
			String periodTime, int startIndex, int pageSize) {
		// TODO Auto-generated method stub
		return this.getBlogClickHistoryDao().getBlogClickOrderList(periodTime, pageSize, startIndex);
	}
</pre><br />在这里,调用DAO进行简单的数据查询.<br /><pre name="code" class="java">
/**
	 * 点击量包括访问博客首页的量，访问单篇文章的量，其中，访问者包括FaceYe网友（既未注册用户) 同时，包括已注册用户.
	 */
	public PaginationSupport getBlogClickOrderList(String timePeriod,
			int pageSize, int startIndex) {
		if (StringUtils.isEmpty(timePeriod)) {
			timePeriod = StringPool.BLOG_PERIOD_LIST_ORDER_ALL;
		}
		Date[] date = this.getDate(timePeriod);
		String sql = "";
		if (null != date) {
			String start = DateUtil.parseDate(date[0], null);
			String end = DateUtil.parseDate(date[1], null);
			sql = "select * from (select  sum(xx.blog_click_count) as 'blog_click_count',xx.portal_id as 'portal_id', xx.user_id as 'user_id', xx.username as 'username' from ("
					+ "select  sum(x.article_click_count) as 'blog_click_count' ,x.portal_id as 'portal_id',x.user_id as 'user_id',x.username as 'username'"
					+ " from "
					+ "(select p.id as 'portal_id',"
					+ "uba.name as 'article_name',"
					+ "count(ubac.article_id) as 'article_click_count',"
					+ "ubac.article_id   as 'article_id' ,u.id as 'user_id',u.name as 'username'"
					+ " from "
					+ "user_blog_article_click_count ubac,"
					+ "user_blog_article uba,"
					+ "user_blog_article_category ubc,"
					+ "sys_portal_container p,"
					+ "sys_user u"
					+ " where "
					+ "ubc.portalContainer_id=p.id "
					+ "and "
					+ "uba.id=ubac.article_id"
					+ " and "
					+ "uba.articleCategory_id=ubc.id "
					+ "and "
					+ "p.user_id=u.id"
					+ " and ubac.createTime between '"
					+ start
					+ "' and '"
					+ end
					+ "' group by ubac.article_id "
					+ " order by count(ubac.article_id) desc) x "
					+ " group by x.portal_id "
					+

					"union "
					+

					"select  count(ubch.id) as 'blog_click_count',p.id as 'portal_id',u.id as 'user_id',u.name as 'username' from "
					+ "user_blog_click_history ubch,"
					+ "sys_portal_container p,"
					+ "sys_user u"
					+ " where ubch.portalContainer_id =p.id and p.user_id=u.id "
					+ " and ubch.createTime between '"
					+ start
					+ "' and '"
					+ end + "' group by portal_id " +

					") xx group by xx.portal_id order by blog_click_count desc) xxx";

		} else {
			sql = "select * from (select  sum(xx.blog_click_count) as 'blog_click_count',xx.portal_id as 'portal_id', xx.user_id as 'user_id', xx.username as 'username' from ("
					+ "select  sum(x.article_click_count) as 'blog_click_count' ,x.portal_id as 'portal_id',x.user_id as 'user_id',x.username as 'username'"
					+ " from "
					+ "(select p.id as 'portal_id',"
					+ "uba.name as 'article_name',"
					+ "count(ubac.article_id) as 'article_click_count',"
					+ "ubac.article_id   as 'article_id' ,u.id as 'user_id',u.name as 'username'"
					+ " from "
					+ "user_blog_article_click_count ubac,"
					+ "user_blog_article uba,"
					+ "user_blog_article_category ubc,"
					+ "sys_portal_container p,"
					+ "sys_user u"
					+ " where "
					+ "ubc.portalContainer_id=p.id "
					+ "and "
					+ "uba.id=ubac.article_id"
					+ " and "
					+ "uba.articleCategory_id=ubc.id "
					+ "and "
					+ "p.user_id=u.id"
					+ " group by ubac.article_id "
					+ " order by count(ubac.article_id) desc) x "
					+ " group by x.portal_id "
					+

					"union "
					+

					"select  count(ubch.id) as 'blog_click_count',p.id as 'portal_id',u.id as 'user_id',u.name as 'username' from "
					+ "user_blog_click_history ubch,"
					+ "sys_portal_container p,"
					+ "sys_user u"
					+ " where ubch.portalContainer_id =p.id and p.user_id=u.id group by portal_id"
					+

					") xx group by xx.portal_id order by blog_click_count desc) xxx";
		}
		return this.getBaseJdbcDao().getPage(sql, pageSize, startIndex);
	}
</pre><br /><br />至此,返回完整的数据分页对像.<br /><br />分页对像代码如下:<br /><pre name="code" class="java">
package com.faceye.core.util.helper;

import java.util.List;

import org.apache.commons.collections.CollectionUtils;

public class PaginationSupport {
	public final static int PAGESIZE = 15;

	private int pageSize = PAGESIZE;

	private List items;

	private int totalCount;

	private int[] indexes = new int[0];

	private int startIndex = 0;

	public PaginationSupport(List items) {
		setItems(items);
		setPageSize(items.size());
		setTotalCount(items.size());
		setStartIndex(0);
	}

	public PaginationSupport(List items, int totalCount) {
		setPageSize(PAGESIZE);
		setTotalCount(totalCount);
		setItems(items);
		setStartIndex(0);
	}

	public PaginationSupport(List items, int totalCount, int startIndex) {
		setPageSize(PAGESIZE);
		setTotalCount(totalCount);
		setItems(items);
		setStartIndex(startIndex);
	}

	public PaginationSupport(List items, int totalCount, int pageSize,
			int startIndex) {
		setPageSize(pageSize);
		setTotalCount(totalCount);
		setItems(items);
		setStartIndex(startIndex);
	}

	public List getItems() {
		return items;
	}

	public void setItems(List items) {
		this.items = items;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public int getTotalCount() {
		return totalCount;
	}

	public void setTotalCount(int totalCount) {
		if (totalCount > 0) {
			this.totalCount = totalCount;
			int count = totalCount / pageSize;
			if (totalCount % pageSize > 0) {
				count++;
			}
			indexes = new int[count];
			for (int i = 0; i &lt; count; i++) {
				indexes[i] = pageSize * i;
			}
		} else {
			this.totalCount = 0;
		}
	}

	public int[] getIndexes() {
		return indexes;
	}

	public void setIndexes(int[] indexes) {
		this.indexes = indexes;
	}

	public int getStartIndex() {
		return startIndex;
	}

	public void setStartIndex(int startIndex) {
		if (totalCount &lt;= 0) {
			this.startIndex = 0;
		} else if (startIndex >= totalCount) {
			this.startIndex = indexes[indexes.length - 1];
		} else if (startIndex &lt; 0) {
			this.startIndex = 0;
		} else {
			this.startIndex = indexes[startIndex / pageSize];
		}
	}

	public int getNextIndex() {
		int nextIndex = getStartIndex() + pageSize;
		if (nextIndex >= totalCount) {
			return getStartIndex();
		} else {
			return nextIndex;
		}
	}

	public int getPreviousIndex() {
		int previousIndex = getStartIndex() - pageSize;
		if (previousIndex &lt; 0) {
			return 0;
		} else {
			return previousIndex;
		}
	}

	public List transItems() {
		return CollectionUtil.getCollectionUtil().transList(this.getItems());
	}

	/**
	 * 将分页像中的数据转化为标准的JSON分页结构
	 * 
	 * @return
	 */
	public String json() {
		if (CollectionUtils.isNotEmpty(this.getItems())) {
			return JSONUtil.pageJson(this.getTotalCount(), CollectionUtil
					.getCollectionUtil().list2Json(this.transItems()));
		} else {
			return null;
		}
	}

}

</pre><br /><br />在分页对像的json()方法中,我们完成了从各式各样数据到json数据的转化工作.<br />在这里,我们主要使用了一个list2json()方法.如下:<br /><br /><pre name="code" class="java">
/**
	 * 将一个结果集转化为json数据结构
	 * 
	 * @param source
	 * @return
	 */
	public String list2Json(List source) {
		try {
			if (null == source || source.isEmpty()) {
				return null;
			}
			StringBuffer json = null;
			if (source.get(0) instanceof Map) {
				json = new StringBuffer(JSONArray.fromObject(source).toString());
			} else {
				json = new StringBuffer(StringPool.CHARACTER_MIDDLE_LEFT);
				for (int i = 0; i &lt; source.size(); i++) {
					Object item = source.get(i);
					if (item instanceof BaseObject) {
						Class clazz = item.getClass();
						if (ClassUtils.hasMethod(clazz,
								StringPool.REFLECTION_METHOD_JSON, null)) {
							String temp=ReflectionUtils.invokeMethod(
									ClassUtils.getMethodIfAvailable(clazz,
											StringPool.REFLECTION_METHOD_JSON,
											null), item).toString();
							json.append(temp);
						} else {
							json.append(JSONArray.fromObject(item).toString());
						}
					} else if (item instanceof Map) {
						json.append(JSONArray.fromObject(item).toString());
					}
					json.append(StringPool.CHARACTER_COMMA);
				}
				json.deleteCharAt(json.lastIndexOf(StringPool.CHARACTER_COMMA));
				json.append(StringPool.CHARACTER_MIDDLE_RIGHT);
			}
			return json.toString();
		} catch (Exception e) {
			return null;
		}
	}
</pre><br /><br />在这里,如果我们使用的是Hiberante的实体查询,那么要求我们的实体中有<br /><pre name="code" class="java">
public Stirng json(){...}
</pre><br />或<br /><pre name="code" class="java">
public Map map(){...}
</pre><br />方法<br />这样<br />如果不是使用Hiberante的实体查询,那我们不使用这两个方法,直接使用JSONArray对对像进行转化.<br />以上两个方法的示例为:<br /><pre name="code" class="java">
public Map map(){
		Map map=new HashMap();
		map.put("id", this.getId());
		map.put("name", this.getName());
		map.put("content", this.getContent());
		SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		map.put("createTime", dateFormat.format(this.getCreateTime()));
		map.put("categoryId", this.getArticleCategory().getId());
		map.put("categoryName", this.getArticleCategory().getName());
		map.put("discusCount", this.getDiscusCount());
		map.put("clickCount", this.getClickCount());
		return map;
	}
	public String json(){
		StringBuffer sb=new StringBuffer("{");
		sb.append("\"id\":");
		sb.append("\"");
		sb.append(this.getId());
		sb.append("\"");
		sb.append(",");
		sb.append("\"name\":");
		sb.append("\"");
		sb.append(this.getName());
		sb.append("\"");
		sb.append(",");
		sb.append("\"content\":");
		sb.append("\"");
		sb.append(this.getContent());
		sb.append("\"");
		sb.append(",");
		sb.append("\"createTime\":");
		sb.append("\"");
		sb.append(this.getCreateTime());
		sb.append("\"");
		sb.append(",");
		sb.append("\"categoryId\":");
		sb.append("\"");
		sb.append(this.getArticleCategory().getId());
		sb.append("\"");
		sb.append(",");
		sb.append("\"categoryName\":");
		sb.append("\"");
		sb.append(this.getArticleCategory().getName());
		sb.append("\"");
		sb.append("}");
		return sb.toString();
	}
</pre><br /><br />至此,便是系统内对json 完整处理.而在系统的其它地方,不会存在对JSON数据的处理
          <br/>
          <span style="color:red;">
            <a href="http://EXT.group.javaeye.com/group/blog/205882#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 19 Jun 2008 16:50:45 +0800</pubDate>
        <link>http://EXT.group.javaeye.com/group/blog/205882</link>
        <guid>http://EXT.group.javaeye.com/group/blog/205882</guid>
      </item>
      <item>
        <title>关于：Extjs中，请求调用velocity *.vm文件 问题？</title>
        <author>dengyigang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengyigang.javaeye.com">dengyigang</a>&nbsp;
          链接：<a href="http://EXT.group.javaeye.com/group/blog/204037" style="color:red;">http://EXT.group.javaeye.com/group/blog/204037</a>&nbsp;
          发表时间: 2008年06月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我的邮箱：dengyigang@126.com <br /><br />在treeTest.htm 文件中， <br /><br />MainPanel = function() { <br />this.urls=[]; <br />this.homePage="pages/testvm.vm";//关键的调用，嵌入到extjs框架中。 <br /><br /><br />this.currentUrl=this.homePage; <br />this.openTab = function(panel, id) { <br />var o = (typeof panel == "string" ? panel : id || panel.id); <br />var tab = this.getComponent(o); <br />if (tab) { <br />this.setActiveTab(tab); <br />} else if(typeof panel!="string"){ <br />panel.id = o; <br />var p = this.add(panel); <br />this.setActiveTab(p); <br />} <br />}; <br />。。。。。。。。 <br /><br /><br /><br />testvm.vm 定义如下： <br /><br /><br />&lt;div id="center2"> <br /><br /><br />&lt;h1>书的详细描述&lt;/h1> <br />&lt;a href="$link.setForward("searchEntry")">Search again&lt;/a> <br /><br />&lt;h3>$book.title&lt;/h3> <br /><br />&lt;b>ISBN:&lt;/b>$book.isbn&lt;br> <br />&lt;b>Title:&lt;/b>$book.title&lt;br> <br />&lt;b>Author:&lt;/b>$book.author&lt;br> <br />&lt;b>Price:&lt;/b>$book.price&lt;br> <br />&lt;b>No Pages:&lt;/b>$book.pages&lt;br> <br />&lt;b>Description:&lt;/b>$book.description&lt;br> <br />&lt;b>Publisher:&lt;/b>$book.publisher&lt;br> <br />&lt;/div> <br /><br /><br /><br />但是，部署后，没有数据返回。运行报以下错误： <br />2008-6-16 11:01:06 org.apache.catalina.core.ApplicationContext log <br />信息: Velocity [info] ResourceManager : found /pages/testvm.vm with loader org.apache.velocity.tools.view.servlet.WebappLoader <br />2008-6-16 11:01:06 org.apache.catalina.core.ApplicationContext log <br />信息: Velocity [warn] org.apache.velocity.runtime.exception.ReferenceException: reference : template = /pages/testvm.vm [line 17,column 21] : $book.title is not a valid reference. <br />2008-6-16 11:01:06 org.apache.catalina.core.ApplicationContext log <br />信息: Velocity [warn] org.apache.velocity.runtime.exception.ReferenceException: reference : template = /pages/testvm.vm [line 19,column 29] : $book.isbn is not a valid reference. <br />2008-6-16 11:01:06 org.apache.catalina.core.ApplicationContext log <br />信息: Velocity [warn] org.apache.velocity.runtime.exception.ReferenceException: reference : template = /pages/testvm.vm [line 20,column 30] : $book.title is not a valid reference. <br />2008-6-16 11:01:06 org.apache.catalina.core.ApplicationContext log <br />信息: Velocity [warn] org.apache.velocity.runtime.exception.ReferenceException: reference : template = /pages/testvm.vm [line 21,column 31] : $book.author is not a valid reference. <br />2008-6-16 11:01:06 org.apache.catalina.core.ApplicationContext log <br />信息: Velocity [warn] org.apache.velocity.runtime.exception.ReferenceException: reference : template = /pages/testvm.vm [line 22,column 30] : $book.price is not a valid reference. <br />2008-6-16 11:01:06 org.apache.catalina.core.ApplicationContext log <br />信息: Velocity [warn] org.apache.velocity.runtime.exception.ReferenceException: reference : template = /pages/testvm.vm [line 23,column 33] : $book.pages is not a valid reference. <br />2008-6-16 11:01:06 org.apache.catalina.core.ApplicationContext log <br />信息: Velocity [warn] org.apache.velocity.runtime.exception.ReferenceException: reference : template = /pages/testvm.vm [line 24,column 36] : $book.description is not a valid reference. <br />2008-6-16 11:01:06 org.apache.catalina.core.ApplicationContext log <br />信息: Velocity [warn] org.apache.velocity.runtime.exception.ReferenceException: reference : template = /pages/testvm.vm [line 25,column 34] : $book.publisher is not a valid reference. <br /><br /><br />不知道，为什么找不到路径，还请用的朋友，指点一下，谢谢：）
          <br/>
          <span style="color:red;">
            <a href="http://EXT.group.javaeye.com/group/blog/204037#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 16 Jun 2008 11:26:21 +0800</pubDate>
        <link>http://EXT.group.javaeye.com/group/blog/204037</link>
        <guid>http://EXT.group.javaeye.com/group/blog/204037</guid>
      </item>
      <item>
        <title>算是总结，也算是感悟</title>
        <author>yongtree</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yongtree.javaeye.com">yongtree</a>&nbsp;
          链接：<a href="http://EXT.group.javaeye.com/group/blog/203879" style="color:red;">http://EXT.group.javaeye.com/group/blog/203879</a>&nbsp;
          发表时间: 2008年06月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp; 最近工作压力挺大的，昨天又是一个人在公司加了半天班。发现好长时间没有写日志了，更别说写一些文人墨客才摆弄的文字了。下午打完球，是发泄，也是放松，回来也不再过多地为工作而烦恼了，写点东西算是对这段时间工作、生活的总结，也谈一下对生活的感受吧。<br />&nbsp;&nbsp;&nbsp; 项目已经到后期了，而且离上线的日子越来越近，压力也越来越大。自己开发的工作流部分作为系统中最重要的部分，一直是领导最为关注的部分。这样的一个重要的工作让一个新人来做，非常佩服领导的勇气。由于这个工作也是自己自告奋勇，自己也多次提过要做有成就感的工作，也感谢领导对我的信任，让我在一毕业就从事如此有成就感的工作。<br />&nbsp;&nbsp;&nbsp; 昨天自己写了半天的程序，实现了工作项的退回功能，但是仍然没有时间实现我计划中的另外两个功能。不过到现在工作流的功能已经实现了很大一部分了，回首这半年的历程，真是充满了艰辛，当然从中也体会出无比的快乐。自从接手这个项目，就像邓小平开创具有中国特色的社会主义一样，是摸着石头过河，不知道未来会碰到多少的困难，不知道这个项目到最后是不是会由于自己的能力有限而夭折。半年的时间，经历了对工作流理论的学习，对业内比较成熟的工作流系统的调研，对工作流引擎和系统的设计，再到现在一步步的实现这个系统，一路走来自己的确学到了不少的东西，也经历人生中一个非常重要的过程。自己是一种追求完美主义的人，虽然自己非常的不完美，甚至是有缺陷，但是自己始终不想降低对自己要求，在工作流的开发过程中，自己也是一次次的自我否定和自我完善。正是由于自己的自己的这种性格和追求，也让这个工作流具有了图形化设计功能，并采用Ext这种非常新的技术来提升用户的使用体验。学习Ext的过程的确是一种辛苦的过程，从对JS的不熟悉到现在能熟练的使用js开发出那绚丽的系统，多少个日日夜夜的通宵达旦的学习，有时熬夜都成为一种习惯。现在工作流已经具备的功能：1、后台工作流的管理，全部采用EXTJS编写。2、图形化的流程设计器。3、流程权限的设定。4、工作项的办理。5、工作项的退回。6、待办、已办列表。工作流未完成的工作还有很多，比如流程的自动路由，工作项的多人会签、传阅等功能，我会在后续的版本中完善这些功能。<br />&nbsp;&nbsp;&nbsp; 这两天和同事、领导谈到部门的发展，谈到未来要共同开创的事业，心中真的无比的激动。我是一个对物质生活看得很淡的人，自己在乎的是自己的名誉、一种理想中的生活。用别人的话说，是一个活在梦中的人。也许是吧，庆幸的是在我们这个团队中我也找到几个活在梦中的人，为了梦想而放弃了太多太多，也坚持了太多太多，和这样的人共事，的确是一种愉快的经历。工作在一个有远大梦想的团队里，我的心胸也无比的远大开阔，但愿我们的团队能坚持这样远大的梦想，一起开创伟大的事业，否则我也许会痛苦的离开。和朋友谈论大师是怎样炼成的，我们的共识就是他们具备一个非常地品质--忍耐。要想成为大师，成为顶尖的高手，一定要耐得住生活带来的压力，家庭带来的压力，工作的压力；耐得住寂寞，靠得住时间，坚持住梦想并坚定不移的走下去。好在现在还年轻，除了工作的压力，自己的压力不大，那就更应该专心的学习，去拥有和开创一个作为男人应该具备的第一要素：事业。<br />&nbsp;&nbsp;&nbsp; 不知不觉已经接近凌晨了，该睡觉了，明天还有更多的困难等着自己去克服。写了这么多，算是总结，也算是是感想吧。只是希望自己在未来的路上，多一些坚持，少一些急功近利；多一些努力，少一些浮夸。公司开发的项目准备开源推广，自己写的那个《我与EXTJS有个约会》也可以直接使用项目中的代码和例子，希望自己能坚持写下去，算是学习EXTJS的心得，顺便为我们的产品做个宣传。好了，睡了，祝朋友们梦想成真。</p>
          <br/>
          <span style="color:red;">
            <a href="http://EXT.group.javaeye.com/group/blog/203879#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 15 Jun 2008 23:21:27 +0800</pubDate>
        <link>http://EXT.group.javaeye.com/group/blog/203879</link>
        <guid>http://EXT.group.javaeye.com/group/blog/203879</guid>
      </item>
      <item>
        <title>ext grid 数据库分页实现</title>
        <author>gavin213</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gavin213.javaeye.com">gavin213</a>&nbsp;
          链接：<a href="http://EXT.group.javaeye.com/group/blog/201891" style="color:red;">http://EXT.group.javaeye.com/group/blog/201891</a>&nbsp;
          发表时间: 2008年06月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          看了robbin 关于hibernate 分页的老帖(http://www.javaeye.com/topic/261)，把ext grid 的数据库分页整了下，完全满足需要，呵呵，贴出代码与大家共同学习下：<br />  DAO代码：<br />  <pre name="code" class="java">
  /**
	   * 获取符合查询条件的记录总数
	   * @param detachedCriteria  hibernate Criteria 查询对象，由service组装
	   * @return
	   */
  public Long getRecordCount(final DetachedCriteria detachedCriteria) {
		return (Long) getHibernateTemplate().execute(new HibernateCallback() {
			public Object doInHibernate(Session session)
					throws HibernateException {
				Criteria criteria = detachedCriteria
						.getExecutableCriteria(session);
				long count = Long.parseLong((criteria.setProjection(Projections
						.rowCount()).uniqueResult()).toString());
				criteria.setProjection(null);
				return Long.valueOf("" + count);
			}
		}, true);
	}
/**
	   * 获取符合条件的查询记录
	   * @param detachedCriteria
	   * @param startResult
	   * @param limitResult
	   * @return
	   */

	public List listByConditions(final DetachedCriteria detachedCriteria,
			final int startResult, final int limitResult) {

		return (List) getHibernateTemplate().execute(new HibernateCallback() {
			public Object doInHibernate(Session session)
					throws HibernateException {
				Criteria criteria = detachedCriteria
						.getExecutableCriteria(session);
				criteria.setFirstResult(startResult);
				criteria.setMaxResults(limitResult);
				return criteria.list();
			}
		}, true);
	} 
  </pre><br />服务层：<br /><pre name="code" class="java">
/**
	 * 获取所有日志列表
     * @param startResult   查询记录起点
     * @param limitResult   简要列表每页最大记录数
     * @param sortRecord    简要列表排序字段名
     * @param dirRecord     简要列表排序类型 DESE/ASC
	 * @return
	 */
public JSONArray getAllLogs(String startResult,String limitResult,
			  String sortRecord,String dirRecord) {
		
		try {
			DetachedCriteria detachedCriteria = DetachedCriteria.forClass(TDeasLog.class);  
			if(dirRecord.equals("ASC"))
				detachedCriteria.addOrder(Order.asc(sortRecord));
			else
				detachedCriteria.addOrder(Order.desc(sortRecord));
			  
			Long count = logDAO.getRecordCount(detachedCriteria);//获取符合条件的记录总数	  
			  
			List list = logDAO.listByConditions(detachedCriteria, Integer.parseInt(startResult), 
					  Integer.parseInt(limitResult));//获取符合条件记录
			if(list.size()>0){
				List jsonlist = new ArrayList();
				Iterator it = list.iterator();
				while (it.hasNext()){
					Log log = (Log )it.next();
					Map map = new HashMap();
					map.put("taskId", log .getTaskId());
					map.put("rwfssj", log .getRwfssj());
					map.put("rwjssj", log .getRwjssj());
							....													
					jsonlist.add(map);				
				}
				Map m = new  HashMap();
				m.put("results", count.toString());
				m.put("rows", jsonlist);
				
				JSONArray jsonArray = JSONArray.fromObject(m);
				return jsonArray;  
			}else
				return null;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
</pre><br /><br />  action 代码：<br /><br /><pre name="code" class="java"> 
public ActionForward getAllLogs(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		
		String startResult = request.getParameter("start");
		String limitResult = request.getParameter("limit");
		String sortRecord = request.getParameter("sort");
		String dirRecord = request.getParameter("dir");
		
		JSONArray jsonArray = this.getLogService().getAllLogs(startResult,limitResult,sortRecord,dirRecord);		
		
		if(jsonArray != null){
			String jsonstr = jsonArray.toString();
			//去除JSON对象前的[]  
			String json = jsonstr.substring(1, jsonstr.length()-1);			
			response.setContentType("text/json; charset=utf-8"); 
			try {
				response.getWriter().print(json);
			} catch (IOException e) {
				log.error("获取日志实例列表失败，异常："+e.getMessage());
			}
		}else{//返回空数据，格式：{"rows":[],"results":"0"}
			List list = new ArrayList();
			Map map1 = new HashMap();
			list.add(map1);
			Map m = new  HashMap();
			m.put("results", "0");
			m.put("rows", list);
			JSONArray json = JSONArray.fromObject(m);		
			String jsonString = json.toString();
			String jsonstr =jsonString.substring(1, jsonString.length()-1);
			response.setContentType("text/json; charset=utf-8"); 
			try {
				response.getWriter().print(jsonstr);
			} catch (IOException e) {
				log.error("获取日志实例列表失败，异常："+e.getMessage());
			}
		}		
		return null;
	}
</pre>  <br />开始无数据时怎么也不能显示PagingToolbar 的emptyMsg，后来发现空数据时组织格式错误，忘记去掉 [{"rows":[],"results":"0"}]这部分的“[]”，这个小问题折磨了俺好久，呵呵，要细心啊～！<br />JS代码：<br /><pre name="code" class="js">
   var datastore = new Ext.data.Store({
        proxy: new Ext.data.HttpProxy({
            url: 'logManage.do?method=getAllLogs'
        }),
        reader: new Ext.data.JsonReader({
        	root               : 'rows',
            totalProperty      : 'results',
            id: 'taskID'
        }, [
            {name: 'taskId'},
            {name: 'rwfssj'},
            {name: 'rwjssj'},
            ....
        ]),
         remoteSort: true
    });
    datastore.setDefaultSort('taskId','ASC');
    datastore.load({params:{start:0, limit:10}});
		
	var sm = new Ext.grid.CheckboxSelectionModel();
	var colModel = new Ext.grid.ColumnModel([
		new Ext.grid.RowNumberer(),
		{ header:'任务ID', width:100, sortable:true, locked:true, dataIndex:'taskId'},
		{ header:'任务类型', width:100, sortable:true, locked:false, dataIndex:'rwlb'},
		{ header:'任务状态', width:100, sortable:true, locked:false, dataIndex:'rwzt'},
		......
	]);
		
	var LogGrid = new Ext.grid.GridPanel({
		ds					: datastore,
		cm					: colModel,
		sm					: sm,
		id                  : 'LogGrid',
		title				: '日志列表',
		autoHeight 		    : true,
        width               : '100%',
        loadMask            : true,
		 buttons            : [{
		        text	    : '查询',
				tooltip	    : '日志查询',
				handler   	: logSearch
		 },{
		        text	    : '关闭',
				tooltip	    : '关闭窗口',
				handler	    : closeForm
		 }],
        buttonAlign         : 'right',
        bbar                : new Ext.PagingToolbar({
            id              : 'pagingbar',
            pageSize        : 10,
            store           : datastore,
            displayInfo     : true
             })		
	});
</pre><br />   搞定，收工....
          <br/>
          <span style="color:red;">
            <a href="http://EXT.group.javaeye.com/group/blog/201891#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 10 Jun 2008 18:08:04 +0800</pubDate>
        <link>http://EXT.group.javaeye.com/group/blog/201891</link>
        <guid>http://EXT.group.javaeye.com/group/blog/201891</guid>
      </item>
      <item>
        <title>我与EXTJS有个约会--插话</title>
        <author>yongtree</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yongtree.javaeye.com">yongtree</a>&nbsp;
          链接：<a href="http://EXT.group.javaeye.com/group/blog/201499" style="color:red;">http://EXT.group.javaeye.com/group/blog/201499</a>&nbsp;
          发表时间: 2008年06月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp; 由于第一次写这样一个东西，一点经验都没有，当开始深入地时候，却感觉到无法下手了。本打算通过一个个的小例子或者通过自己最近开发的工作流系统使用到的Ext来介绍Ext中各个组件的使用，但是感觉这样不是又落入到俗套就是一些商业系统，源代码不能完全公开，最终都无法达到完全共享的目的。自己一直喜欢标新立异，一直想做一点真正属于自己的东西，并且以此来分享自己的学习心得，同时结识更多的朋友。最近一直在想，下一步该怎么写，该用什么样的方式来分享自己的所得。和一些专门研究EXT的牛人们不一样，我并没有深入到Ext的每个细节，我所收获的是怎样使用EXT来达到和传统开发方式实现一样的功能，并实现不一样的效果。由于自己资历太低，如果在形式上和网上已经存在的那本教程差不多的话，对自己也不是一件光彩的事，更怕误人子弟。<br />&nbsp;&nbsp;&nbsp; 今天和朋友说起自己的想法，朋友也有同感，毕竟从事软件开发的时间不长，无法写出太深刻的东西。朋友也在研究一个算是比较新鲜的东西Flex，突然有了想法，能不能共同做一个成型的东西出来，前台分别用EXT和Flex实现，通过开源的力量来不断的充实这个系统，最终达到能商业应用的目的。并在开发的过程中，一点点地去分享EXT和Flex的学习经验。这对自己的确是个挑战，这将意味着工作之余的大部分时间都要投入到这个东西的开发之中，也许又是多少个无眠的夜晚。同时，作为一个抛砖引玉的东西，希望更多的人能把自己的经验拿出来分享，技术不是商业，请各位不要吝啬自己的一点点智慧和笔墨。<br />&nbsp;&nbsp;&nbsp; 这两天希望自己能确定要开发的东西，并设计好物理模型和系统构架。希望各位朋友多多支持，你们的支持就是我的动力，希望我能在你们的支持下坚持到底。<br />&nbsp;&nbsp;&nbsp; </p>
          <br/>
          <span style="color:red;">
            <a href="http://EXT.group.javaeye.com/group/blog/201499#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 09 Jun 2008 14:49:35 +0800</pubDate>
        <link>http://EXT.group.javaeye.com/group/blog/201499</link>
        <guid>http://EXT.group.javaeye.com/group/blog/201499</guid>
      </item>
      <item>
        <title>我与EXTJS有个约会--初识EXTJS</title>
        <author>yongtree</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yongtree.javaeye.com">yongtree</a>&nbsp;
          链接：<a href="http://EXT.group.javaeye.com/group/blog/199588" style="color:red;">http://EXT.group.javaeye.com/group/blog/199588</a>&nbsp;
          发表时间: 2008年06月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h1 style="margin: 17pt 0cm 16.5pt;"><a name="_Toc200215349"><span style="font-weight: normal; font-size: 16pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-bidi-font-weight: bold;">第二章：初识</span></a><span style="mso-bookmark: _Toc200215349;"><span lang="EN-US" style="font-weight: normal; font-size: 16pt; line-height: 240%; mso-bidi-font-weight: bold;"><span style="font-family: Calibri;">EXTJS</span></span></span><span style="mso-bookmark: _Toc200215349;"><span style="font-weight: normal; font-size: 16pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-bidi-font-weight: bold;">。你的容颜媚悦动人</span></span><span lang="EN-US" style="font-weight: normal; font-size: 16pt; line-height: 240%; mso-bidi-font-weight: bold;"></span></h1>
<h2 style="margin: 13pt 0cm;"><a name="_Toc200215350"><span lang="EN-US" style="font-weight: normal; font-size: 15pt; line-height: 173%; mso-bidi-font-weight: bold;"><span style="font-family: Cambria;">2.1 </span></span></a><span style="mso-bookmark: _Toc200215350;"><span style="font-weight: normal; font-size: 15pt; line-height: 173%; font-family: 宋体; mso-ascii-font-family: Cambria; mso-hansi-font-family: Cambria; mso-bidi-font-weight: bold;">你如此美丽，让我无法不心动</span></span><span lang="EN-US" style="font-weight: normal; font-size: 15pt; line-height: 173%; mso-bidi-font-weight: bold;"></span></h2>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="mso-tab-count: 1;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">当我第一次看到她的时候，她的美丽便让我怦然心动，我不禁唱起&ldquo;在千山万水人海相遇，喔，原来你也在这里&rdquo;。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="mso-tab-count: 1;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">快别唱了，还是赶紧去她家看看长的啥样吧。在浏览器上键入</span><span lang="EN-US"><a href="http://extjs.com/products/extjs/"><span style="font-family: Calibri;">http://extjs.com/products/extjs/</span></a></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">在官方网站上先预览一下吧。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small;"><img src="../../upload/picture/pic/15499/2a689ed8-a3fa-35db-856a-79e1fb6711f8.jpg" height="332" alt="" width="732" /></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="mso-tab-count: 1;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">官方网站上提供了几乎所有控件的演示实例，每个实例都有非常详尽的</span><span lang="EN-US"><span style="font-family: Calibri;">JS</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">源码，用户可以根据自己的需要进行学习，改造，并把它们运用到自己的项目中。我认为学习和使用</span><span lang="EN-US"><span style="font-family: Calibri;">EXTJS</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">最好的方式就是看官方网站上提供的这些例子的源代码，然后再进行改造，结合</span><span lang="EN-US"><span style="font-family: Calibri;">API</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">，然后就会有一个非常好的效果，这样要比在网上漫无目的的查找和自己闷头看</span><span lang="EN-US"><span style="font-family: Calibri;">API</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">要强的多。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="mso-tab-count: 1;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">初次见面，整体印象非常不错，但这还不够，再仔细看看她哪里有不一样的精彩。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;"><span style="font-size: small;">看看这个列表，集编辑、分组、查询、排序为一身，功能强大的让我咂舌。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><img src="../../upload/picture/pic/15501/d207636e-1432-3af4-a05f-28416ac24879.jpg" height="414" alt="" width="741" /></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;"><span style="font-size: small;">再看看下面的树，两颗树可以通过拖拽的方式自由添加，超帅。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small;"><img src="../../upload/picture/pic/15503/95189809-9768-31b4-a0a2-8cd4126ea11e.jpg" height="323" alt="" width="555" /></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;"><span style="font-size: small;">还有好多的例子，都是非常漂亮的，而且功能非常的强大，我就不一一介绍了，自己可以在官网上慢慢的预览。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">最后再发一个更酷的例子</span><span lang="EN-US"><span style="font-family: Calibri;">----</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">用</span><span lang="EN-US"><span style="font-family: Calibri;">EXTJS</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">模拟</span><span lang="EN-US"><span style="font-family: Calibri;">windows</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">桌面，为了这也得搞定</span><span lang="EN-US"><span style="font-family: Calibri;">EXTJS</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;"><img src="../../upload/picture/pic/15489/4214cfab-6c31-3fff-ae65-55857d636cee.jpg" height="487" alt="" width="971" /></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Calibri;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="mso-tab-count: 1;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">不用再看了，太美了，赶紧让她落户本地吧。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="mso-tab-count: 1;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">我们把下载下来的</span><span lang="EN-US"><span style="font-family: Calibri;">EXTJS</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">的文件包放在本地直接运行，不会看到非常好的效果，虽然</span><span lang="EN-US"><span style="font-family: Calibri;">API</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">部分都是一些</span><span lang="EN-US"><span style="font-family: Calibri;">HTML</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">文件。我们要想看到她美丽的样子，就得给她一个好的环境。这里我们选用</span><span lang="EN-US"><span style="font-family: Calibri;">tomcat</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">作为</span><span lang="EN-US"><span style="font-family: Calibri;">EXTJS</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">的运行环境。把下载下来的</span><span lang="EN-US"><span style="font-family: Calibri;">EXTJS SDK</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">的文件夹直接拷到</span><span lang="EN-US"><span style="font-family: Calibri;">tomcat</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">的</span><span lang="EN-US"><span style="font-family: Calibri;">webapps</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">文件夹下，启动</span><span lang="EN-US"><span style="font-family: Calibri;">tomcat</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">服务器就可以直接运行了。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small;"><img src="../../upload/picture/pic/15487/c280f8c1-19c4-3cb7-a535-608135fb7634.jpg" height="570" alt="" width="797" /></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">看，和官网上是不是一样的效果，这样我们就不用去她的娘家一睹她的容貌了，离线就可以看到她的例子和</span><span lang="EN-US"><span style="font-family: Calibri;">API</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">，学习起来是不是更加方便了啊。当然网上还有很多人制作的离线的</span><span lang="EN-US"><span style="font-family: Calibri;">API</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">，让我们更加方便的学习。也感谢这些人无私的奉献。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="mso-tab-count: 1;"><span style="font-size: small; font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p>
<h2 style="margin: 13pt 0cm;"><a name="_Toc200215351"><span lang="EN-US" style="font-weight: normal; font-size: 15pt; line-height: 173%; mso-bidi-font-weight: bold;"><span style="font-family: Cambria;">2.2 </span></span></a><span style="mso-bookmark: _Toc200215351;"><span style="font-weight: normal; font-size: 15pt; line-height: 173%; font-family: 宋体; mso-ascii-font-family: Cambria; mso-hansi-font-family: Cambria; mso-bidi-font-weight: bold;">第一个例子，</span></span><span style="mso-bookmark: _Toc200215351;"><span lang="EN-US" style="font-weight: normal; font-size: 15pt; line-height: 173%; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; mso-bidi-font-weight: bold; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Hello MM</span></span><span lang="EN-US" style="font-weight: normal; font-size: 15pt; line-height: 173%; mso-bidi-font-weight: bold;"></span></h2>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="mso-tab-count: 1;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">看完这么多漂亮的例子，我们是不是也心动了呢，是不是蠢蠢欲动想小试一下牛刀，那就跟着来做个</span><span lang="EN-US"><span style="font-family: Calibri;">Hello World</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">吧。哦，不，不再做那让人作呕的</span><span lang="EN-US"><span style="font-family: Calibri;">Hello World</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">了，来个</span><span lang="EN-US"><span style="font-family: Calibri;">Hello MM</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">吧。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">首先，在</span><span lang="EN-US"><span style="font-family: Calibri;">MyEclipse</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">下建立一个</span><span lang="EN-US"><span style="font-family: Calibri;">web project</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><span style="font-size: small;"><img src="../../upload/picture/pic/15493/bcd91158-42ec-35f9-a2ca-de040a112008.jpg" height="498" alt="" width="499" /></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">然后，我们引入需要用到的</span><span lang="EN-US"><span style="font-family: Calibri;">EXTJS</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">的相关资源。主要有</span><span lang="EN-US"><span style="font-family: Calibri;">ext-all.js,ext-base.js,ext-all-debug.js, ext-lang-zh_CN.js</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">还有</span><span lang="EN-US"><span style="font-family: Calibri;">resources</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">整个文件夹（该文件夹存放了</span><span lang="EN-US"><span style="font-family: Calibri;">ext</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">所有的样式、图片）。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span lang="EN-US"><span style="font-size: small;"><span lang="EN-US" style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">&nbsp;<img src="../../upload/picture/pic/15505/f0ff094e-6878-3e19-b97d-e9202e1c1ea8.jpg " height="224" alt="" width="153" /></span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="mso-tab-count: 1;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">让我们开始动手，亲手实现一个漂亮的例子吧。先来建立一个</span><span lang="EN-US"><span style="font-family: Calibri;">index.html</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">，然后将工作区切换到</span><span lang="EN-US"><span style="font-family: Calibri;">Aptana</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">视图，并用</span><span lang="EN-US"><span style="font-family: Calibri;">Aptana</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">的</span><span lang="EN-US"><span style="font-family: Calibri;">html</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">的编辑器打开。效果如下：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><img src="../../upload/picture/pic/15507/3543eee8-c27b-3d14-b9fb-8730077fcb24.jpg" height="325" alt="" width="829" /></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">让我们看看效果吧。是不是比我们直接用</span><span lang="EN-US"><span style="font-family: Calibri;">alert</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">漂亮多了，其实</span><span lang="EN-US"><span style="font-family: Calibri;">ext</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">封装了很多漂亮的控件，我们会在以后的章节中一一介绍。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small;"><img src="../../upload/picture/pic/15497/cec46517-5853-3fa5-b8dc-3f447eeb53ac.jpg" height="399" alt="" width="499" /></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">【解惑】：有时候我们的程序不能正常运行，报&ldquo;</span><span lang="EN-US"><span style="font-family: Calibri;">Ext</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">未定义&rdquo;的错误，是什么原因呢？</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="mso-tab-count: 1;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">最有可能的原因是我们引入</span><span lang="EN-US"><span style="font-family: Calibri;">js</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">文件时，弄错了</span><span lang="EN-US"><span style="font-family: Calibri;">js</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">的顺序。一般情况下，我们引入</span><span lang="EN-US"><span style="font-family: Calibri;">js</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">一般不会发生因</span><span lang="EN-US"><span style="font-family: Calibri;">js</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">的顺寻而出现的错误，但是这几个基本的</span><span lang="EN-US"><span style="font-family: Calibri;">js</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">还是有一定的顺序的。至少保证</span><span lang="EN-US"><span style="font-family: Calibri;">ext-base.js</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">在第一个位置上，因为它是一个全局的适配器，定义了</span><span lang="EN-US"><span style="font-family: Calibri;">Ext</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">框架的核心组件。其次是</span><span lang="EN-US"><span style="font-family: Calibri;">ext-all.js</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">，</span><span lang="EN-US"><span style="font-family: Calibri;">ext-all-debug.js</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">是用于调试用的，在开发阶段为了便于调试可以引入，在发布的时候删除。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Calibri;">&nbsp;</span></span></p>
<h2 style="margin: 13pt 0cm;"><a name="_Toc200215352"><span lang="EN-US" style="font-weight: normal; font-size: 15pt; line-height: 173%; mso-bidi-font-weight: bold;"><span style="font-family: Cambria;">2.3 </span></span></a><span style="mso-bookmark: _Toc200215352;"><span lang="EN-US" style="font-weight: normal; font-size: 15pt; line-height: 173%; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; mso-bidi-font-weight: bold; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Ext</span></span><span style="mso-bookmark: _Toc200215352;"><span style="font-weight: normal; font-size: 15pt; line-height: 173%; font-family: 宋体; mso-ascii-font-family: Cambria; mso-hansi-font-family: Cambria; mso-bidi-font-weight: bold;">的瑕疵</span></span><span lang="EN-US" style="font-weight: normal; font-size: 15pt; line-height: 173%; mso-bidi-font-weight: bold;"></span></h2>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="mso-tab-count: 1;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">再美的仙女都不可能是十全十美的，否则上帝造物就太不公平了。美丽的外表不能掩盖性能的缺失，这就俨然美神</span><span lang="EN-US"><span style="font-family: Calibri;">&mdash;</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">维纳斯那残缺的双臂。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Ext</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">庞大的类库，看起来如此的笨重，光下载</span><span lang="EN-US"><span style="font-family: Calibri;">js</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">类库也需要消耗很长的时间。同时</span><span lang="EN-US"><span style="font-family: Calibri;">Ext</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">使用</span><span lang="EN-US"><span style="font-family: Calibri;">js</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">来生成页面，会产生大量的，无用的，冗余的</span><span lang="EN-US"><span style="font-family: Calibri;">DOM</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">节点，每一次重新生成</span><span lang="EN-US"><span style="font-family: Calibri;">DOM</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">节点，需要消耗大量的资源。下图就是简单的拖动提示框而捕捉到的</span><span lang="EN-US"><span style="font-family: Calibri;">CPU</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">和内存的消耗，一个简单的提示框就能瞬间消耗</span><span lang="EN-US"><span style="font-family: Calibri;">80%</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">的</span><span lang="EN-US"><span style="font-family: Calibri;">CPU</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">利用率，可见性能缺失让人惊叹。上帝给你一张迷人的外表，却让你失去了双臂，我们这才感叹世界有时候还是蛮公平的。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small;"><img src="../../upload/picture/pic/15491/3e68831c-d81e-3d99-851a-15d90c86b7c8.jpg" height="463" alt="" width="832" /></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">但是作为一门新兴的技术，必然有着很多的缺陷，谁生来都不是完美的。但是，我相信，随着越来越多的人使用</span><span lang="EN-US"><span style="font-family: Calibri;">EXT</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">，</span><span lang="EN-US"><span style="font-family: Calibri;">Ext</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">必将慢慢的完善起来，在</span><span lang="EN-US"><span style="font-family: Calibri;">RIA</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">领域扮演着越来越重要的角色，让我们共同努力，共同期待。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><span style="font-size: small; font-family: Calibri;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">由于我写这个教程的本意和初衷是在实际的开发中运用</span><span lang="EN-US"><span style="font-family: Calibri;">Ext</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">，完全从实用的角度出发，以最简单的程序实现我们想要的系统，所以一些给予理论的对</span><span lang="EN-US"><span style="font-family: Calibri;">EXT</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">的结构，源码等等介绍，我这里便不再赘述了。由于</span><span lang="EN-US"><span style="font-family: Calibri;">Ext</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">完美的框架设计和面向对象的强大封装，作为</span><span lang="EN-US"><span style="font-family: Calibri;">Java</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">程序员应该很容易就能上手。以后的章节，我会通过具体的实例来分析和学习</span><span lang="EN-US"><span style="font-family: Calibri;">Ext</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">，因为自己本身是</span><span lang="EN-US"><span style="font-family: Calibri;">Java</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">程序员，后台将全部采用</span><span lang="EN-US"><span style="font-family: Calibri;">java</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">来实现。也希望各位朋友提出你们的宝贵意见，更希望的是你们能参与其中，众人拾柴火焰高嘛。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Calibri;">&nbsp;</span></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://EXT.group.javaeye.com/group/blog/199588#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 03 Jun 2008 01:14:12 +0800</pubDate>
        <link>http://EXT.group.javaeye.com/group/blog/199588</link>
        <guid>http://EXT.group.javaeye.com/group/blog/199588</guid>
      </item>
      <item>
        <title>在google app engine上搞了一个 extjs的hello world</title>
        <author>magicgod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://magicgod.javaeye.com">magicgod</a>&nbsp;
          链接：<a href="http://EXT.group.javaeye.com/group/blog/199095" style="color:red;">http://EXT.group.javaeye.com/group/blog/199095</a>&nbsp;
          发表时间: 2008年06月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          搞了一个extjs的hello world<br /><a href="http://iocs.appspot.com/" target="_blank">http://iocs.appspot.com/</a><br /><br />没找到如何启用gzip压缩。
          <br/>
          <span style="color:red;">
            <a href="http://EXT.group.javaeye.com/group/blog/199095#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 01 Jun 2008 01:02:38 +0800</pubDate>
        <link>http://EXT.group.javaeye.com/group/blog/199095</link>
        <guid>http://EXT.group.javaeye.com/group/blog/199095</guid>
      </item>
      <item>
        <title>在Ext中使用Acegi</title>
        <author>ecsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsun.javaeye.com">ecsun</a>&nbsp;
          链接：<a href="http://EXT.group.javaeye.com/group/blog/198593" style="color:red;">http://EXT.group.javaeye.com/group/blog/198593</a>&nbsp;
          发表时间: 2008年05月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近在使用Ext的时候，使用Acegi，发现提交的时候有问题，通过查看Ext doc,发现FormPanel默认使用的不是传统方式发送登陆请求的，根据文档，需要重写submit方法，很简单，贴上来希望对后来的朋友有所帮助。<br /><br /><pre name="code" class="java">
/**
 * 用户登陆页面
 */

com.faceye.compoents.core.security.LoginForm = {
	init : function() {
		var container = com.faceye.ui.Container.init();
		var centerContainer = container
				.getComponent('default-center-body-container');

		var loginForm = new Ext.form.FormPanel({
			labelWidth : 80,
			// url:'/faceye/j_acegi_security_check',
			frame : true,
			title : '用户登陆',
			// el : 'login-form',
			// title: 'Simple Form',
			bodyStyle : 'padding:5px 5px 0',
			width : 370,
			// defaults: {width: 210},
			// renderTo : centerContainer,
			layout : 'form',
			onSubmit : Ext.emptyFn,
			defaultType : 'textfield',
			submit : function() {
				loginForm.getForm().getEl().dom.action = BP
						+ 'j_acegi_security_check';
				loginForm.getForm().getEl().dom.submit();
			},
			items : [{
				fieldLabel : '帐户',
				name : 'j_username',
				width : 200,
				allowBlank : false,
				vtypeText : '帐户不能为空',
				tabIndex : 1
			}, {
				fieldLabel : '密码',
				width : 200,
				name : 'j_password',
				inputType : 'password',
				tabIndex : 2
			}],
			buttons : [{
				text : '登陆',
				type : 'submit',
				tooltip : 'Login',
				clickEvent : 'click',
				handler : function() {
					loginForm.getForm().submit({
						url : BP+'j_acegi_security_check',
						method : 'POST',
						waitMsg : 'Processing the form now',
						waitTitle : 'Member Login',
						success : function(form, action) {
							Ext.Msg.alert('用户登陆', '登陆成功');
						},
						failiure : function(form, action) {
							if (action.failureType == 'server') {
								var obj = Ext.util.JSON
										.decode(action.response.responseText);
								Ext.Msg.alert('用户登陆', '登陆失败'+obj);
							}else{
								Ext.Msg.alert('用户登陆', '登陆失败');
							}

						}
					});

				}

			}]
		});
		centerContainer.add(loginForm);
		centerContainer.doLayout();
		container.render(Ext.getBody());
	}
};

</pre><br /><br />这里面最主要的是：onSubmit : Ext.emptyFn<br />然后就是写submit
          <br/>
          <span style="color:red;">
            <a href="http://EXT.group.javaeye.com/group/blog/198593#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 30 May 2008 11:25:00 +0800</pubDate>
        <link>http://EXT.group.javaeye.com/group/blog/198593</link>
        <guid>http://EXT.group.javaeye.com/group/blog/198593</guid>
      </item>
      <item>
        <title>Ext And GIS</title>
        <author>lozpeng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lozpeng.javaeye.com">lozpeng</a>&nbsp;
          链接：<a href="http://EXT.group.javaeye.com/group/blog/195667" style="color:red;">http://EXT.group.javaeye.com/group/blog/195667</a>&nbsp;
          发表时间: 2008年05月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          试着将Ext与GIS结合起来.试着将Ext与ArcGIS Server结合起来.
          <br/>
          <span style="color:red;">
            <a href="http://EXT.group.javaeye.com/group/blog/195667#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 22 May 2008 15:04:56 +0800</pubDate>
        <link>http://EXT.group.javaeye.com/group/blog/195667</link>
        <guid>http://EXT.group.javaeye.com/group/blog/195667</guid>
      </item>
      <item>
        <title>cardlayout的奇特问题</title>
        <author>kayzhan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kayzhan.javaeye.com">kayzhan</a>&nbsp;
          链接：<a href="http://EXT.group.javaeye.com/group/blog/195313" style="color:red;">http://EXT.group.javaeye.com/group/blog/195313</a>&nbsp;
          发表时间: 2008年05月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          现在用的向导布局，结果点下一步的话，整个布局就会发生变化，而且是在ff下没问题，在ie下显示才会有问题<br /> var navHandler = function(direction,value){<br /><br />        var wizard = Ext.getCmp('wizard').layout;<br />        var prev = Ext.getCmp('move-prev');<br />        var next = Ext.getCmp('move-next');<br />        var activeId = wizard.activeItem.id;<br /><br />        if(direction == 1){<br /><br />            if(item==0 && cusinfo.type=='法人'){<br />                item++;<br /><br />            }else if(item==0 && cusinfo.type=='个人'){<br />                item=item+2;<br /><br />            }else if(item>0){<br />                item++;<br />            }<br /><br />            if(item>0){<br />                prev.setDisabled(false);<br /><br />            }if(item>=5){<br />                next.setDisabled(true);<br />            }<br /><br />        }<br /><br />        if(direction == -1){<br />            if(item!=2){<br />                item--;<br />            }else if(item==2 && cusinfo.type=='个人'){<br />                item = item-2;<br />            }else if(item==2 && cusinfo.type=='法人'){<br />                item--;<br />            }<br />            if(item&lt;=0){<br />                prev.setDisabled(true);<br /><br />            }if(item&lt;5){<br />                next.setDisabled(false);<br />            }<br /><br />        }<br /><br />        wizard.setActiveItem(item);<br /><br />    };<br />这个是我写的翻页代码，是否是这里有问题呢？还是说点下一步还需要做其他什么操作
          <br/>
          <span style="color:red;">
            <a href="http://EXT.group.javaeye.com/group/blog/195313#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 21 May 2008 15:38:56 +0800</pubDate>
        <link>http://EXT.group.javaeye.com/group/blog/195313</link>
        <guid>http://EXT.group.javaeye.com/group/blog/195313</guid>
      </item>
      <item>
        <title>如何在window本身里让window循环弹出</title>
        <author>kayzhan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kayzhan.javaeye.com">kayzhan</a>&nbsp;
          链接：<a href="http://EXT.group.javaeye.com/group/blog/195187" style="color:red;">http://EXT.group.javaeye.com/group/blog/195187</a>&nbsp;
          发表时间: 2008年05月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          现在遇到一种这样的需求，window里用的是向导，也就是cardlayout。然后在其中一个card里，有个按钮，点击那个按钮就让这个window再次弹出，就是从第1个card重新开始，原来的窗口也不用消失。而且这个是可以无限循环的，每次点那个按钮就再次弹出这个窗口，当然现实中不可能真的无限循环。如果在里面的按钮弹出当前窗口的话总是会说没有定义此窗口的，不管是用Ext.getCmp('win').show()还是直接win.show()，或者new win().show()都行不通<br />本来以为只弹出一次的话，是复制个一模一样的窗口，然而如果是无限的话，不可能一直复制窗口的阿，各位有好的解决方法吗，高手请多多帮忙啊！
          <br/>
       