<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>宋海鹏的blog</title>
    <description>毕业于华北水利水电学院，现就职于宜搜科技。</description>
    <link>http://ecsun.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>[转]成为编程高手的基础素养</title>
        <author>ecsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsun.javaeye.com">ecsun</a>&nbsp;
          链接：<a href="http://ecsun.javaeye.com/blog/210957" style="color:red;">http://ecsun.javaeye.com/blog/210957</a>&nbsp;
          发表时间: 2008年07月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          世界上并没有成为高手的捷径，但一些基本原则是可以遵循的。 <br /><br />1、扎实的基础 <br />　　数据结构、离散数学、编译原理，这些是所有计算机科学的基础，如果不掌握它们，很难写出高水平的程序。程序人人都会写，但当你发现写到一定程度很难再提高的时候，就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP，即使你再精通OOP，遇到一些基本算法的时候可能也会束手无策。因此多读一些计算机基础理论方面的书籍是非常有必要的。 <br /><br />2、丰富的想像力 <br />　　不要拘泥于固定的思维方式，遇到问题的时候要多想几种解决问题的方案，试试别人从没想过的方法。丰富的想像力是建立在丰富的知识的基础上，除计算机以外，多涉猎其他的学科，比如天文、物理、数学等等。开阔的思维对程序员来说很重要。 <br /><br />3、最简单的是最好的 <br />　　这也许是所有科学都遵循的一条准则，复杂的质能转换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式：E=mc2。简单的方法更容易被人理解，更容易实现，也更容易维护。遇到问题时要优先考虑最简单的方案，只有简单方案不能满足要求时再考虑复杂的方案。 <br /><br />4、不钻牛角尖 <br />　　当你遇到障碍的时候，不妨暂时远离电脑，看看窗外的风景，听听轻音乐，和朋友聊聊天。当我遇到难题的时候会去玩游戏，当负责游戏的那部分大脑细胞极度亢奋的时候，负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候，我会发现那些难题现在竟然可以迎刃而解。 <br /><br />5、对答案的渴求 <br />　　人类自然科学的发展史就是一个渴求得到答案的过程，即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念，一定要找到问题的答案，你才会付出精力去探索，即使最后没有得到答案，在过程中你也会学到很多东西。 <br /><br />6、多与别人交流 <br />　　三人行必有我师，也许在一次和别人不经意的谈话中，就可以迸出灵感的火花。多上上网，看看别人对同一问题的看法，会给你很大的启发。 <br /><br />7、良好的编程风格 <br />　　注意养成良好的习惯，代码的缩进编排，变量的命名规则要始终保持一致。大家都知道如何排除代码中错误，却往往忽视了对注释的排错。注释是程序的一个重要组成部分，它可以使你的代码更容易理解，而如果代码已经清楚地表达了你的思想，就不必再加注释了，如果注释和代码不一致，那就更加糟糕。 <br /><br />8、韧性和毅力 <br />　　这也许是"高手"和一般程序员最大的区别。高手们并不是天才，他们是在无数个日日夜夜中磨炼出来的。成功能给我们带来无比的喜悦，但过程却是无比的枯燥乏味。你不妨做个测试，找个10000以内的素数表，把它们全都抄下来，然后再检查三遍，如果能够不间断地完成这一工作，你就可以满足这一条。 <br /><br /><br />如果你觉得本文对你有帮助,请点击下面的广告.<br /><br />原文地址:http://www.ad0.cn/netfetch/read.php/276.htm
          <br/>
          <span style="color:red;">
            <a href="http://ecsun.javaeye.com/blog/210957#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/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Jul 2008 11:16:45 +0800</pubDate>
        <link>http://ecsun.javaeye.com/blog/210957</link>
        <guid>http://ecsun.javaeye.com/blog/210957</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://ecsun.javaeye.com/blog/210441" style="color:red;">http://ecsun.javaeye.com/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://ecsun.javaeye.com/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/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><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>Wed, 02 Jul 2008 11:02:46 +0800</pubDate>
        <link>http://ecsun.javaeye.com/blog/210441</link>
        <guid>http://ecsun.javaeye.com/blog/210441</guid>
      </item>
      <item>
        <title>Faceye基础版(开源)中对带复选框的树结构的处理</title>
        <author>ecsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsun.javaeye.com">ecsun</a>&nbsp;
          链接：<a href="http://ecsun.javaeye.com/blog/205911" style="color:red;">http://ecsun.javaeye.com/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://ecsun.javaeye.com/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/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><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 19 Jun 2008 17:36:50 +0800</pubDate>
        <link>http://ecsun.javaeye.com/blog/205911</link>
        <guid>http://ecsun.javaeye.com/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://ecsun.javaeye.com/blog/205882" style="color:red;">http://ecsun.javaeye.com/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://ecsun.javaeye.com/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/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/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 19 Jun 2008 16:50:45 +0800</pubDate>
        <link>http://ecsun.javaeye.com/blog/205882</link>
        <guid>http://ecsun.javaeye.com/blog/205882</guid>
      </item>
      <item>
        <title>Faceye基础版(开源)介绍(总述)</title>
        <author>ecsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsun.javaeye.com">ecsun</a>&nbsp;
          链接：<a href="http://ecsun.javaeye.com/blog/205750" style="color:red;">http://ecsun.javaeye.com/blog/205750</a>&nbsp;
          发表时间: 2008年06月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在使用Ext进了一段时间开发之后, 最终决定,将这一阶段的开发成果发布出来,供大伙使用.<br /><br />下载地址:http://code.google.com/p/faceye/<br />关于Faceye的更多文章请参考：http://ecsun.javaeye.com<br />Faceye更多预览图请参考:http://ecsun.javaeye.com/album<br /><br /><br />在开发Faceye的过程中,主要使用到了Ext2.1,Struts1.3,Spring2.0,Hiberante3.2,MySQL5,Acegi，portal等技术体系.其中使用了大量的模板功能,代码不够完美,但是是基于Ext的一个完整的实现.<br />在今后一段时间里,我会陆续的,把所有功能写出来.<br /><br />作者:海鹏 联系:myecsun@hotmail.com/Q:82676683<br />/群:56927478,<br /><br />1.技术体系<br /> Ext2.1,Struts1.3,Hibernate3.2,Spring2.5,Acegi 1.06,MySQL,Ext portal<br />2.功能概述:<br />Blog,RSS订阅,网址导航<br />3.特色<br />基于标准的SSH结构,基础Ext的展现界面,基于数据库的acegi安全认证.可随意更改的portal布局,可随意添加的portlet.<br />4.如何安装Faceye基础版<br />4.1.安装环境<br />  JDK1.5及其以上<br />  MySQL5.0以上<br />  Tomcat5.5以上或其它Web容器,如JBoss<br />  Ant(非必须,当然,如果有ant环境的话更好.)<br />4.2.数据库安装.<br />在进行本步操作之前,请确保MySQL数据库服务器已安装成功,并成功启动服务.<br />进入x:/faceye/db/<br />(注:x为你的驱动器盘符)<br />可以看到数据库faceye.sql<br />进行mysql根目录,如你的MySQL安装在C:/下<br />那么你的根目录为:c:/MySQL/bin<br />使用:mysql -u root -p<br />其中 root为你MySQL数据库的用户名,当然你可以使用其它数据库用户,默认使用root用户<br />执行完本命令后,控制台会提示您输入数据库密码,请输入数据库用户root的密码,如"root"<br />进入MySQL控制台:<br />mysql>source x:/faceye/db/faceye.sql<br />执行完本命令,数据库导入结束.<br />如果不能使用命令模式导入数据库,请尝试使用navicat8进入数据库的导入操作.<br /><br />4.3.部署<br />将x:/faceye/dist/faceye.war拷贝至Web容器<br />如果你使用的是tomcat,请拷贝至:x:/tomcat/Webapps/<br />如果你使用的是JBoss,请拷贝至:x:/jboss/server/default/deploy<br />（注：默认部署后既解包，如没有解包，请首先解包)<br /><br />4.4.数据库连接配置<br />打开:x:/tomcat/faceye/WebRoot/Web-INF/classes/com/faceye/core/config/ApplicationContext-resource.xml<br />修改数据库连接参数(主要为数据库端口(默认3306),用户名及密码(默认均为root))<br /><br />4.5.JS全局路径修改<br />打开：x:/tomcat/faceye/WebRoot/scripts/util/Util.js<br />找到：var BP='http://localhost:80/faceye/';进行修改<br />如：你的web容器使用的是8080端口，则修改为：<br />var BP='http://localhost:8080/faceye/';<br /><br />4.5.重启动faceye<br />在做完以上操作后,既完成了基础的配置工作,可以启动服务器<br />请以:http://localhost:port/faceye/(port为Web窗口端口,默认8080)<br /><br />系统用户名/密码：admin/admin<br /><br />4.5.如何从源码构建并部署至应用服务器.<br /> 1.打开MyEclipse<br /> 2.新建一web project<br /> 3.部署到指定服务器.<br /> (注：修改数据库连接及JS全局路径。)<br /><br />说明：自行打包请加入：servlet-api.jar,jsp-api.jar,<br />在builx.xml的full-compile任务中加入：<br />&lt;copy todir="${basedir}/build/classes"><br />			&lt;fileset dir="${basedir}/build/src"><br />				&lt;exclude name="**/*.java" /><br />			&lt;/fileset><br />&lt;/copy><br /><br />然后调用ant full-compile任务，再调用war任务．<br /><br /><img src="http://www.javaeye.com/upload/picture/pic/16349/7abcc5d7-64e1-31c0-b2c5-8d86bdb34990.jpg" /><br /><img src="http://www.javaeye.com/upload/picture/pic/16347/e23d1105-8a09-3175-b00c-dce7cfa0cc10-thumb.jpg" /><br /><br /><br /><img src="http://www.javaeye.com/upload/picture/pic/16343/9ab4fcc4-6933-3702-86f5-87dcb30358a1-thumb.jpg" /><br /><br /><img src="http://www.javaeye.com/upload/picture/pic/16351/3e7a0aba-16e3-38af-9eac-b86a89fd02ec-thumb.jpg" /><br /><br /><img src="http://www.javaeye.com/upload/picture/pic/16337/fd3a27ce-90a1-3ffb-bd51-1d13b0f25d30-thumb.jpg" /><br /><br /><br /><img src="http://www.javaeye.com/upload/picture/pic/16339/5c59dc44-3321-3052-a01d-5f4b8e4ee4c9-thumb.jpg" /><br /><br /><img src="http://www.javaeye.com/upload/picture/pic/16335/2eb96e06-0d78-3c44-a957-4f3d1645b732-thumb.jpg" /><br /><br /><img src="http://www.javaeye.com/upload/picture/pic/16329/e4678e9f-f366-312d-aa51-1314b4c39337-thumb.jpg" /><br /><br /><img src="http://www.javaeye.com/upload/picture/pic/16333/0a320a55-15c0-33d8-970c-d2d814244aae-thumb.jpg" /><br /><br /><img src="http://www.javaeye.com/upload/picture/pic/16325/9deb9c52-6fe0-346c-a895-5be556001012-thumb.jpg" /><br /><br /><img src="http://www.javaeye.com/upload/picture/pic/16321/760b4102-3348-3aec-b86e-ae19ce395304-thumb.jpg" /><br /><br /><img src="http://www.javaeye.com/upload/picture/pic/16319/25210f28-45d5-3bf2-ae7b-194ab80b78b5-thumb.jpg" />
          <br/>
          <span style="color:red;">
            <a href="http://ecsun.javaeye.com/blog/205750#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/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/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 19 Jun 2008 14:12:29 +0800</pubDate>
        <link>http://ecsun.javaeye.com/blog/205750</link>
        <guid>http://ecsun.javaeye.com/blog/205750</guid>
      </item>
      <item>
        <title>联想P809使用感受</title>
        <author>ecsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsun.javaeye.com">ecsun</a>&nbsp;
          链接：<a href="http://ecsun.javaeye.com/blog/201495" style="color:red;">http://ecsun.javaeye.com/blog/201495</a>&nbsp;
          发表时间: 2008年06月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          上周用了两年的手机坏了,周末没事,就去了华强北选手机,朋友本来说去移动大厅看一下充话费送手机的那种,后来网上看了一下,发现品牌不是很多,于是就到华强北去看一下～<br /><br /><br />　　鉴于联想这次捐了1000万,所以这次优先考虑了国产品牌,在华强北的国美,苏宁,顺电,恒享等手机营销专柜,有很多手机,可惜啊,N字打头的居多,再有就是M机,还有就是三星,SE的,这些确实比较多.在整个顺电,没有找到联想手机,在国美,找到一个联想手机专柜,在苏宁的一个角落,也发现了一个联想专柜,其它的地方,没有发现在联想手机.不禁感慨,N机,M机,三星,SE,把这个市场几乎瓜分完毕,曾经最大的波导,现在已经看不到什么影子了,倒是Amoi的专柜,挺多.<br /><br />　在国美看了以后,p809标价1600,服务小姐直接说,今天可以1399拿机,包括一张512M内存卡,两块电池,一只猫,还有一个读卡器,其它的就没有了.<br /><br /> 当时选p809这个型号,主要看的是它可以做为猫来使用,可以配合去年买的联想F41一块来用,所以说,就在p809这个型号上多看了一点,当然,选赛班机,几乎都有这个功能,但在非智能机上面,可以在这个价位做到手机当猫的,确实不多.同时,p809有3.0寸的大触瓶,有商务助理功能,200万像素的相机,26万色,最大2G内存,1000个条电话本,UCWEB,大智慧,金山词霸,蓝牙,java游戏支持,手机地图,MP3,3GP,GSM/E,也基本上够我用了.<br /><br />  后来来到苏宁,1360,加送一贴模,成,就这机了.开单,交钱,拿货,一切挺顺利.<br /><br /><br />到目前为止,已经使用p809一个多星期,感觉不错.<br />从硬件上来说,被我从手里不小心摔到地上一次, 没事,外壳没花,机子没死,拿起来拍一下照样用,有些朋友说联想的手机比较容易死机,但就这一个多星期的使用情况来看,我并没有发现有死机的情况,同时,它820man的电池,基本上我可以用三到四天,够用了.加上来电过滤,短信过滤,省电模式等等,就硬件这一块,感觉还是不错.<br /><br />从软件方面来说,p809的软件人性化方面,做的一般.相比N机,操作起来,在个别地方不够人性化.比如说群发短信,一次最多只能有10个人,比如说电话本分组,只支持最多4个已有分组外加一个自定义分组,同时,将联系人分组是一件麻烦的事情.<br />比如说Mp3播放器,播放时不能自动转为后台模式,要手工触发才能转为后台模式,视频播放器倒是不错,不会出现卡机的情况.再有就是手写,会有断笔的情况.<br /><br />相比市场1360的价位,提供GSM/E双网支持,提供3.0大触屏,提供手机当猫功能,提供商务助理,提供MP3/Mp4/3GP,200万像素摄像头,26万色,蓝牙,UCWEB,java游戏,大智慧,名片识别,电邮,手机地图,词霸等功能来说,性价比还是相当高.以后再去服务点刷一个新的系统,应该会有比较强的使用感受.<br /><br />考虑联想手机,是因为联想在这次大地震中,站了出来,捐了1000万,相比市场份额那么大的N机,相比那些国外来的只会做鸡腿的M/KFC来说,联想,应该优先考虑,在对比具有相似功能,同样大屏幕的国外品牌手机以后,联想的p809是这里面性价比最高的,有人说它使用的主板跟山寨机没有什么差别,同时,大多国产机也使用了同样的主板,而联想的阳光服务,联想的品牌,企是区区山寨机能比的了的?<br /><br />所以说,最终我选择了联想,如果要给联想p809打分的话,100分我觉得我会打90分,不足的地方,我觉得在软件的易操作性方面,联想的工程师还是要花点功夫的.<br />同时,如果这款机再配一块大容量的电池,那做为商务机的p809,会赢得更多用户.<br /><br /><br /><br />　　
          <br/>
          <span style="color:red;">
            <a href="http://ecsun.javaeye.com/blog/201495#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 09 Jun 2008 14:04:44 +0800</pubDate>
        <link>http://ecsun.javaeye.com/blog/201495</link>
        <guid>http://ecsun.javaeye.com/blog/201495</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://ecsun.javaeye.com/blog/198593" style="color:red;">http://ecsun.javaeye.com/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://ecsun.javaeye.com/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/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 30 May 2008 11:25:00 +0800</pubDate>
        <link>http://ecsun.javaeye.com/blog/198593</link>
        <guid>http://ecsun.javaeye.com/blog/198593</guid>
      </item>
      <item>
        <title>John Resig 关于JavaScript Inheritance 的描述</title>
        <author>ecsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsun.javaeye.com">ecsun</a>&nbsp;
          链接：<a href="http://ecsun.javaeye.com/blog/179069" style="color:red;">http://ecsun.javaeye.com/blog/179069</a>&nbsp;
          发表时间: 2008年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原文地址:http://ejohn.org/blog/simple-javascript-inheritance/<br />Simple JavaScript Inheritance<br /><br />I've been doing a lot of work, lately, with JavaScript inheritance - namely for my work-in-progress JavaScript book - and in doing so have <pre name="code" class="java">examined a number of different JavaScript classical-inheritance-simulating techniques. Out of all the ones that I've looked at I think my favorites were the implementations employed by base2 and Prototype.

I wanted to go about extracting the soul of these techniques into a simple, re-usable, form that could be easily understood and didn't have any dependencies. Additionally I wanted the result to be simple and highly usable. Here's an example of what you can do with it:
<pre name="code" class="java">var Person = Class.extend({
  init: function(isDancing){
    this.dancing = isDancing;
  },
  dance: function(){
    return this.dancing;
  }
});

var Ninja = Person.extend({
  init: function(){
    this._super( false );
  },
  dance: function(){
    // Call the inherited version of dance()
    return this._super();
  },
  swingSword: function(){
    return true;
  }
});</pre><br /><br />var p = new Person(true);<br />p.dance(); // => true<br /><br />var n = new Ninja();<br />n.dance(); // => false<br />n.swingSword(); // => true<br /><br />// Should all be true<br />p instanceof Person && p instanceof Class &&<br />n instanceof Ninja && n instanceof Person && n instanceof Class<br /><br />A couple things to note about this implementation:<br /><br />    * Creating a constructor had to be simple (in this case simply providing an init method does the trick).<br />    * In order to create a new 'class' you must extend (sub-class) an existing class.<br />    * All of the 'classes' inherit from a single ancestor: Class. Therefore if you want to create a brand new class it must be a sub-class of Class.<br />    * And the most challenging one: Access to overridden methods had to be provided (with their context properly set). You can see this with the use of this._super(), above, calling the original init() and dance() methods of the Person super-class.<br /><br />I'm pleased with the result: It helps to enforce the notion of 'classes' as a structure, maintains simple inheritance, and allows for the super method calling.<br /><br />Simple Class Creation and Inheritance<br /><br />And here's the implementation (reasonably sized and commented well) - clocking in at around 25 lines. Feedback is welcome and appreciated.<br />// Inspired by base2 and Prototype<br /><pre name="code" class="java">(function(){
  var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;

  // The base Class implementation (does nothing)
  this.Class = function(){};
 
  // Create a new Class that inherits from this class
  Class.extend = function(prop) {
    var _super = this.prototype;
   
    // Instantiate a base class (but only create the instance,
    // don't run the init constructor)
    initializing = true;
    var prototype = new this();
    initializing = false;
   
    // Copy the properties over onto the new prototype
    for (var name in prop) {
      // Check if we're overwriting an existing function
      prototype[name] = typeof prop[name] == "function" &&
        typeof _super[name] == "function" && fnTest.test(prop[name]) ?
        (function(name, fn){
          return function() {
            var tmp = this._super;
           
            // Add a new ._super() method that is the same method
            // but on the super-class
            this._super = _super[name];
           
            // The method only need to be bound temporarily, so we
            // remove it when we're done executing
            var ret = fn.apply(this, arguments);       
            this._super = tmp;
           
            return ret;
          };
        })(name, prop[name]) :
        prop[name];
    }
   
    // The dummy class constructor
    function Class() {
      // All construction is actually done in the init method
      if ( !initializing && this.init )
        this.init.apply(this, arguments);
    }
   
    // Populate our constructed prototype object
    Class.prototype = prototype;
   
    // Enforce the constructor to be what we expect
    Class.constructor = Class;

    // And make this class extendable
    Class.extend = arguments.callee;
   
    return Class;
  };
})();</pre><br /><br />In my opinion the two trickiest parts are the "initializing/don't call init" and "create _super method" portions. I want to cover those briefly so that you will have a good understanding of what's being achieved in this method.<br /><br />Initialization<br /><br />In order to simulate inheritance with a function prototype we use the traditional technique of creating an instance of the super-class function and assigning it to the prototype. Without using the above it would look something like this:<br />function Person(){}<br />function Ninja(){}<br />Ninja.prototype = new Person();<br />// Allows for instanceof to work:<br />(new Ninja()) instanceof Person<br /><br />What's challenging about this, though, is that all we really want is the benefits of 'instanceof', not the whole cost of instantiating a Person object and running its constructor. To counteract this we have a variable in our code, initializing, that is set to true whenever we want to instantiate a class with the sole purpose of using it for a prototype.<br /><br />Thus when it comes time to actually construct the function we make sure that we're not in an initialization mode and run the init method accordingly:<br />if ( !initializing )<br />  this.init.apply(this, arguments);<br /><br />What's especially important about this is that the init method could be running all sorts of costly startup code (connecting to a server, creating DOM elements, who knows) so circumventing this ends up working quite well.<br /><br />Super Method<br /><br />When you're doing inheritance, creating a class that inherits functionality from a super-class, a frequent desire is the ability to access a method that you've overridden. The final result, in this particular implementation, is a new temporary method (._super) which is only accessible from within a sub-classes' method, referencing the super-classes' associated method.<br /><br />For example, if you wanted to call a super-classes' constructor you could do that with this technique.<br />var Person = Class.extend({<br />  init: function(isDancing){<br />    this.dancing = isDancing;<br />  }<br />});<br /><br />var Ninja = Person.extend({<br />  init: function(){<br />          this._super( false );<br />  }<br />});</pre><br /><br />var p = new Person(true);<br />p.dancing; // => true<br /><br />var n = new Ninja();<br />n.dancing; // => false<br /> <br /><br />Implementing this functionality is a multi-step process. To start, note the object literal that we're using to extend an existing class (such as the one being passed in to Person.extend) needs to be merged on to the base new Person instance (the construction of which was described previously). During this merge we do a simple check: Is the property that we're attempting merge a function and is what we're replacing also a function? If that's the case then we need to go about creating a way for our super method to work.<br /><br />Note that we create an anonymous closure (which returns a function) that will encapsulate the new super-enhanced method. To start we need to be a good citizen and save a reference to the old this._super (disregarding if it actually exists) and restore it after we're done. This will help for the case where a variable with the same name already exists (don't want to accidentally blow it away).<br /><br />Next we create the new _super method, which is just a reference to the method that exists on the super-class' prototype. Thankfully we don't have to make any additional changes, or re-scoping, here as the context of the function will be set automatically when it's a property of our object (this will refer to our instance as opposed to the super-class').<br /><br />Finally we call our original method, it does its work (possibly making use of _super as well) after which we restore _super to its original state and return from the function.<br /><br />Now there's a number of ways in which a similar result, to the above, could be achieved (I've seen implementations that have bound the super method to the method itself, accessible from arguments.callee) but I feel that this technique provides the best mix of usability and simplicity.<br /><br />I'll be covering a lot more of the nitty-gritty behind the JavaScript prototype system in my completed work but I just wanted to get this Class implementation out there to get everyone trying it out and playing with it. I think there's a lot to be said for simplistic code (easier to learn, easier to extend, less to download) so I think this implementation is a good place to start and learn the fundamentals of JavaScript class construction and inheritance.
          <br/>
          <span style="color:red;">
            <a href="http://ecsun.javaeye.com/blog/179069#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/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><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, 03 Apr 2008 09:48:50 +0800</pubDate>
        <link>http://ecsun.javaeye.com/blog/179069</link>
        <guid>http://ecsun.javaeye.com/blog/179069</guid>
      </item>
      <item>
        <title>动态加载JS</title>
        <author>ecsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsun.javaeye.com">ecsun</a>&nbsp;
          链接：<a href="http://ecsun.javaeye.com/blog/178921" style="color:red;">http://ecsun.javaeye.com/blog/178921</a>&nbsp;
          发表时间: 2008年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近在写portal的时候,遇到了portlet的开发,由于portlet的量很大,所以会产生很多js文件,于是就在想,可不可以把js写到数据库中,然后在运行的时候,按需动态加载,做了一下尝试,发现是可以的.<br /><br />先给出代码:<br /><br /><pre name="code" class="java">
/**
 * www.faceye.com 网络支持系统 
 * 作者:宋海鹏 ecsun@sohu.com/myecsun@hotmail.com/QQ:82676683
 * 说明:javascripts 工具类
 * 
 */

/**
 * 动态加载JS文件
 */
var Faceye = {
	version : 1.0,
/**
*简单取得httpRequest
*/
	httpRequest : function() {
		var xRequest = null;
		if (window.XMLHttpRequest) {
			xRequest = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			xRequest = new ActiveXObject("MsXml2.XmlHttp");
		}
		return xRequest;
	},
/**
*简单的加载文件
*/
	load : function(src) {
		var headerDom = document.getElementsByTagName('head').item(0);
		var jsDom = document.createElement('script');
		jsDom.type = 'text/javascript';
		jsDom.scr = src;
		headerDom.appendChild(jsDom);
	},
/**
*通过ajax方式加载js
*/
	ajaxLoad : function(src) {
		var xRequest = this.httpRequest();
		xRequest.open('GET',src,true);
		xRequest.send(null);
					var headerDom = document.getElementsByTagName('head')
							.item(0);
					var jsDom = document.createElement('script');
					jsDom.type = 'text/javascript';
					jsDom.language='javascript';
					jsDom.defer=true;
					jsDom.text=xRequest.responseText;
					headerDom.appendChild(jsDom);
		
	}
};
</pre><br /><br /><br />从数据库里面读js内容,很简单了,只要将jsDom.text=xRequest.responseText;<br />换成从数据库中取得的js就可以了
          <br/>
          <span style="color:red;">
            <a href="http://ecsun.javaeye.com/blog/178921#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/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><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Apr 2008 17:33:05 +0800</pubDate>
        <link>http://ecsun.javaeye.com/blog/178921</link>
        <guid>http://ecsun.javaeye.com/blog/178921</guid>
      </item>
      <item>
        <title>Ext portal 改进版</title>
        <author>ecsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsun.javaeye.com">ecsun</a>&nbsp;
          链接：<a href="http://ecsun.javaeye.com/blog/171416" style="color:red;">http://ecsun.javaeye.com/blog/171416</a>&nbsp;
          发表时间: 2008年03月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前一段时间，帮北京一个朋友做了一个portal的demo，使用的是ext里面的portal,在使用过程中，对ext port进行了一些改进，同时，添加了很多ext里面现成的面板。这些改进为：<br /><br />1.超越ext中所有portal在一个frame的限制。ext portal的布局格式不适合互联网应用，所以，我将ext portal的所有portal拿到了一个正常网页中使用，不局限于一个frame内，而是将portal部署在了整个面面。<br /><br />2.添加了很多ext portal中没有提供的面板，当然，这些面板大多是ext中带的例子，如，tabpanel,window,view,grid等。<br /><br />3.添加flash播放。<br /><br />当然，像面板的拖动等，还是和以前的功能一样的。<br /><br />还有一些其它的改进，看样图了。<br /><br />将Ext放入：scripts/ext/下面
          <br/>
          <span style="color:red;">
            <a href="http://ecsun.javaeye.com/blog/171416#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/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/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 14 Mar 2008 15:16:09 +0800</pubDate>
        <link>http://ecsun.javaeye.com/blog/171416</link>
        <guid>http://ecsun.javaeye.com/blog/171416</guid>
      </item>
      <item>
        <title>将ext2 的feed改到java环境下运行</title>
        <author>ecsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsun.javaeye.com">ecsun</a>&nbsp;
          链接：<a href="http://ecsun.javaeye.com/blog/168766" style="color:red;">http://ecsun.javaeye.com/blog/168766</a>&nbsp;
          发表时间: 2008年03月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          晚上坐下来，把ext2中的feed示例，改到java环境下运行，增加了在数据库中动态添加feed的功能。<br />java里面处理RSS的类库感觉有点杂，选了一个syndication用了一下，感觉还可以。<br /><br />返回feed的方法，这个方法实在太简单<br /><br /><pre name="code" class="java">public SyndFeed getSyndFeed(String url) {
	// TODO Auto-generated method stub
	URL feedUrl;
	SyndFeedInput input;
	SyndFeed feed=null;
	try {
		feedUrl = new URL(url);
		input= new SyndFeedInput();
		feed= input.build(new XmlReader(feedUrl));
	} catch (MalformedURLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IllegalArgumentException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (FeedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
	return feed;
}</pre><br /><br />写个方法，有点守旧，老的struts,用2.0,大同小异~~<br /><br /><pre name="code" class="java">	public ActionForward parseFeed(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		Map params = super.getRequestParameterMap(request);
		String feedUrl = "";
		String json = "";
		if (params.containsKey(StringPool.FEED_FEED)) {
			if (params.get(StringPool.FEED_FEED) != null) {
				feedUrl = params.get(StringPool.FEED_FEED).toString();
			}
		}
		if (StringUtils.isEmpty(feedUrl)) {
			String feedId = "";
			if (params.containsKey(StringPool.ENTITY_ID)) {
				feedId = params.get(StringPool.ENTITY_ID).toString();
			}
			if (StringUtils.isNotEmpty(feedId)) {
				Feed feed = (Feed) this.getEntity(Feed.class, feedId);
				feedUrl = feed.getUrl();
			}
		}
		if (StringUtils.isNotEmpty(feedUrl)) {
			// json=this.getFeedParseService().getAllFeeds(feedUrl);
			// this.jsonPrint(response, json);
			SyndFeedOutput output = new SyndFeedOutput();
			SyndFeed feed = this.getFeedParseService().getSyndFeed(feedUrl);
			response.setCharacterEncoding("UTF-8");
			try {
				response.setContentType("text/xml ");
				PrintWriter out = (PrintWriter) response.getWriter();
				String feedContent = output.outputString(feed).toString();
				out.print(feedContent);
				// 发布为feed
				// output.output(feed, response.getWriter());
			} catch (FeedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return null;
	}</pre><br /><br /><br />整体来说，没有什么难的，挺顺的，输出的 xml要处理一下，里面的&lt;dc:creator>要做一下替换。别的没什么~~<br /><br />附个js 包，跟示例没什么差别，用示例就行~~
          <br/>
          <span style="color:red;">
            <a href="http://ecsun.javaeye.com/blog/168766#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, 06 Mar 2008 15:02:51 +0800</pubDate>
        <link>http://ecsun.javaeye.com/blog/168766</link>
        <guid>http://ecsun.javaeye.com/blog/168766</guid>
      </item>
      <item>
        <title>一棵完整的异步加载的Ext树  (3) 后台代码</title>
        <author>ecsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsun.javaeye.com">ecsun</a>&nbsp;
          链接：<a href="http://ecsun.javaeye.com/blog/158712" style="color:red;">http://ecsun.javaeye.com/blog/158712</a>&nbsp;
          发表时间: 2008年01月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前两天分别写的前台的JS代码,以及实体结构代码,这些,是开始做树形结构要准备的基础数据<br />做一个好的树形结构,要做的很容易很方便的扩展,需要实现由一个服务类,来实现系统内大部需要用到的树形结构,如果每写一棵树,都要去新建一个数据库表,新写一个服务类,那太麻烦,只要我们把数据结构转化为一致的结构,用一个服务类,来生成系统中所有的树形结构,是一件很容易的事情,不管我们使用的树形结构数据是从数据库得来,还是手工写的,还是通过webservice得来的,总之,只要把数据结构转换一致,那一个项目中所使用到的树形结构,只需要一个服务类,别的,什么也不需要做.<br /><br />做一小推广,希望大伙可以接受～～域名（www.faceye.com/cn/net）准备出售.我个人对域名有绝对的拥有权,在中国万网注册,由于没有时间去开发,有兴趣的朋友可以和我联系，也可以合作开发.联系方式：MSN:myecsun@hotmail.com,QQ:82676683, Mail:ecsun@sohu.com<br /><br /><br /><br />1.服务接口:<br /><br /><pre name="code" class="java">package com.faceye.core.service.security.service.iface;

import java.util.List;
import java.util.Map;

import com.faceye.core.service.iface.IBaseHibernateService;
import com.faceye.core.service.security.dao.iface.ITreeDao;
import com.faceye.core.service.security.model.Tree;
/**
 * 
 * @author：宋海鹏
 * @Connection:E_mail:ecsun@sohu.com/myecsun@hotmail.com QQ:82676683
 * @Copy Right:www.faceye.com
 * @System:www.faceye.com网络支持系统
 * @Create Time:2007-9-22
 * @Package com.faceye.core.service.security.service.iface.ITreeService.java
 * @Description:树形菜单控制
 */
public interface ITreeService extends IBaseHibernateService{
    /**
     * 生成json树结构。
     * 默认生成第一级节点的json结构
     * @return
     */
  public String treeJSON();
  /**
   * 根据父节点，当点击时生成下一级节点的json结构
   * @param source
   * @param treeid
   * @return
   */
  public String treeJSON(List source,String treeid);
  /**
   * 根据一个指定的结果集，生成第一级节点json结构
   * 当前source中包含的元素结构为Map结构
   * @param source
   * @return
   */
  public String treeJSON(List source);
  /**
   * 是否有父节点
   * @param source
   * @param treeid
   * @return
   */
  public boolean isHaveParent(List source,String treeid);
  public boolean isHaveParent(List source,Map transedTree);
  public boolean isHaveParent(List source,Tree tree);
  /**
   * 是否有子节点
   * 当前List中包含的元素结构为Tree结构
   * @param source
   * @param tree
   * @return
   */
  public boolean isHaveChildren(List source,Tree tree);

 /**
  * 是否有子节点
  * 当前source中包含的元素结构为Map结构
  * @param source
  * @param treeid
  * @return
  */
  public boolean isHaveChildren(List source,String treeid);
  /**
   * 取得一个集合中的所有根节点
   * 当前source中包含的元素结构为Map结构
   * @param source
   * @return
   */
  public List getRoots(List source);
 /**
  * 取得一个指定节点的直接子节点
  * 当前source中包含的元素结构为Map结构
  * @param source
  * @param treeid
  * @return
  */
  public List getDirectChildrenTrees(List source,String treeid);
 /**
  * 取得一个节点的所有子节点，包括直接子节点和间接子节点
  * 当前source中包含的元素结构为Map结构
  * @param source
  * @param treeid
  * @param result
  * @return
  */
  public List getAllChildrenTrees(List source,String treeid,List result);
  /**
   * 取得一个节点的所有父节点
   * 当前source中包含的元素结构为Map结构
   * @param source
   * @param treeid
   * @param result
   * @return
   */
  public List getAllParentTrees(List source,String treeid,List result);
  /**
   * 当前source中包含的元素结构为Map结构
   * 取得一个节点的直接父节点
   * @param source
   * @param treeid
   * @return
   */
  public Map getDirectParentTree(List source,String treeid);
  
  /**
   * 将Tree对像结构转化为统一的Map结构
   * @return
   */
  public List getTransedTrees();
  /***
   * 根据ID从集合中取得一个节点
   * @param source
   * @param treeid
   * @return
   */
  public Map getTree(List source, String treeid);
  /**
   * 如果节点是全集，根据ID取得一个节点
   * 当前source中包含的元素结构为Map结构
   * @param treeid
   * @return
   */
  public Map getTree(String treeid);
}
</pre><br /><br />说明:<br />基本上每个方法都有说明了,结构规划的不是很好,还需要进一步调整.<br />如果要做功能更丰富的事,不妨再加上几个方法,到子类中实现 ,效果可能会更好一些,不过目前这个接口,基本功能可以满足了.<br /><br />2.接着给出上面接口的实现类.<br /><br /><pre name="code" class="java">package com.faceye.core.service.security.service.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import com.faceye.core.service.controller.BaseHibernateService;
import com.faceye.core.service.security.dao.iface.ITreeDao;
import com.faceye.core.service.security.model.Tree;
import com.faceye.core.service.security.service.iface.ITreeService;
import com.faceye.core.util.helper.StringPool;
/**
 * 
 * @author：宋海鹏
 * @Connection:E_mail:ecsun@sohu.com/myecsun@hotmail.com QQ:82676683
 * @Copy Right:www.faceye.com
 * @System:www.faceye.com网络支持系统
 * @Create Time:2007-9-22
 * @Package com.faceye.core.service.security.service.controller.TreeService.java
 * @Description:树形控制
 */
public class TreeService extends BaseHibernateService implements ITreeService {
	private static List treeSource = null;

	private static List transTreeSource = null;
	

	public String treeJSON() {
		// TODO Auto-generated method stub
		try{
		List trees = this.getTransedTrees();
		String result = this.treeJSON(trees);
		return result;
		}catch(Exception e){
			log.info(">>>>faceye error in method:treeJSON() is"+e.toString());
			return null;
		}
		
	}

	public String treeJSON(List source, String treeid) {

		StringBuffer json = new StringBuffer();
		if (StringUtils.isEmpty(treeid)) {
			return json.toString();
		} else {
			List directChildrenTrees = this.getDirectChildrenTrees(source,
					treeid);
			if (directChildrenTrees != null && !directChildrenTrees.isEmpty()) {
				json.append("[");
				Iterator it = directChildrenTrees.iterator();
				while (it.hasNext()) {
					Map item = (Map) it.next();
					json.append(this.transTree2JSON(source, item));
					json.append(StringPool.CHARACTER_COMMA);
				}
				json.deleteCharAt(json.lastIndexOf(StringPool.CHARACTER_COMMA));
				json.append("]");
			}
		}

		return json.toString();
	}

	public String treeJSON(List source) {
		// 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.transTree2JSON(source, item));
			json.append(",");

		}
		json.deleteCharAt(json.lastIndexOf(","));
		json.append("]");
		return json.toString();
	}

	public boolean isHaveParent(List source, String treeid) {
		// TODO Auto-generated method stub
		boolean result = false;
		if (source == null || source.size() &lt; 1) {
			return result;
		}
		Map currentTree = this.getTree(source, treeid);
		if (currentTree.get(StringPool.TREE_PARENTID) == null) {
			result = false;
		} else {
			Map parentTree = this.getTree(source, currentTree.get(
					StringPool.TREE_PARENTID).toString());
			if (parentTree == null) {
				result = false;
			} else {
				if (source.contains(parentTree)) {
					result = true;
				} else {
					result = false;
				}
			}
		}

		return result;
	}

	public boolean isHaveParent(List source, Tree tree) {
		// TODO Auto-generated method stub
		boolean result = false;
		if (!source.contains(tree)) {
			return result;
		} else {
			if (tree.getParentTree() != null) {
				result = true;
			}
		}
		return result;
	}

	public boolean isHaveChildren(List source, Tree tree) {
		// TODO Auto-generated method stub
		boolean result = false;
		if (tree.getChildrenTrees() != null
				&& !tree.getChildrenTrees().isEmpty()) {
			result = true;
		}
		return result;
	}
/**
 * 开发期间，树不加载入内存
 * @return
 */
	private List getTrees() {
//		
//		if (treeSource == null || treeSource.size() &lt; 1) {
//			treeSource = this.loadAllObjects(Tree.class);
//		}
		return this.loadAllObjects(Tree.class);
	}

	public List getTransedTrees() {
//		return transTreeSource==null? this.transTrees(this.getTrees()):transTreeSource;
		return this.transTrees(this.getTrees());
	}

	private Map transTree(Tree tree) {
		Map result = new HashMap();
		if (tree != null) {
			result.put(StringPool.TREE_ID, tree.getId());
			result.put(StringPool.TREE_NAME, tree.getName());
			if (tree.getParentTree() != null) {
				result.put(StringPool.TREE_PARENTID, tree.getParentTree()
						.getId());
			} else {
				result.put(StringPool.TREE_PARENTID, null);
			}
			if(StringUtils.isNotEmpty(tree.getAction())){
				result.put(StringPool.TREE_ACTION, tree.getAction());
			}else{
				result.put(StringPool.TREE_ACTION, null);
			}
			if(StringUtils.isNotEmpty(tree.getUrl())){
				result.put(StringPool.TREE_URL, tree.getUrl());
			}else{
				result.put(StringPool.TREE_URL, null);
			}
			//result.put(StringPool.TREE_HREF_TARGET, "list-iframe");
		}
		return result;
	}

	private List transTrees(List source) {
		List result = new ArrayList();
		Iterator it = source.iterator();
		while (it.hasNext()) {
			Tree item = (Tree) it.next();
			result.add(this.transTree(item));
		}
		return result;
	}

	public List getAllChildrenTrees(List source, String treeid, List result) {
		// TODO Auto-generated method stub
		List directChildrenTrees = this.getDirectChildrenTrees(source, treeid);
		Map currentTree = this.getTree(source, treeid);
		result.add(currentTree);
		Iterator it = directChildrenTrees.iterator();
		while (it.hasNext()) {
			Map item = (Map) it.next();
			if (this.isHaveParent(source, item)) {
				this.getAllChildrenTrees(source, item.get(StringPool.TREE_ID)
						.toString(), result);
			} else {
				result.add(item);
			}
		}
		return result;
	}

	public List getAllParentTrees(List source, String treeid, List result) {
		// TODO Auto-generated method stub
		Map tree = this.getTree(source, treeid);
		result.add(tree);
		if (tree.get(StringPool.TREE_PARENTID) != null) {
			if (this.getTree(source, tree.get(StringPool.TREE_PARENTID)
					.toString()) != null) {
				this.getAllParentTrees(source, tree.get(
						StringPool.TREE_PARENTID).toString(), result);
			}
		}
		return result;
	}

	public List getDirectChildrenTrees(List source, String treeid) {
		// TODO Auto-generated method stub
		List result = new ArrayList();
		Iterator it = source.iterator();
		while (it.hasNext()) {
			Map item = (Map) it.next();
			if (item.get(StringPool.TREE_PARENTID) != null) {
				if (item.get(StringPool.TREE_PARENTID).toString().equals(treeid)) {
					result.add(item);
				}
			}
		}
		return result;
	}

	public Map getDirectParentTree(List source, String treeid) {
		// TODO Auto-generated method stub
		Map reuslt = null;
		Map tree = this.getTree(source, treeid);
		if (tree.get(StringPool.TREE_PARENTID) != null) {
			reuslt = this.getTree(source, tree.get(StringPool.TREE_PARENTID)
					.toString());
		}

		return reuslt;
	}

	public List getRoots(List source) {
		// TODO Auto-generated method stub
		List result = new ArrayList();
		Iterator it = source.iterator();
		while (it.hasNext()) {
			Map item = (Map) it.next();
			if (!this.isHaveParent(source, item)) {
				result.add(item);
			}
		}
		return result;
	}

	public boolean isHaveChildren(List source, String treeid) {
		// TODO Auto-generated method stub
		boolean result = false;
		if (source == null || source.isEmpty() || source.size() &lt; 1
				|| StringUtils.isEmpty(treeid)) {
			return result;
		}
		Iterator it = source.iterator();
		while (it.hasNext()) {
			Map item = (Map) it.next();
			if (item.get(StringPool.TREE_PARENTID) != null) {
				if (item.get(StringPool.TREE_PARENTID).toString()
						.equals(treeid)) {
					result = true;
					break;
				}
			}
		}

		return result;
	}

	/**
	 * ��ݽڵ�id���ؽڵ�
	 * 
	 * @param source
	 * @param treeid
	 * @return
	 */
	public Map getTree(List source, String treeid) {
		Map result = null;
		if (source.isEmpty() || source.size() &lt; 1
				|| StringUtils.isEmpty(treeid)) {
			return null;
		}
		Iterator it = source.iterator();
		while (it.hasNext()) {
			Map item = (Map) it.next();
			if (item.get(StringPool.TREE_ID).toString().equals(treeid)) {
				result = item;
				break;
			}
		}
		return result;
	}
	
	public Map getTree(String treeid) {
		// TODO Auto-generated method stub
		return this.getTree(this.getTransedTrees(), treeid);
	}

	public boolean isHaveParent(List source, Map transedTree) {
		// TODO Auto-generated method stub
		boolean result = false;
		if (source.isEmpty() || source.size() &lt; 1 || source == null
				|| transedTree.isEmpty() || transedTree == null) {
			return result;
		} else {
			if (transedTree.get(StringPool.TREE_PARENTID) == null) {
				result = false;
			} else {
				Map parentTree = this.getTree(source, transedTree.get(
						StringPool.TREE_PARENTID).toString());
				if (parentTree.isEmpty() || parentTree == null) {
					result = false;
				} else {
					if (source.contains(parentTree)) {
						result = true;
					} else {
						result = false;
					}
				}
			}
		}
		return result;
	}

	private String transTree2JSON(List source, Map tree) {
		StringBuffer json = new StringBuffer();
		json.append("{");
		json.append("\"text\":");
		json.append("\"");
		json.append(tree.get(StringPool.TREE_NAME).toString());
		json.append("\"");
		json.append(",");
		json.append("\"id\":");
		json.append("\"");
		json.append(tree.get(StringPool.TREE_ID).toString());
		json.append("\"");
		json.append(",");
		json.append("\"leaf\":");
		if (this
				.isHaveChildren(source, tree.get(StringPool.TREE_ID).toString())) {
			json.append("false");
		} else {
			json.append("true");
		}
		json.append(",");
		json.append("\"cls\":");
		json.append("\"file\"");
		if(tree.get(StringPool.TREE_ACTION)!=null){
			json.append(",");
			json.append("\"link\":");
			json.append("\"");
			json.append(tree.get(StringPool.TREE_ACTION).toString());
			json.append("\"");
			
			//link target
//			json.append(",");
//			json.append("\"hrefTarget\":");
//			json.append("\"");
//			json.append(tree.get(StringPool.TREE_HREF_TARGET).toString());
//			json.append("\"");
		}else{
			json.append(",");
			json.append("\"link\":");
			json.append("\"");
			json.append("#");
			json.append("\"");
		}
		
		json.append("}");
		return json.toString();
	}

 

	

}
</pre><br /><br />说明:<br />处理树形结构不可避免的要用到递归结构,没有办法的事情,在这里我们可以做一此类似缓存的处理,这样子,就不用过分的去查询数据库了.<br />我个人比较反对每判断一个节点是否有父节点或是否有子节点或是有多少个子节点,或是拿出其所有的子节点,或是拿出其所有的父节点都去查询一次数据库,毕竟,查询数据库性能损耗还是很大的.虽然在oracle和sql server 的新版中,提供了这个递归查询,但能不用,我觉得还是不用,毕竟,树的操作,在一个系统中,是很频繁的,因为一个树的操作,给数据库带来不必的要压力,个人感觉,有些不太好.<br /><br /><br />以上就是后台的大部分代码<br />明天还有一个收尾工作,就要要把这些数据,传到前台去展现.<br />今天先写到这里,明天再写了.
          <br/>
          <span style="color:red;">
            <a href="http://ecsun.javaeye.com/blog/158712#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/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/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Jan 2008 15:57:14 +0800</pubDate>
        <link>http://ecsun.javaeye.com/blog/158712</link>
        <guid>http://ecsun.javaeye.com/blog/158712</guid>
      </item>
      <item>
        <title>一棵完整的异步加载的Ext树 (2) 后台数据结构</title>
        <author>ecsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsun.javaeye.com">ecsun</a>&nbsp;
          链接：<a href="http://ecsun.javaeye.com/blog/158206" style="color:red;">http://ecsun.javaeye.com/blog/158206</a>&nbsp;
          发表时间: 2008年01月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          昨天写了前台生成视图所使用的JS代码,没有涉及到后台,其实后台实现有多种途经,如果你的树不想具备扩展功能,所有的功能都是固定的，不需要将节点加到数据库里面,这个时候,你可以使用txt,js,jsp,xml等任何你喜欢的方式存储你的节点数据,只要你喜欢,就是可以的,个人觉得,存储到xml和数据库中,是最为方便的，扩展也最为容易,特别是存储在数据库中,再结合系统的权限系统,做一棵带有严格权限控制的树,对搭好一个项目的基础框架,是很有用的.<br /><br />做一小推广,希望大伙可以接受～～域名（www.faceye.com/cn/net）准备出售.我个人对域名有绝对的拥有权,在中国万网注册,由于没有时间去开发,有兴趣的朋友可以和我联系，也可以合作开发.联系方式：MSN:myecsun@hotmail.com,QQ:82676683, Mail:ecsun@sohu.com<br /><br />后台的数据库实现方式有很多种,有些人喜欢生成一棵树用几张数据库表,有多少级节点,就用多少个数据库表,这是一种穷举的做法,个人觉得,扩展性不够强,这里我们使用一张数据库表存储所有的节点数据.<br /><br />1.给出实体类的实现:<br /><br /><pre name="code" class="java">package com.faceye.core.service.security.model;

import java.util.HashSet;
import java.util.Set;

import com.faceye.core.componentsupport.dao.model.Domain;
import com.faceye.core.dao.hibernate.model.BaseObject;
/**
 * 
 * @author：宋海鹏
 * @Connection:E_mail:ecsun@sohu.com/myecsun@hotmail.com QQ:82676683
 * @Copy Right:www.faceye.com
 * @System:www.faceye.com网络支持系统
 * @Create Time:2007-9-22
 * @Package com.faceye.core.service.security.model.Tree.java
 * @Description:树形结构实体类
 */
public class Tree extends BaseObject {

  private String action;
  private Tree parentTree;
  private Set&lt;Tree> childrenTrees=new HashSet(0);
  private Domain domain;
 
  private String url;
public Set&lt;Tree> getChildrenTrees() {
	return childrenTrees;
}

public void setChildrenTrees(Set&lt;Tree> childrenTrees) {
	this.childrenTrees = childrenTrees;
}

public Tree getParentTree() {
	return parentTree;
}

public void setParentTree(Tree parentTree) {
	this.parentTree = parentTree;
}

public String getAction() {
	return action;
}

public void setAction(String action) {
	this.action = action;
}

public String getUrl() {
	return url;
}

public void setUrl(String url) {
	this.url = url;
}

public Domain getDomain() {
	return domain;
}

public void setDomain(Domain domain) {
	this.domain = domain;
}
}
</pre><br /><br />说明:<br />1).BaseObject 没有什么好说的,里面有两个属性,id,name,(getter/setter),再加上几个基础的方法.<br />2).Domain    是我为了做全局控制,加上的一个属性,大伙不用理会这个对像,可以不加这个对像.说这个对像的话,涉及到的内容有点多,以后树写完了,分开写了.<br /><br />2.xml映射文件:<br /><br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
&lt;hibernate-mapping>
	&lt;class name="com.faceye.core.service.security.model.Tree"
		table="SYS_TREE">
		&lt;id name="id" unsaved-value="" type="string">
			&lt;column name="id" length="32">&lt;/column>
			&lt;generator class="uuid.hex">&lt;/generator>
		&lt;/id>
		&lt;property name="name" type="string">
			&lt;column name="name" length="50">&lt;/column>
		&lt;/property>
		&lt;property name="action" type="string">
			&lt;column name="action" length="255">&lt;/column>
		&lt;/property>
		&lt;property name="url" type="string">
			&lt;column name="url" length="255">&lt;/column>
		&lt;/property>
		&lt;many-to-one name="parentTree" column="PARENTID"
			class="com.faceye.core.service.security.model.Tree"
			cascade="save-update" />
		&lt;many-to-one name="domain" column="domain_id"
			class="com.faceye.core.componentsupport.dao.model.Domain"
			cascade="save-update" />
		&lt;set name="childrenTrees" cascade="save-update"
			inverse="true">
			&lt;key column="PARENTID" />
			&lt;one-to-many
				class="com.faceye.core.service.security.model.Tree" />
		&lt;/set>
	&lt;/class>

	&lt;query name="queryTrees">
		&lt;![CDATA[ from Tree t ]]&gt;
	&lt;/query>
&lt;/hibernate-mapping></pre><br /><br />说明:<br />1).同样,在这里面不用关注domain对像.<br /><br /><br />实体和xml的结构基本就这样了,数据库结构由这两个文件来生成了,萝卜白菜各有所爱,我喜欢用ant来生成.自己看文档了.
          <br/>
          <span style="color:red;">
            <a href="http://ecsun.javaeye.com/blog/158206#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Jan 2008 09:03:47 +0800</pubDate>
        <link>http://ecsun.javaeye.com/blog/158206</link>
        <guid>http://ecsun.javaeye.com/blog/158206</guid>
      </item>
      <item>
        <title>一棵完整的异步加载的Ext树 (1)  Viewport布局</title>
        <author>ecsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsun.javaeye.com">ecsun</a>&nbsp;
          链接：<a href="http://ecsun.javaeye.com/blog/157922" style="color:red;">http://ecsun.javaeye.com/blog/157922</a>&nbsp;
          发表时间: 2008年01月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前些天写了一些学习ext时写的树的例子,不太全面,有些对不住,现在分几天把生成树的代码写出来,希望可以有一些帮助.<br />这里生成的树,使用一张数据库表生成,可以无限级的分类,与我前期写的使用Struts-menu生成树结构,有较大的不同,同时,每次只取一级节点,每展开一次,再取下一级节点,同时,所有的节点数据加载的内存中,可以有效减少访问数据库的次数,生产环境中,可以加入到cache中,更符合环境要求.<br /><br />做一小推广,希望大伙可以接受～～域名（www.faceye.com/cn/net）准备出售.我个人对域名有绝对的拥有权,在中国万网注册,由于没有时间去开发,有兴趣的朋友可以和我联系，也可以合作开发.联系方式：MSN:myecsun@hotmail.com,QQ:82676683,Mail:ecsun@sohu.com<br /><br />下面我们一步一步开始我们的生成树旅程.<br /><br />1.Viewport布局,Ext里面提供了很多有用的layou,组合使用这些layout,几乎可以得到任何想用的布局样式,在viewport里面,可以使用更多的布局.<br /><br />定义一个带左边栏树形结构的布局,运行效果参考附件.<br /><br /><br />对本布局的说明：本布局的每一部分,都可以根据需求,再进行细致的划分,基本上是目前很多项目采用的较为传统的后台布局格式.<br /><br />生成本布局的EXT代码：<br /><br /><pre name="code" class="java">/**
*Common Java Scripts
*Design By 宋海鹏
*E_mail:ecsun@sohu.com,QQ:82676683,MSN:myecsun@hotmail.com
*www.faceye.com all Right Reserved
*/
Ext.namespace('com.faceye.layout');
Ext.BLANK_IMAGE_URL = 'scripts/ext/resources/images/vista/s.gif';
var com.faceye.layout.Home={
  init : function(){
    Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
       var viewport = new Ext.Viewport({
            layout:'border',
            items:[new Ext.BoxComponent({ // raw
                    region:'north',
                    el: 'north',
                    height:32,
                    html:'&lt;p> north&lt;/p>'
                }),{
                region:'west',
                id:'west-panel',
                title:'West',
                split:true,
                width: 200,
                minSize: 175,
                maxSize: 400,
                collapsible: true,
                margins:'35 0 5 5',
                cmargins:'35 5 5 5',
                layout:'accordion',
                layoutConfig:{
                    animate:true
                },
                items: [
               {
                    title:'Home Navigation',
                    autoScroll:true,
                    border:false,
                    iconCls:'nav',
                    html:'&lt;div id="tree-viewer" style="overflow:auto;height:400px;border:0px solid #c3daf9;">&lt;/div>'
                   }
                ,{
                    title:'Settings',
                    html: '&lt;p>Set The System Property&lt;/p>',
                    border:false,
                    autoScroll:true,
                    iconCls:'settings'
                }]
            },{
                region:'center',
                margins:'35 5 5 0',
                layout:'fit',
                border:true,
                autoScroll:false,
                    items:[{
                    baseCls:'x-plain',
                    layout:'fit',
//                    columnWidth:1,
                    bodyStyle:'padding:0px 0px 0px 0px',
                    items:[{
                    	autoScroll:false,
                    	border:false,
//                        title: 'Content',
                        html: '&lt;iframe id="content-iframe" frameborder="no" style="width:100%;height:99.9%">&lt;/iframe>'
//                        &lt;p>&lt;iframe id="content-iframe" frameborder="no" style="width:100%;height:100%">&lt;/iframe>&lt;/p>
                    }]
                }]
            
            }]
        });
  /**  
   *----------------------------------------------------------
   *开始树开结构的定义
   *Define tree Struct
   *Tree Define By Song Hai Peng
   *----------------------------------------------------------
   */     
    var tree;
    var root;
//判断树形结构是否已生成,如果已生成,将不再再次生成.
    if(!tree){
    var Tree = Ext.tree;
    tree = new Tree.TreePanel(
    {
        el:'tree-viewer',
        autoScroll:true,
        animate:true,
        border:false,
        enableDD:true,
        containerScroll: true,
        rootVisible:false,
        loader: new Tree.TreeLoader({
//从数据库加载树形结构数据
            dataUrl:'/faceye/treeAction.do?method=tree'
        })
    }
    );  
    //Defint node click event,when node is clicked,send data to inner 'div' and show data in
    // set the root node
    root = new Tree.AsyncTreeNode({
        text: 'Common Platform',
        draggable:false,
        id:'source'
    });
    tree.setRootNode(root);
    /**
    *当点击叶子里,将叶子对应的URL内容,在右侧面板中展示.
　　*其中,content-iframe是在上面viewport定义中指定的HTML标签的id,当前树节点对应的URL要在本　iframe　中打开.
    */
     tree.on('click', function (node){ 
      if(node.isLeaf()){ 
         Ext.get('content-iframe').dom.src = node.attributes.link+'&node='+node.id;
         //define grid;
         return true;
     }else{
      /**
       *如是不是叶子节点,将展开目录
       */
        node.toggle();
     }
    }); 
    // render the tree
    }
    tree.render();
    root.expand(); 
  }
};</pre><br /><br /><br />　好了,今天就先到这里,明天写后台的数据结构.
          <br/>
          <span style="color:red;">
            <a href="http://ecsun.javaeye.com/blog/157922#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/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>Mon, 21 Jan 2008 09:16:21 +0800</pubDate>
        <link>http://ecsun.javaeye.com/blog/157922</link>
        <guid>http://ecsun.javaeye.com/blog/157922</guid>
      </item>
      <item>
        <title>show一下偶用Ext做的页面</title>
        <author>ecsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsun.javaeye.com">ecsun</a>&nbsp;
          链接：<a href="http://ecsun.javaeye.com/blog/151279" style="color:red;">http://ecsun.javaeye.com/blog/151279</a>&nbsp;
          发表时间: 2007年12月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          只能加三个附件,再来一篇<br />.
          <br/>
          <span style="color:red;">
            <a href="http://ecsun.javaeye.com/blog/151279#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/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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 27 Dec 2007 16:11:17 +0800</pubDate>
        <link>http://ecsun.javaeye.com/blog/151279</link>
        <guid>http://ecsun.javaeye.com/blog/151279</guid>
      </item>
      <item>
        <title>Show一下偶用Ext2做的示例.</title>
        <author>ecsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecsun.javaeye.com">ecsun</a>&nbsp;
          链接：<a href="http://ecsun.javaeye.com/blog/151277" style="color:red;">http://ecsun.javaeye.com/blog/151277</a>&nbsp;
          发表时间: 2007年12月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这些页面,我主要使用Ext2生成.没有加入太多的个人原素在里面,大多按照文档里的例子写出来的.跟大伙汇报一下工作.还做的不够完善,有些只是做出了个样子先看看图片:
          <br/>
          <span style="color:red;">
            <a href="http://ecsun.javaeye.com/blog/151277#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/92' target='_blank'><span style="color:red;font-weight:bold;">快