﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-samtiger</title><link>http://www.blogjava.net/samyang/</link><description>&lt;br&gt;
&lt;B&gt;QQ:418148757&lt;/B&gt;&lt;br&gt;
&lt;B&gt;Name:yangchuan&lt;/B&gt;&lt;br&gt;
&lt;b&gt;&lt;/b&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2026 04:36:26 GMT</lastBuildDate><pubDate>Tue, 07 Apr 2026 04:36:26 GMT</pubDate><ttl>60</ttl><item><title>Hander与HanderThread，Looper以及MessageQueue和Message之间的关系.</title><link>http://www.blogjava.net/samyang/archive/2012/07/19/383520.html</link><dc:creator>sam.chuan.yang</dc:creator><author>sam.chuan.yang</author><pubDate>Thu, 19 Jul 2012 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/samyang/archive/2012/07/19/383520.html</guid><wfw:comment>http://www.blogjava.net/samyang/comments/383520.html</wfw:comment><comments>http://www.blogjava.net/samyang/archive/2012/07/19/383520.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/samyang/comments/commentRss/383520.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/samyang/services/trackbacks/383520.html</trackback:ping><description><![CDATA[<p>Hander与HanderThread，Looper以及MessageQueue和Message之间的关系.</p>
<p>以上这几个东西的目的是设计来解决位于主线程中的某些操作比较耗时（比如httpclient请求），影响界面响应，而导</p>
<p>致主程序无法处理其他监听事件。致使程序卡死的问题。（界面提示，无响应关闭）</p>
<p>1：Handler对象 中有两个属性，一个是来自于当前线程（或者拥有Looper对象的线程）的threadlocal变量中的Looper</p>
<p>对象和该looper对象中的messagequeue属性。<br />有这两个属性的目的主要是往当前线程的looper对象的messagequeue队列中加入message对象。<br />2：Message对象，也有两个重要的属性，一个是Hander对象，这个handler对象就是把该message加入队列的那</p>
<p>个handler对象，另一个对象就是bundle对象，这个对象的目的就是用来存储数据，相当于一个hashmap对象。</p>
<p>3：Looper对象，有一个重要的属性就是MessageQueue对象，Looper的loop方法，会不断的从该队列中读取message对</p>
<p>象，并调用messgae对象中的Hander属性对象的dispatherMessage（msg）方法，该方法，就是会调</p>
<p>用handler的handleMessage方法，(也就是我们重写的那个方法)。</p>
<p><br />4：MessageQueue对象，管理message的队列对象，它有一个属性就是Message对象，MessageQueue中始终只有一</p>
<p>个message对象，因为message对象是一个链式结构的对象，它的prv和next属性记录了他之前和之后的message对象，所</p>
<p>以，我们调用MessageQueue的next方法就能回的需要的message对象。</p>
<p><br />从hander与Looper以及MessageQueue和Message的关系中我们可以看出来，执行流程如下：<br />&nbsp; 1：有人创建hander对象，并取得对应的Looper对象赋给该hander，通过Hander的sendmessage或post方法将handler</p>
<p>包装到message对象中， 再将该message对象加入到消息队列中。（消息队列就是Looper对象中消息队列属性）<br />&nbsp; 2：线程（管理Looper对象的线程）不断的调用Looper对象中的loop方法，loop方法又从messageQueue队列中获</p>
<p>取Message对象，然后调用该对象里的hander属性对象的dispatherMessage（msg）方法，从而，依次执行我们加入</p>
<p>的handler任务。</p>
<p><br />这就是hander的处理流程。那么HandlerThread是做什么的，他是一个管理Looper对象的线程类。我们的Looper一般来自</p>
<p>于两个地方，一个地方就是主线程的Looper对象，另一个就是我们另外开启一个线程来创建和管理Looper对</p>
<p>象。android提供已经给我们提供了一种这样的一个类，那就是HandlerThread对象。</p>
<p><br />&nbsp;</p><img src ="http://www.blogjava.net/samyang/aggbug/383520.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/samyang/" target="_blank">sam.chuan.yang</a> 2012-07-19 16:59 <a href="http://www.blogjava.net/samyang/archive/2012/07/19/383520.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>山寨版struts2 </title><link>http://www.blogjava.net/samyang/archive/2012/05/02/377205.html</link><dc:creator>sam.chuan.yang</dc:creator><author>sam.chuan.yang</author><pubDate>Wed, 02 May 2012 09:36:00 GMT</pubDate><guid>http://www.blogjava.net/samyang/archive/2012/05/02/377205.html</guid><wfw:comment>http://www.blogjava.net/samyang/comments/377205.html</wfw:comment><comments>http://www.blogjava.net/samyang/archive/2012/05/02/377205.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/samyang/comments/commentRss/377205.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/samyang/services/trackbacks/377205.html</trackback:ping><description><![CDATA[<div><span style="color: #555555; font-family: sans-serif; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; display: inline !important; float: none; ">本框架有以下几个功能：</span><br style="color: #555555; font-family: sans-serif; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; " /><span style="color: #555555; font-family: sans-serif; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; display: inline !important; float: none; ">1：把请求数据封装为参数传给action方法，包括文件的上传。</span><br style="color: #555555; font-family: sans-serif; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; " /><span style="color: #555555; font-family: sans-serif; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; display: inline !important; float: none; ">2：拦截器的配置和功能与struts2一模一样。</span><br style="color: #555555; font-family: sans-serif; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; " /><span style="color: #555555; font-family: sans-serif; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; display: inline !important; float: none; ">3：默认主持几种视图方式：json，velocity。stream流。</span><br style="color: #555555; font-family: sans-serif; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; " /><span style="color: #555555; font-family: sans-serif; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; display: inline !important; float: none; ">4：容易扩展，可以根据需要扩展页面渲染器。</span><br style="color: #555555; font-family: sans-serif; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; " /><span style="color: #555555; font-family: sans-serif; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; display: inline !important; float: none; ">5：请求地址可灵活配置。</span><br style="color: #555555; font-family: sans-serif; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; " /><span style="color: #555555; font-family: sans-serif; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; display: inline !important; float: none; ">6：同struts2一样可以选择配置spring做bean容器。当然也可以不使用。</span><br style="color: #555555; font-family: sans-serif; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; " /><span style="color: #555555; font-family: sans-serif; font-size: 13px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; display: inline !important; float: none; ">7：默认集成了一个小的定时任务和数据库处理器</span></div>源代码和demo下载地址：欢迎大家拍砖<a href="http://sourceforge.net/projects/xsshweb/files/"><br />http://sourceforge.net/projects/xsshweb/files/<br /><br /><br /></a><img src ="http://www.blogjava.net/samyang/aggbug/377205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/samyang/" target="_blank">sam.chuan.yang</a> 2012-05-02 17:36 <a href="http://www.blogjava.net/samyang/archive/2012/05/02/377205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2的小bug</title><link>http://www.blogjava.net/samyang/archive/2012/04/10/373747.html</link><dc:creator>sam.chuan.yang</dc:creator><author>sam.chuan.yang</author><pubDate>Tue, 10 Apr 2012 15:13:00 GMT</pubDate><guid>http://www.blogjava.net/samyang/archive/2012/04/10/373747.html</guid><wfw:comment>http://www.blogjava.net/samyang/comments/373747.html</wfw:comment><comments>http://www.blogjava.net/samyang/archive/2012/04/10/373747.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/samyang/comments/commentRss/373747.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/samyang/services/trackbacks/373747.html</trackback:ping><description><![CDATA[<p>struts2.1.6的时候，有编码问题，主要是因为他把设置编码的那行代码没放在最前面。<br />struts2.2.1的时候，又出来一个低级bug，那就是一直以来模板的加载都是先查找web.xml中查抄templatePath的配置值，然后才从web应用目录查找，最后才是从class和jar中查找。结果在2.2.1中就犯了一个低级bug，那就是永远找不到web应用目录中,代码在：org.apache.struts2.views.freemarker.FreemarkerManager.class中<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />public void init(ServletContext servletContext) throws TemplateException {<br />&nbsp;&nbsp;&nbsp; this.config = createConfiguration(servletContext);</p>
<p>&nbsp;&nbsp;&nbsp; this.config.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);<br />&nbsp;&nbsp;&nbsp; this.contentType = "text/html";</p>
<p>&nbsp;&nbsp;&nbsp; this.wrapper = createObjectWrapper(servletContext);<br />&nbsp;&nbsp;&nbsp; if (LOG.isDebugEnabled())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOG.debug("Using object wrapper of class " + this.wrapper.getClass().getName(), new String[0]);</p>
<p>&nbsp;&nbsp;&nbsp; this.config.setObjectWrapper(this.wrapper);</p>
<p>&nbsp;&nbsp;&nbsp; this.templatePath = servletContext.getInitParameter("TemplatePath");<br />&nbsp;&nbsp;&nbsp; if (this.templatePath == null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.templatePath = servletContext.getInitParameter("templatePath");</p>
<p>&nbsp;&nbsp;&nbsp; if (this.templatePath == null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.templatePath = "class://";<br />&nbsp;&nbsp;&nbsp; this.config.setTemplateLoader(createTemplateLoader(servletContext, this.templatePath));</p>
<p>&nbsp;&nbsp;&nbsp; loadSettings(servletContext);<br />&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />protected TemplateLoader createTemplateLoader(ServletContext servletContext, String templatePath)<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; TemplateLoader templatePathLoader = null;<br />&nbsp;&nbsp;&nbsp; try<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (templatePath.startsWith("class://"))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; templatePathLoader = new ClassTemplateLoader(super.getClass(), templatePath.substring(7));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (templatePath.startsWith("file://"))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; templatePathLoader = new FileTemplateLoader(new File(templatePath));<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; catch (IOException e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOG.error("Invalid template path specified: " + e.getMessage(), e, new String[0]);<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; if (templatePathLoader != null);<br />&nbsp;&nbsp;&nbsp; return new MultiTemplateLoader(new TemplateLoader[] { new WebappTemplateLoader(servletContext), new StrutsClassTemplateLoader() });<br />&nbsp; }<br /><br />不过，这个问题已经在2.3的版本中修复过来了。</p><img src ="http://www.blogjava.net/samyang/aggbug/373747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/samyang/" target="_blank">sam.chuan.yang</a> 2012-04-10 23:13 <a href="http://www.blogjava.net/samyang/archive/2012/04/10/373747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于网站系统优化的疑问，盼解答</title><link>http://www.blogjava.net/samyang/archive/2011/12/22/367040.html</link><dc:creator>sam.chuan.yang</dc:creator><author>sam.chuan.yang</author><pubDate>Thu, 22 Dec 2011 13:49:00 GMT</pubDate><guid>http://www.blogjava.net/samyang/archive/2011/12/22/367040.html</guid><wfw:comment>http://www.blogjava.net/samyang/comments/367040.html</wfw:comment><comments>http://www.blogjava.net/samyang/archive/2011/12/22/367040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/samyang/comments/commentRss/367040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/samyang/services/trackbacks/367040.html</trackback:ping><description><![CDATA[<p>背景：网站中几类变化很小的数据分为几类：第一类，博客文章，新闻，（百培网站中的课程信息，分校信息，地图数据等）<br />　　　第二类：学校各种门户，聚集页面。比如网站的首页；<br />其中第一类：变化最小，一旦产生，变化的可能性就很小。<br />第二种：访问机率很大，时常变化，主要由编辑人员手动维护。</p>
<p>方案１：提供两台ｍｅｍｃａｃｈｅｄ服务器（主从关系，保证数据稳定），将访问这两类数据的方法缓存。在数据变更以后更新缓存即可<br />主要目的是隔离频繁的数据的访问。<br />方案２：将这两类数据都生成静态ｈｔｍｌ文件，通过ｎｇｉｎｘ指定前台缓存访问。缺点是更新数据后要生成新的文件，担心时间久了<br />以后有磁盘碎片。另外多次读取文件，可能有磁盘io影响。如果缓存到前台，后台数据变更了，前台可能很难得到新的版本<br />方案３：将第一类生成静态文件，第二类通过方法缓存起来，看上去好，但是我觉得实现起来比较困难。<br />实际上方案２，３都有一个实现上比较麻烦的地方，那就是所有的页面头部有一个用户的登录信息。如果缓存成文件这样就我目前所想<br />头部的数据只能通过ａｊａｘ来得去了，这样不但多了一次网络io，也不允许页面可以后退。</p>
<p>另外，我做这个方案有两个目的，一种就是提高访问速度，另外就是想从缓存的基础上做数据库读写分离，以便某些统计数据可以白天<br />及时的做</p><img src ="http://www.blogjava.net/samyang/aggbug/367040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/samyang/" target="_blank">sam.chuan.yang</a> 2011-12-22 21:49 <a href="http://www.blogjava.net/samyang/archive/2011/12/22/367040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>iframe自适应高度</title><link>http://www.blogjava.net/samyang/archive/2010/10/21/335763.html</link><dc:creator>sam.chuan.yang</dc:creator><author>sam.chuan.yang</author><pubDate>Thu, 21 Oct 2010 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/samyang/archive/2010/10/21/335763.html</guid><wfw:comment>http://www.blogjava.net/samyang/comments/335763.html</wfw:comment><comments>http://www.blogjava.net/samyang/archive/2010/10/21/335763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/samyang/comments/commentRss/335763.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/samyang/services/trackbacks/335763.html</trackback:ping><description><![CDATA[<p>Ext.onReady(function() {</p>
<p>&nbsp;function reinitIframe(){<br />
&nbsp;&nbsp;var iframe = document.getElementById("frame_content");<br />
&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;var bHeight = iframe.contentWindow.document.body.scrollHeight;<br />
&nbsp;&nbsp;}catch (ex){<br />
&nbsp;&nbsp;&nbsp;&nbsp; var bHeight = 0;<br />
&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;var dHeight = iframe.contentWindow.document.documentElement.scrollHeight;<br />
&nbsp;&nbsp;}catch (ex){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var dHeight = 0;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;if(dHeight!=0 &amp;&amp; bHeight!=0){<br />
&nbsp;&nbsp;&nbsp;var height = Math.min(bHeight, dHeight);<br />
&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;var height = Math.max(bHeight, dHeight);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;if(Ext.isGecko){<br />
&nbsp;&nbsp;&nbsp;height = height+30;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;iframe.style.height =&nbsp; height+"px";<br />
&nbsp;}<br />
&nbsp;window.setInterval(function(){<br />
&nbsp;&nbsp;reinitIframe()<br />
&nbsp;}, 200);<br />
});</p>
<img src ="http://www.blogjava.net/samyang/aggbug/335763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/samyang/" target="_blank">sam.chuan.yang</a> 2010-10-21 09:56 <a href="http://www.blogjava.net/samyang/archive/2010/10/21/335763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ext下类函数定义</title><link>http://www.blogjava.net/samyang/archive/2010/06/29/324724.html</link><dc:creator>sam.chuan.yang</dc:creator><author>sam.chuan.yang</author><pubDate>Mon, 28 Jun 2010 23:07:00 GMT</pubDate><guid>http://www.blogjava.net/samyang/archive/2010/06/29/324724.html</guid><wfw:comment>http://www.blogjava.net/samyang/comments/324724.html</wfw:comment><comments>http://www.blogjava.net/samyang/archive/2010/06/29/324724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/samyang/comments/commentRss/324724.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/samyang/services/trackbacks/324724.html</trackback:ping><description><![CDATA[<div id="blogDetailDiv" style="font-size: 16px">
<p>一：Ext下类函数定义<br />
extcore通过：Ext.extend方法来创建类（构造函数），这个类以下用sb代替。<br />
这个类函数默认会有这些属性（类属性）。<br />
superclass：父类，也就是第一个或第二个参数的prototype属性对象。（具体根据传入的参数类型决定）<br />
superclass(): 父类，(sb.propertype下) 这是一个函数，该函数返回父类的propertype对象<br />
supr():同上<br />
constructor()：构造函数，（sb函数的propertype对象下）实际上引用的就是sb函数自己。<br />
override(o)：重写方法，（sb函数下），调用的是 Ext.override(sb, o);也就是将o中的属性复制到sb的propertype下。<br />
override(o)：重写方法，（sb.propertype下）也就是将o的属性复制到sb的propertype下。<br />
extend(o):(sb函数下),该函数调用的是Ext.extend(sb.o);</p>
<p>Ext.extend(sb, sp, overrides)方法有三个参数，这三个参数有一定的类型要求：<br />
sb 一般情况下是一个类函数。<br />
sp：有两种情况：一种是类函数，另一种是：一个Object对象。<br />
overrides：Object对象，通过Ext.override(sb, overrides);方法覆盖类对象的属性。</p>
<p>通过代码分析，可以看出Ext.extend方法有两个应用：<br />
第一：<br />
因为js没有重构语法，所以我们没办法定义js方法的重构，而上边这个extend方法，可以说是一种重构的实现。因为，我们通过代码的分析，我们可以总结出extend方法的参数传</p>
<p>递方式。(用面向对象语言来表示的话，如下结构)<br />
1:extend(Calss sb,Object sp);<br />
2:extend(Calss sb,Class sp);<br />
3:extend(Calss sb,Class sp,Object overrides);<br />
第一种方式目的是定义一个类函数，这个类函数的父类为sb类函数，属性方法的定义在sp对象中完成。<br />
比如： var Student = Ext.extend(Person,{<br />
&nbsp;&nbsp; &nbsp;constructor:function(old){<br />
&nbsp;&nbsp;this.age=old;<br />
&nbsp;},<br />
&nbsp; &nbsp;name:'sam'}<br />
})<br />
其实通过<br />
&nbsp; if(Ext.isObject(sp)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; overrides = sp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sp = sb;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, arguments);};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 16px; line-height: 28px; font-family: Arial">
<p style="margin: 0px 0px 3px">我们可以看出Ext.extend<br />
</p>
<p style="margin: 0px 0px 3px">只有在sp.constructor==Object.prototype.constructor的时候，才创建并返回一个函数，该函数就一句话，</p>
<p style="margin: 0px 0px 3px">就是调用sb（即父类构造函数）</p>
<p style="margin: 0px 0px 3px">如果sp.constructor==Object.prototype.constructor</p>
<p style="margin: 0px 0px 3px">那么sp应该是这样，是一个对象直接量，或者new Object方式创建的对象，且它们都没有显示定义</p>
<p style="margin: 0px 0px 3px">constructor方法。</p>
<p style="margin: 0px 0px 3px">以下这几种情况都不会有sp.constructor==Object.prototype.constructor。</p>
<p style="margin: 0px 0px 3px">1：var obj = new Object();&nbsp;</p>
<p style="margin: 0px 0px 3px">obj.constructor=function(){...};</p>
<p style="margin: 0px 0px 3px">Ext.extend(sb,obj) //extend 返回的类就是constructor函数</p>
<p style="margin: 0px 0px 3px">2: var obj = {</p>
<p style="margin: 0px 0px 3px">constructor:function(){...}</p>
<p style="margin: 0px 0px 3px">};</p>
<p style="margin: 0px 0px 3px">Ext.extend(sb,obj)&nbsp;//extend 返回的类就是constructor函数</p>
<p style="margin: 0px 0px 3px">3: var obj = new function(){...}(); &nbsp;</p>
<p style="margin: 0px 0px 3px">Ext.extend(sb,obj)&nbsp;//extend返回的类就是这个匿名函数</p>
<p style="margin: 0px 0px 3px">4: var obj = new function(){</p>
<p style="margin: 0px 0px 3px">this.constructor=function(){...}&nbsp;</p>
<p style="margin: 0px 0px 3px">}();</p>
<p style="margin: 0px 0px 3px">Ext.extend(sb,obj)&nbsp;//extend 返回的类就是constructor函数。</p>
<p style="margin: 0px 0px 3px"><br />
</p>
<p style="margin: 0px 0px 3px">总结 ：其实很简单,Ext.extend这么做的目的是要说，定义一个类，构造函数就是constructor方法，如果没显示定义这个方法，那么类就使用父类函数作为新类的构造函数。</p>
<p></span></span><br />
var A=function(){<br />
&nbsp;&nbsp; alert("this is a");<br />
}<br />
var B=function(){<br />
&nbsp;&nbsp; alert("this is b");<br />
}</p>
<p>var SubA = Ext.extend(A,new B());<br />
var subA = new SubA();//这里就会弹出 this is&nbsp; a 的提示。 <br />
第二种方式：修改现有类的类结构<br />
2:extend(Calss sb,Class sp);<br />
这个方法的目的其实之一种包装，是将sb继承于sp下，不管sb是不是ext框架下的类，在这个方法执行后sb就成了ext框架<br />
下的类结构了<br />
3:extend(Calss sb,Class sp,Object overrides);<br />
除了有第二种方法的功能外，还额外的给sb添加或覆盖新的方法或属性<br />
Ext.extend(Person,DongWu); <br />
Ext.extend(Person,DongWu，{sex:'man'}); </p>
</div>
<img src ="http://www.blogjava.net/samyang/aggbug/324724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/samyang/" target="_blank">sam.chuan.yang</a> 2010-06-29 07:07 <a href="http://www.blogjava.net/samyang/archive/2010/06/29/324724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2验证失败后返回input，select中list数据丢失问题</title><link>http://www.blogjava.net/samyang/archive/2010/05/15/321019.html</link><dc:creator>sam.chuan.yang</dc:creator><author>sam.chuan.yang</author><pubDate>Sat, 15 May 2010 01:35:00 GMT</pubDate><guid>http://www.blogjava.net/samyang/archive/2010/05/15/321019.html</guid><wfw:comment>http://www.blogjava.net/samyang/comments/321019.html</wfw:comment><comments>http://www.blogjava.net/samyang/archive/2010/05/15/321019.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/samyang/comments/commentRss/321019.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/samyang/services/trackbacks/321019.html</trackback:ping><description><![CDATA[<p>很多人都在问，struts2验证失败后select中list数据丢失的问题</p>
could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name}。<br />
其实这个问题很简单，大多数人，是通过action跳转到数据编辑页面的，这样做的目的是方便把数据库里的数据，反显到页面。同时也可以通过该action 将select中的列表数据从数据库中取出，传递给页面。但是，这里出现一个问题，那就是在struts2验证失败后返回input的时候，页面不是通过该action的该方法传递回去的（实际上是通过DefaultWorkflowInterceptor拦截器拦截回去的），所以这个时候页面就找不到sleect的数据集合，从而报错。有的人也许会问，修改input的type为redirect，直接掉转到那个action上去，呵呵，这种方法虽然可以保证得到select的数据集合，因为redirect的性质，我们丢失了之前验证的错误信息。所以还是不能解决问题，那么有的人可能说了，那么改用chain就可以了吧，如果改用chain，我们知道，chain是action链的掉转，执行action还是要经过拦截器，所以因为你带有验证错误信息，你还是会被DefaultWorkflowInterceptor拦截器拦截，还是会报错，而且是chain链错。<br />
&nbsp;&nbsp;&nbsp; 其实，可以反一种思路，既然走跳转不成功，我们可不可以在页面上下功夫呢。其实我们的select的list能不能不经过action而直接得到数据呢，是可以的，我们的ognl可以访问某个对象的某个方法，也可以访问某个静态类的静态属性，静态方法。所以我们可以将这些数据通过对象方法访问，也可以通过静态类的静态方法去访问，具体怎么做，根据需要写就可以了。代码就不在这里写了，因为非常简单。
<img src ="http://www.blogjava.net/samyang/aggbug/321019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/samyang/" target="_blank">sam.chuan.yang</a> 2010-05-15 09:35 <a href="http://www.blogjava.net/samyang/archive/2010/05/15/321019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jcreator+tomcat环境配置</title><link>http://www.blogjava.net/samyang/archive/2010/04/07/317639.html</link><dc:creator>sam.chuan.yang</dc:creator><author>sam.chuan.yang</author><pubDate>Wed, 07 Apr 2010 06:40:00 GMT</pubDate><guid>http://www.blogjava.net/samyang/archive/2010/04/07/317639.html</guid><wfw:comment>http://www.blogjava.net/samyang/comments/317639.html</wfw:comment><comments>http://www.blogjava.net/samyang/archive/2010/04/07/317639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/samyang/comments/commentRss/317639.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/samyang/services/trackbacks/317639.html</trackback:ping><description><![CDATA[<p>有的时候因为机器硬件原因，在使用eclipse的时候明显表现不足，其实，仔细想想，我们做web开发的时候，java方面也就是一些非gui类的开发，比如：action，service，dao等等。这样的事情，其实我们用jcreator来做的话，足够了。而jcreator运行起来也就50多m，我想现在再差的硬件环境应该也跑得起来了。那么写程序最重要的是debug，我们怎么来配置debug呢。其实这里用tomcat的远程调试就可以了，我们只需要在tomcat的catalina.bat文件中找到set DEBUG_OPTS，并修改为下边的内容：<br />
&nbsp;&nbsp;&nbsp;&nbsp; set DEBUG_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8019<br />
然后你点击jcreator的run菜单下的attach by socket,在弹出的窗口中的address栏输入tomcat服务器，比如127.0.0.1，然后再其后边的一个输入框输入刚才的端口8019.（注：tomcat用的是6.018解压版，jcreator用的是4.5版）然后点击ok，前提是tomcat已经启动了哈，这个时候jreactor就进入了debug模式，你就可以调试程序了。</p>
<img src ="http://www.blogjava.net/samyang/aggbug/317639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/samyang/" target="_blank">sam.chuan.yang</a> 2010-04-07 14:40 <a href="http://www.blogjava.net/samyang/archive/2010/04/07/317639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DIY mvc框架</title><link>http://www.blogjava.net/samyang/archive/2009/03/15/259814.html</link><dc:creator>sam.chuan.yang</dc:creator><author>sam.chuan.yang</author><pubDate>Sun, 15 Mar 2009 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/samyang/archive/2009/03/15/259814.html</guid><wfw:comment>http://www.blogjava.net/samyang/comments/259814.html</wfw:comment><comments>http://www.blogjava.net/samyang/archive/2009/03/15/259814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/samyang/comments/commentRss/259814.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/samyang/services/trackbacks/259814.html</trackback:ping><description><![CDATA[&nbsp;一直都很犹豫，自己写的东西羞于拿出手来，羞于见世面，主要是觉得，东西太简单，代码太丑陋，功能太少。但一直却又有那么一点点冲动，想找个地方说道说道。就好象自己的孩子再不好，也希望碰面了介绍一下，这是我的娃，男娃。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 起因：08年7月有幸外包到了H公司在L市的bi项目组，更有幸的是，我做了我喜欢的前台编码工作。可是，等我开始正式工作的时候，我才发现我接下来的工作的痛苦。这是一个老系统，利用的是struts+spring+hibernate经典框架，应该说这个东西还是很不错的。就是太麻烦了，我们每次修改一个功能或添加一个功能，至少都要接触到4到6个配置文件，其中业务层的bean需要spring配置两个：为本模块加一bean配置，然后又要将这个配置文件的信息包含到一个总的配置文件里。orm持久层的配置：实体bean需要一个配置，（该系统是利用配置文件读取实体bean的配置文件的），所以也要将这个配置文件包含到另一个文件里。mvc配置文件，该模块需要一个配置文件，当然还需要在web.xml里包含这个配置文件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外还有一点，就是struts1有个缺点就是一个action类配置一个actionForm，要不就是用动态的，要不就是继承它的actionform。这样其实很麻烦，比如我有一个增删查改的页面，我就放到一个action类里去处理，其实在这个类里，我有不同的表单，比如，查询表单，实体表单。针对不同的方法，传入不同的表单对象。还有就是对于以简单的增加删除，很希望，不多做任何事情，直接从页面表单一步就到数据库了。struts1倒是能解决这个问题，但是始终是要多写一个actionform类，还要去配置他。总觉得麻烦。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 综上所述：其实我想解决配置文件多和繁琐的问题，另外就是希望mvc框架提供同一个action可以传入不同的表单实体，同一个action方法可以接受多个不同的表单实体。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我的愚思： 我是这么想的，我觉得，解决配置文件的问题，完全可以利用注解来配置，我们的业务层，持久层完全可以利用注解来解决，甚至我们的mvc其实也可以利用注解来解决。业务层，持久层就不说了，spring+hibernate早就这么干了。至于mvc，其实流行框架也这么干了，不过我就是想DIY一把，利用spring强大的bean管理能力，mvc的action直接就放在spring里了，通过分析请求地址得到bean的名称，从而知道调用哪一个action，分析请求中的特定参数，来确定访问action bean里对应的方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 详细： 整个框架因为小，所以仅需要一个filter就可以了，所有的请求都通过这个filter，在它里面我的主要工作就是分析请求地址，取出它里面含有.do的字串作为action bean的name，然后通过spring返回该action对象。通过取出action参数值，做为此次请求需要调用的action 方法。<br />
在调用实际的action之前我们还需要做一个事情，那就是将提交上来的表单，分门别类的装入到不同的javabean里（实体bean，或查询bean），通过注解访问上边找到的action方法，找到该方法对应的@actionForm注解，提取该方法需要的javabean，迭代出每一个bean的属性名称，以及属性类型，并使用propertyManager所管理的不同类型的属性编辑器将表单里对应的数据转化为属性值存入到javabean里。（当然这里需要将表单里的html元素名称与javabean里的属性名称一致）。最后一步，关于action方法的返回，我做了一个处理器。将返回的数据存入到map中，根据需要做不同的返回。<br />
为了方便处理ajax返回，我也DIY了一个json处理器，将所有对象转化成json字串，供前台页面调用。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 个人体会： 这个框架有几个好处，action 类，不用继承任何类，看上去就是一个简单的java类，方法不再依赖request，response对象，方便做单元测试。同一个方法可以传入不同的javabean对象，可直接将持久层对象与表单数据绑定，不用多写额外的actionForm对象。加上spring的注解功能<br />
基本减少了80%的配置信息，而且不容易因为配置失误而出错。方便做权限管理，通过请求，控制action，控制方法，只要分析请求，就可用权限管路业务。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我的一个案列：后来利用这个框架为客户做了一个考核系统。整体代码应该说好是非常简洁的。比如我的一个简单存储。就如下简单：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<p>@Component("/targetAction")<br />
public class TargetAction {</p>
<p>&nbsp;@Autowired()<br />
&nbsp;@Qualifier("targetService")<br />
&nbsp;private ItargetService itargetService;</p>
<p>&nbsp;@ActionForm(TblBsTargetInfo.class)<br />
&nbsp;public Object add(Object form, HttpServletRequest request,<br />
&nbsp;&nbsp;&nbsp;HttpServletResponse response) {<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itargetService.saveTarget((TblBsTargetInfo) form）;<br />
&nbsp;&nbsp;&nbsp; &nbsp;return new JsonResultHandler(&#8220;ok&#8221;);<br />
&nbsp;}</p>
<p>&nbsp;</p>
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/samyang/aggbug/259814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/samyang/" target="_blank">sam.chuan.yang</a> 2009-03-15 11:32 <a href="http://www.blogjava.net/samyang/archive/2009/03/15/259814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>james邮件服务器的配置</title><link>http://www.blogjava.net/samyang/archive/2008/11/26/242778.html</link><dc:creator>sam.chuan.yang</dc:creator><author>sam.chuan.yang</author><pubDate>Wed, 26 Nov 2008 05:24:00 GMT</pubDate><guid>http://www.blogjava.net/samyang/archive/2008/11/26/242778.html</guid><wfw:comment>http://www.blogjava.net/samyang/comments/242778.html</wfw:comment><comments>http://www.blogjava.net/samyang/archive/2008/11/26/242778.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/samyang/comments/commentRss/242778.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/samyang/services/trackbacks/242778.html</trackback:ping><description><![CDATA[<p>恩，本来工具性东西没有什么可以说的，都比较简单，但是昨天确实很郁闷，网上很多讲james2.1版本的服务器，对于最新版的2.3.1的配置很少有人提及，结果配出来的服务器老是不能通过局域往外部发邮件，一直报530的错误。后来没有办法，读了一下config的配置文件里面的注释才搞明白。<br />
其实james2.3.1的配置只需要三个步骤。<br />
&nbsp;&nbsp;&nbsp; 1：配置&lt;postmaster&gt;Postmaster@localhost&lt;/postmaster&gt;<br />
&lt;servernames autodetect="true" autodetectIP="true"&gt;<br />
&lt;!-- CONFIRM? --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servername&gt;localhost&lt;/servername&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servernames&gt;<br />
将localhost配置为192.168.1.101（也就是你自己局域网的ip，当然你也可以是你的机器名）目的是让局域网中的机器找到你这台服务器<br />
2：&lt;dnsserver&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servers&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--Enter ip address of your DNS server, one IP address per server --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- element. --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;server&gt;127.0.0.1&lt;/server&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;server&gt;221.7.34.10&lt;/server&gt;&nbsp;&nbsp;这是兰州电信的dns<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;server&gt;192.168.1.101&lt;/server&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servers&gt;<br />
&lt;/dnsserver&gt;<br />
配置你服务器的dns ，可以在你这台服务器上ipconfig查看一下。<br />
3：网上的2.1配置没有讲到的一点就是，修改&nbsp;&lt;authorizedAddresses&gt;127.0.0.0/8&lt;/authorizedAddresses&gt;为你局域网广播地址，比如192.168.1.0。目的是为了允许那个网段内的机器可以访问这个邮件服务器<br />
否则你在局域网内其他机器是不能发外网邮件的。它会报530的错误。<br />
<br />
最后一点，就是注释掉下边这句<br />
&lt;mailet match="RemoteAddrNotInNetwork=127.0.0.1" class="ToProcessor"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;processor&gt; relay-denied &lt;/processor&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;notice&gt;550 - Requested action not taken: relaying denied&lt;/notice&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/mailet&gt;<br />
<br />
其实，不用到网上查资料。直接看这个config。xml里边的说明，就已经足够了。</p>
<img src ="http://www.blogjava.net/samyang/aggbug/242778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/samyang/" target="_blank">sam.chuan.yang</a> 2008-11-26 13:24 <a href="http://www.blogjava.net/samyang/archive/2008/11/26/242778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>