<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>JavaEye博客</title>
    <description>Java博客,Ruby on Rails博客,AJAX博客,Agile博客 -- JavaEye做最棒的软件开发交流社区</description>
    <link>http://www.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>kingrank</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kingrank.javaeye.com">kingrank</a>&nbsp;
          链接：<a href="http://kingrank.javaeye.com/blog/238214" style="color:red;">http://kingrank.javaeye.com/blog/238214</a>&nbsp;
          发表时间: 2008年09月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          人生几何？来来去去，太累了！歇歇吧，就这里了，不走了！借用M记一句口头禅：I'm lovin' it!!!<br /><br />来日方长，有兴趣者，可加我！QQ:19331779,MSN:imba2008@gmail.com。非真心者，勿加！加我时，请注明：<span style="color: olive"><u><a href="http://kingrank.javaeye.com" target="_blank">http://kingrank.javaeye.com</a></u></span>！不然，极有可能会被拒绝！！！别自讨没趣！！！
          <br/>
          <span style="color:red;">
            <a href="http://kingrank.javaeye.com/blog/238214#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 08 Sep 2008 00:14:24 +0800</pubDate>
        <link>http://kingrank.javaeye.com/blog/238214</link>
        <guid>http://kingrank.javaeye.com/blog/238214</guid>
      </item>
      <item>
        <title>从女儿那里学到的</title>
        <author>snowyvalley</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://snowyvalley.javaeye.com">snowyvalley</a>&nbsp;
          链接：<a href="http://snowyvalley.javaeye.com/blog/238199" style="color:red;">http://snowyvalley.javaeye.com/blog/238199</a>&nbsp;
          发表时间: 2008年09月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1 快乐其实很简单<br />
女儿要求很简单，一瓶奶，一盒旺仔，一个苹果，女儿就高兴的直笑，让她做什么，她就做什么，早早的到床上等着你送吃的来。<br />
欲望越低，人就越容易满足，也就越容易快乐。<br />
2 保持一个学习的心态<br />
女儿在四楼，很喜欢和小朋友们玩，人家做什么她就做什么，非常善于学习，学会了荡秋千，溜滑梯等等。<br />
三人行，必有我师焉。<br />
3 书是人类的精神食粮<br />
爸爸没事看书，女儿也非常喜欢看书，很小的时候，干脆就吃书，很多小卡片，小书都被吃烂了，都吃到肚子里消化了，<br />
现在是看书了，书里的树呀，房子呀，鸟儿，老鼠，云彩都认识了，还能根据书中画得人物特点判断他们的年龄，性别知道哪些是爷爷，奶奶，哪些是叔叔，阿姨，哪些是哥哥姐姐，哪些是娃娃。<br />
书既可以吃，也丰富了女儿的世界。<br />
4 人之初，性本善<br />
女儿看到书中画了一个面目狰狞的大灰狼，要吃一个老奶奶，女儿脸上露出悲伤的表情，嘴里还喊着奶奶。<br />
女儿的心地是善良的，善恶是分明的。一点也不用去伪装。<br />
5 多一个朋友，多一分快乐<br />
女儿在四楼有很多好朋友，像皮蛋，卡卡，秋月，笑笑，玩的很开心，每天早上像上班一样，一大早就要奶奶抱着到四楼和朋友们玩去了。爸爸妈妈的工作就是工作，女儿的工作就是玩，快快乐乐的玩，和朋友一起玩。<br />
6 伤心是过去时，快乐才是进行时，更是将来时<br />
女儿得不到的东西，会伤心一会，但是有其他东西换时，也马上就高兴起来了，在商场里，看到想要的东西，会哭闹一阵，真的不给买，也很快就破涕为笑，不会太计较，正哭着，一杯饮料就可以忘掉伤痛，快乐起来。<br />
7 多点才艺不是坏事<br />
女儿喜欢跳舞，只要音乐响起，就会翩翩起舞，节奏感很强，音乐的轻重缓急把握的很准，即使是坐在自己的童车里，也会随着音乐晃动起&ldquo;大脑袋&rdquo;。<br />
舞蹈是女儿自己生来会的，但不敢说是天赋，就算是女儿的一点小才艺吧。<br />
8 亮出自己的招牌，善于营销自己<br />
只要给女儿照相，她就会亮出自己的经典pose，把两只小手举过头顶，露出甜甜的微笑，女儿真的很会推销自己，让人家记住自己的经典动作，甜美的微笑。让你把她和快乐的桐桐联系起来。</p>
<p><a href="http://hi.baidu.com/snowyvalley/blog/item/d8823bfbd1d2c9106c22eb44.html" target="_blank">http://hi.baidu.com/snowyvalley/blog/item/d8823bfbd1d2c9106c22eb44.html</a></p>
          <br/>
          <span style="color:red;">
            <a href="http://snowyvalley.javaeye.com/blog/238199#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 07 Sep 2008 23:01:54 +0800</pubDate>
        <link>http://snowyvalley.javaeye.com/blog/238199</link>
        <guid>http://snowyvalley.javaeye.com/blog/238199</guid>
      </item>
      <item>
        <title>拯救疯子--请教一个全新的url mapping思路.</title>
        <author>kgd924</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://deonwu.javaeye.com">kgd924</a>&nbsp;
          链接：<a href="http://deonwu.javaeye.com/blog/238177" style="color:red;">http://deonwu.javaeye.com/blog/238177</a>&nbsp;
          发表时间: 2008年09月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>搞了一天,终于实现了使用javascript来写servelt. 为了简化开发,决定搞一个javascript的框架出来. 其实我个人现在听到框架这个词就不爽. 总觉得现在什么都要框架一把.</p>
<p>&nbsp;</p>
<p>整理了一下思路, 将要做的这个东西, 就是写一个javascirpt放到那儿, 然后根据HTTP请求去执行js, 把这个js的结果返回给客户端. 就这么个东西, 叫软件? 程序? 系统? 算了还是叫框架吧,恶心一下也没有办法了.</p>
<p>&nbsp;</p>
<p>开始还是想学习java/diango/rails之类, 根据url地址选择一个js action执行. 刚做到一半,一个朋友问我你做这个有什么意思,现在框架这么多. 你用javascipt搞一个没什么新意, 现在阿猫阿狗都写框架了, 思路就一个样. 郁闷了半天, 最后想明白了, 我当初做这个js的通用库, 不就是为了无聊了. 管他有没有用途呢. 我本就是一个偏执世界的疯子, 说到技术也不见得比得上那些阿猫阿狗.</p>
<p>&nbsp;</p>
<p>不过我想了一下, 既然是疯子总得和别人不一样吧. 要是还是那些定义一个url 映射规则, 收到请求后, 找到对应的action,运行,返回. 那也不够疯阿.&nbsp; 想了一下决定换一个方式, 收到url请求后, 不去查找action而是运行一个dispather脚本. 根据上下文来决定转向到某个action. 不过想实质上还是差不多, 这下真的没有思路了.</p>
<p>&nbsp;</p>
<p>不知道, 有没有一样疯的人, 能指点一下.<strong> 需要一个全新的url mapping的思路. 不求快,简洁. 只求和现在的不一样.</strong>
</p>
<p>&nbsp;</p>
<p>为了找一个新的思路, 看了人工智能想找一个学习算法, 看了函数编程借鉴规则引擎, 甚至翻了哲学, 英语. 在家里转来转去一天了, 还是没有找到好的办法, 最后只好在这里发表求救了.</p>
          <br/>
          <span style="color:red;">
            <a href="http://deonwu.javaeye.com/blog/238177#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 07 Sep 2008 21:26:17 +0800</pubDate>
        <link>http://deonwu.javaeye.com/blog/238177</link>
        <guid>http://deonwu.javaeye.com/blog/238177</guid>
      </item>
      <item>
        <title>基于AJAX的文件上传显示进度条实现</title>
        <author>plkong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://plkong.javaeye.com">plkong</a>&nbsp;
          链接：<a href="http://plkong.javaeye.com/blog/238159" style="color:red;">http://plkong.javaeye.com/blog/238159</a>&nbsp;
          发表时间: 2008年09月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于Ajax的文件上传要实现的功能要求，要在用户提交了上传按钮请求后，客户端其页面要显示文件上传进度条。</span>
</span>
</p>
<p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其整个功能时序图如图所示。</span>
</span>
</p>
<p class="p0" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><img src="http://www.javaeye.com/upload/attachment/37843/e342e90a-df5c-3179-b9fe-22acff49aaaa.jpg" height="732" alt="基于AJAX文件上传时序图" width="804" />
</p>
<p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;">&nbsp;</p>
<p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简单的说，要实现在客户端显示进度条，需要做的是：当客户端提交上传文件请求后，服务器在上传文件的过程中，将上传进度情况保存到Session中，客户端周期性的发送请求来获取保存在Session中值，以获取上传文件的进度信息。</span>
</span>
</p>
<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 12pt; font-family: '宋体';">1.&nbsp;新建web工程AjaxUpload。</span>
<span style="font-size: 12pt; font-family: '宋体';"></span>
</p>
<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 12pt; font-family: '宋体';">2.&nbsp;将commons-fileupload-1.2.1-bin.zip包中的commons-fileupload-1.2.1.jar文件和commons-io-1.4-bin.zip包中的commons-io-1.4.jar文件拷贝到web工程下的WEB-INF\lib目录下。</span>
<span style="font-size: 10.5pt; font-family: '宋体';"></span>
</p>
<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 12pt; font-family: '宋体';">3.&nbsp;由于本实例涉及到多个类，处理此类问题最好是给相应的类打包进行管理。在web工程src目录下新建一个包com.ncu.upload。</span>
<span style="font-size: 10.5pt; font-family: '宋体';"></span>
</p>
<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 12pt; font-family: '宋体';">4.&nbsp;服务器端实现。</span>
<span style="font-size: 10.5pt; font-family: '宋体';"></span>
</p>
<p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><span style="font-family: 宋体;">首先要创建一个用来保存文件上传状态的类&nbsp;FileUploadStatus。其源码如下：</span>
</span>
</p>
<pre name="code" class="java">package com.ncu.upload;

import java.util.*;

public class FileUploadStatus {
	//上传总量
	private long uploadTotalSize=0;
	//读取上传总量
	private long readTotalSize=0;
	//当前上传文件号
	private int currentUploadFileNum=0;
	//成功读取上传文件数
	private int successUploadFileCount=0;
	//状态
	private String status=&quot;&quot;;
	//处理起始时间
	private long processStartTime=0l;
	//处理终止时间
	private long processEndTime=0l;
	//处理执行时间
	private long processRunningTime=0l;
	//上传文件URL列表
	private List uploadFileUrlList=new ArrayList();
	//取消上传
	private boolean cancel=false;
	//上传base目录
	private String baseDir=&quot;&quot;;
	
	public String getBaseDir() {
		return baseDir;
	}
	public void setBaseDir(String baseDir) {
		this.baseDir = baseDir;
	}
	public boolean getCancel() {
		return cancel;
	}
	public void setCancel(boolean cancel) {
		this.cancel = cancel;
	}
	public List getUploadFileUrlList() {
		return uploadFileUrlList;
	}
	public void setUploadFileUrlList(List uploadFileUrlList) {
		this.uploadFileUrlList = uploadFileUrlList;
	}
	public long getProcessRunningTime() {
		return processRunningTime;
	}
	public void setProcessRunningTime(long processRunningTime) {
		this.processRunningTime = processRunningTime;
	}
	public long getProcessEndTime() {
		return processEndTime;
	}
	public void setProcessEndTime(long processEndTime) {
		this.processEndTime = processEndTime;
	}
	public long getProcessStartTime() {
		return processStartTime;
	}
	public void setProcessStartTime(long processStartTime) {
		this.processStartTime = processStartTime;
	}
	public long getReadTotalSize() {
		return readTotalSize;
	}
	public void setReadTotalSize(long readTotalSize) {
		this.readTotalSize = readTotalSize;
	}
	public int getSuccessUploadFileCount() {
		return successUploadFileCount;
	}
	public void setSuccessUploadFileCount(int successUploadFileCount) {
		this.successUploadFileCount = successUploadFileCount;
	}
	public int getCurrentUploadFileNum() {
		return currentUploadFileNum;
	}
	public void setCurrentUploadFileNum(int currentUploadFileNum) {
		this.currentUploadFileNum = currentUploadFileNum;
	}
	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
	public long getUploadTotalSize() {
		return uploadTotalSize;
	}
	public void setUploadTotalSize(long uploadTotalSize) {
		this.uploadTotalSize = uploadTotalSize;
	}
	
}
</pre>
&nbsp;
<p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于要在客户端要显示进度条，所以在上传过程中服务器端需要监视和维护上传状态的信息，此过程需要处理的数据信息是：不断更新Session中保存的FileUploadStatus实例的信息，如：已经上传的字节数，上传文件的总大小等。FileUpload现在的1.2版本为监视上传进度提供了内建的支持，可以直接继承类ProgressListener，然后重载update()方法，在该方法中添加自己要处理的代码，最后在文件上传处理代码（后面会讲到）中通过为ServletFileUpload对象注册创建的监听类。监听类UploadListener的源代码如下：</span>
</span>
</p>
<pre name="code" class="java">package com.ncu.upload;

import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.ProgressListener;

public class UploadListener implements ProgressListener {
	
	private HttpSession session=null;
	
	public UploadListener (HttpSession session){
		this.session=session;
	}
	/**
	 * 更新状态
	 * @param pBytesRead 读取字节总数
	 * @param pContentLength 数据总长度
	 * @param pItems 当前正在被读取的field号
	 */
	public void update(long pBytesRead, long pContentLength, int pItems) {
		FileUploadStatus fuploadStatus = UploadServlet.takeOutFileUploadStatusBean(this.session);
		fuploadStatus.setUploadTotalSize(pContentLength);
		//读取完成
		if (pContentLength == -1) {
			fuploadStatus.setStatus(&quot;完成对&quot; + pItems + &quot;个文件的读取：读取了 &quot; + pBytesRead + &quot;/&quot;  + pContentLength+ &quot; bytes.&quot;);
			fuploadStatus.setReadTotalSize(pBytesRead);
			fuploadStatus.setCurrentUploadFileNum(pItems);
			fuploadStatus.setProcessEndTime(System.currentTimeMillis());
			fuploadStatus.setProcessRunningTime(fuploadStatus.getProcessEndTime());
		}else{//读取过程中
		       fuploadStatus.setStatus(&quot;当前正在处理第&quot; + pItems+&quot;个文件:已经读取了 &quot; + pBytesRead + &quot; / &quot; + pContentLength+ &quot; bytes.&quot;);
		       fuploadStatus.setReadTotalSize(pBytesRead);
		       fuploadStatus.setCurrentUploadFileNum(pItems);
		       fuploadStatus.setProcessRunningTime(System.currentTimeMillis());
		}
		//System.out.println(&quot;已经读取：&quot; + pBytesRead);
		UploadServlet.storeFileUploadStatusBean(this.session, fuploadStatus);
	}

}
</pre>
&nbsp;
<p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp; 有了前面两个类的基础，下来我们可以动手去实现真正处理整个操作Servlet类。源代码如下。</span>
</span>
</p>
<pre name="code" class="java">package com.ncu.upload;

import java.io.*;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.*;

/**
 * Servlet implementation class for Servlet: UploadServlet
 *
 */
 public class UploadServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
   static final long serialVersionUID = 1L;
   
	 public static final String UPLOAD_STATUS=&quot;UPLOAD_STATUS&quot;;
	 public static final String UPLOAD_DIR=&quot;/upload&quot;;
   
	public UploadServlet() {
		super();
	}  
	
	/**
	 * 从文件路径中取出文件名
	 * @param filePath
	 * @return
	 */
	private String takeOutFileName(String filePath){
		int pos=filePath.lastIndexOf(File.separator);
		if (pos&gt;0){
			return filePath.substring(pos+1);
		}
		else{
			return filePath;
		}
	}
	
	/**
	 * 从request中取出FileUploadStatus Bean
	 * @param request
	 * @return
	 */
	public static FileUploadStatus takeOutFileUploadStatusBean(HttpSession session){
		Object obj=session.getAttribute(UPLOAD_STATUS);
		if (obj!=null){
			return (FileUploadStatus)obj;
		}
		else{
			return null;
		}
	}
	
	/**
	 * 把FileUploadStatus Bean保存到session
	 * @param request
	 * @param uploadStatusBean
	 */
	public static void storeFileUploadStatusBean(
			HttpSession session,
			FileUploadStatus uploadStatusBean){
		session.setAttribute(UPLOAD_STATUS,uploadStatusBean);
	}
	
	/**
	 * 删除已经上传的文件
	 * @param request
	 */
	private void deleteUploadedFile(HttpServletRequest request){
		FileUploadStatus fUploadStatus=takeOutFileUploadStatusBean(request.getSession());
		for(int i=0;i&lt;fUploadStatus.getUploadFileUrlList().size();i++){
			File uploadedFile = new File(request.getRealPath(UPLOAD_DIR)+
					File.separator+fUploadStatus.getUploadFileUrlList().get(i));
			uploadedFile.delete();
		}
		fUploadStatus.getUploadFileUrlList().clear();
		fUploadStatus.setStatus(&quot;删除已上传的文件&quot;);
		storeFileUploadStatusBean(request.getSession(),fUploadStatus);
	}
	
	/**
	 * 上传过程中出错处理
	 * @param request
	 * @param errMsg
	 * @throws IOException 
	 * @throws ServletException 
	 */
	private void uploadExceptionHandle(
			HttpServletRequest request,
			String errMsg) throws ServletException, IOException{
		//首先删除已经上传的文件
		deleteUploadedFile(request);
		FileUploadStatus fUploadStatus=takeOutFileUploadStatusBean(request.getSession());
		fUploadStatus.setStatus(errMsg);
		storeFileUploadStatusBean(request.getSession(),fUploadStatus);
	}
	
	/**
	 * 初始化文件上传状态Bean
	 * @param request
	 * @return
	 */
	private FileUploadStatus initFileUploadStatusBean(HttpServletRequest request){
		FileUploadStatus fUploadStatus=new FileUploadStatus();
		fUploadStatus.setStatus(&quot;正在准备处理&quot;);
		fUploadStatus.setUploadTotalSize(request.getContentLength());
		fUploadStatus.setProcessStartTime(System.currentTimeMillis());
		fUploadStatus.setBaseDir(request.getContextPath()+UPLOAD_DIR);
		return fUploadStatus;
	}
	
	/**
	 * 处理文件上传
	 * @param request
	 * @param response
	 * @throws IOException 
	 * @throws ServletException 
	 */
	private void processFileUpload(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		DiskFileItemFactory factory = new DiskFileItemFactory();
		//设置内存阀值，超过后写入临时文件
		//factory.setSizeThreshold(10240000*5);
		//设置临时文件存储位置
		//factory.setRepository(new File(request.getRealPath(&quot;/upload/temp&quot;)));
		ServletFileUpload upload = new ServletFileUpload(factory);
		//设置单个文件的最大上传size
		//upload.setFileSizeMax(10240000*5);
		//设置整个request的最大size
		//upload.setSizeMax(10240000*5);
		//注册监听类
		upload.setProgressListener(new UploadListener(request.getSession()));
		//保存初始化后的FileUploadStatus Bean
		storeFileUploadStatusBean(request.getSession(),initFileUploadStatusBean(request));

		try {
			List items = upload.parseRequest(request);
			//处理文件上传
			for(int i=0;i&lt;items.size();i++){
				FileItem item=(FileItem)items.get(i);

				//取消上传
				if (takeOutFileUploadStatusBean(request.getSession()).getCancel()){
					deleteUploadedFile(request);
					break;
				}
				//保存文件
				else if (!item.isFormField() &amp;&amp; item.getName().length()&gt;0){
					String fileName=takeOutFileName(item.getName());
					File uploadedFile = new File(request.getRealPath(UPLOAD_DIR)+File.separator+fileName);
					item.write(uploadedFile);
					//更新上传文件列表
					FileUploadStatus fUploadStatus=takeOutFileUploadStatusBean(request.getSession());
					fUploadStatus.getUploadFileUrlList().add(fileName);
					storeFileUploadStatusBean(request.getSession(),fUploadStatus);
					Thread.sleep(500);
				}
			}
		
		} catch (FileUploadException e) {
			e.printStackTrace();
			//uploadExceptionHandle(request,&quot;上传文件时发生错误:&quot;+e.getMessage());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			//uploadExceptionHandle(request,&quot;保存上传文件时发生错误:&quot;+e.getMessage());
		}
	}
	
	/**
	 * 回应上传状态查询
	 * @param request
	 * @param response
	 * @throws IOException
	 */
	private void responseFileUploadStatusPoll(HttpServletRequest request,HttpServletResponse response) throws IOException{
		FileUploadStatus fUploadStatus=(FileUploadStatus)request.getSession().getAttribute(UPLOAD_STATUS);
		//计算上传完成的百分比
		long percentComplete = (long)Math.floor(((double) fUploadStatus.getReadTotalSize()/(double) fUploadStatus.getUploadTotalSize())*100.0);
		System.out.println(&quot;com:&quot;+percentComplete);
		response.setContentType(&quot;text/xml&quot;);
		response.setCharacterEncoding(&quot;UTF-8&quot;);
		response.setHeader(&quot;Cache-Control&quot;, &quot;no-cache&quot;);
		if ( ((long)fUploadStatus.getReadTotalSize() == (long)fUploadStatus.getUploadTotalSize()) || (fUploadStatus.getCancel() == true)){
		response.getWriter().write(fUploadStatus.getStatus().toString()+&quot;success&quot;);
		}else{
			response.getWriter().write(fUploadStatus.getStatus().toString()+&quot;&lt;div class=\&quot;prog-border\&quot;&gt;&lt;div class=\&quot;prog-bar\&quot; style=\&quot;width: &quot;
								+ percentComplete + &quot;%;\&quot;&gt;&lt;/div&gt;&lt;/div&gt;&quot;);
		}
	}
	/**
	 * 处理取消文件上传
	 * @param request
	 * @param response
	 * @throws IOException
	 */
	private void processCancelFileUpload(HttpServletRequest request,HttpServletResponse response) throws IOException{
		FileUploadStatus fUploadStatus=(FileUploadStatus)request.getSession().getAttribute(UPLOAD_STATUS);
		fUploadStatus.setCancel(true);
		request.getSession().setAttribute(UPLOAD_STATUS, fUploadStatus);
		responseFileUploadStatusPoll(request,response);

	}
	
	/**
	 * 在上传文件列表中查找与文件名相关的id
	 * @param request
	 * @param fileName 文件名
	 * @return　找到返回id,否则返回-1
	 */
	private int findFileIdInFileUploadedList(HttpServletRequest request,String fileName){
		FileUploadStatus fileUploadStatus=takeOutFileUploadStatusBean(request.getSession());
		for(int i=0;i&lt;fileUploadStatus.getUploadFileUrlList().size();i++){
			if (fileName.equals((String)fileUploadStatus.getUploadFileUrlList().get(i))){
				return i;
			}
		}
		return -1;
	}
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request,response);
	}  	
	

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		boolean isMultipart = ServletFileUpload.isMultipartContent(request);
		
		if (isMultipart) {
			processFileUpload(request,response);
		}else{
			request.setCharacterEncoding(&quot;UTF-8&quot;);
			
			if (request.getParameter(&quot;uploadStatus&quot;)!=null){
				responseFileUploadStatusPoll(request,response);
			}
			if (request.getParameter(&quot;cancelUpload&quot;)!=null){
				processCancelFileUpload(request,response);
			}
		}
		
	}   	  	    
}</pre>
&nbsp;
<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 10.5pt; font-family: '宋体';"><span style="font-family: 宋体;">至此，服务器端的代码已经基本完成。</span>
</span>
</p>
<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">&nbsp;</p>
<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 10.5pt; font-family: '宋体';"></span>
</p>
<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 12pt; font-family: '宋体';">5.&nbsp;客户端实现</span>
<span style="font-size: 10.5pt; font-family: '宋体';"></span>
</p>
<p class="p0" style="margin-left: 21pt; text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 10.5pt; font-family: '宋体';"></span>
</p>
<p class="p0" style="margin-left: 21pt; text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-size: 10.5pt; font-family: '宋体';"><span style="font-family: 宋体;">由于在上传文件时需要在同一页面显示对应的进度条控件，因此，在提交表单时当前页面不能被刷新。我们可以通过将表单提交至一个隐藏的&nbsp;iframe&nbsp;中来实现。关于Ajax的技术前面讲过，这里就不再细说，直接给出源代码如下：</span>
</span>
</p>
<pre name="code" class="html">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
&lt;title&gt;基于Ajax的上传文件显示进度条&lt;/title&gt;
 &lt;style&gt;
  .prog-border {
  height: 15px;
  width: 205px;
  background: #fff;
  border: 1px solid #000;
  margin: 0;
  padding: 0;
  }
  .prog-bar {
  height: 11px;
  margin: 2px;
  padding: 0px;
  background: #178399;
  font-size: 10pt;
  }
  body{
	font-family: Arial, Helvetica, sans-serif;
	font-size: 10pt;
  }
  &lt;/style&gt;
&lt;script language=&quot;javascript&quot; type=&quot;text/javascript&quot;&gt;
&lt;!--
    //var userName=document.getElementById(&quot;userName&quot;).value;
    //创建跨浏览器的XMLHttpRequest对象
    var timer;
function startListener(){
	var xmlhttp;
	try{
	//IE 5.0 
		xmlhttp = new ActiveXObject('Msxm12.XMLHTTP');
	}catch(e){
		try{
		//IE 5.5 及更高版本
			xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
		}catch(e){
			try{
			//其他浏览器
				xmlhttp = new XMLHttpRequest();
			}catch(e){}
		}
	}
	var progressStatusText = document.getElementById(&quot;progressBar&quot;);
	xmlhttp.open(&quot;get&quot;,&quot;UploadServlet?uploadStatus=true&quot;,true);
	/**此处Header设置非常重要，必须设置Content-type类型，负责会报错误
	*/
	 xmlhttp.setRequestHeader(&quot;Content-type&quot;, &quot;application/x-www-form-urlencoded&quot;);
	 xmlhttp.onreadystatechange = function(){
		if(xmlhttp.readyState == 4){
			if(xmlhttp.status == 200){
			progressStatusText.innerHTML = &quot;&quot;;
			progressStatusText.innerHTML = xmlhttp.responseText;
			var temp = xmlhttp.responseText.indexOf(&quot;success&quot;);
			if (  temp &gt; 0 ){
			window.clearTimeout(timer);
			}else{
			timer = window.setTimeout(startListener,1000);
			}
			}
		}
	}
	xmlhttp.send(null);
}
function startUpload(){
    timer = window.setTimeout(startListener,1000);
	return true;
}
function cancelUpload(){
	var xmlhttp;
	try{
	//IE 5.0 
		xmlhttp = new ActiveXObject('Msxm12.XMLHTTP');
	}catch(e){
		try{
		//IE 5.5 及更高版本
			xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
		}catch(e){
			try{
			//其他浏览器
				xmlhttp = new XMLHttpRequest();
			}catch(e){}
		}
	}
	var progressStatusText = document.getElementById(&quot;progressBar&quot;);
	xmlhttp.open(&quot;get&quot;,&quot;UploadServlet?cancelUpload=true&quot;,true);
	 xmlhttp.setRequestHeader(&quot;Content-type&quot;, &quot;application/x-www-form-urlencoded&quot;);
	//xmlhttp.setRequestHeader(&quot;Content-type&quot;, &quot;multipart/form-data&quot;);
	xmlhttp.onreadystatechange = function(){
		if(xmlhttp.readyState == 4){
			if(xmlhttp.status == 200){
			progressStatusText.innerHTML = &quot;&quot;;
			progressStatusText.innerHTML = xmlhttp.responseText;
			}
		}
	}
	xmlhttp.send(null);
	return false;
}
//--&gt;
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;controlPanel&quot;&gt;
	&lt;!-- 这个是隐藏的&lt;iframe&gt;作为表单提交后处理的后台目标
  		通过表单form的target属性指定该&lt;iframe&gt;将返回信息显示在&lt;iframe&gt;框架中
  --&gt;
  &lt;iframe id='target_upload' name='target_upload' src='' style='display: none'&gt;&lt;/iframe&gt;
	&lt;form id=&quot;fileUploadForm&quot; name=&quot;fileUploadForm&quot; action=&quot;UploadServlet&quot; 
		enctype=&quot;multipart/form-data&quot; method=&quot;post&quot; onsubmit=&quot;return startUpload();&quot; target=&quot;target_upload&quot;&gt;
	&lt;input type=&quot;file&quot; name=&quot;file&quot; id=&quot;file&quot; size=&quot;40&quot;/&gt;&lt;br&gt;
	&lt;input type=&quot;submit&quot; name=&quot;uploadButton&quot; id=&quot;uploadButton&quot; value=&quot;开始上传&quot;/&gt;
	&lt;input type=&quot;button&quot; name=&quot;cancelUploadButton&quot; id=&quot;cancelUploadButton&quot; value=&quot;取消上传&quot; onclick=&quot;return cancelUpload();&quot;/&gt;&lt;br&gt;
	&lt;/form&gt;	
	&lt;div id=&quot;progressBar&quot;&gt;
   &lt;/div&gt;  
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
&nbsp;
<p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp; 至此，整个文件上传的实现到此完成，读者可以在此基础上，发挥自己的创新能力，去完善此实例。</span>
</span>
</p>
<p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;">Good Luck!</p>
<p class="p0" style="margin-left: 21pt; text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">&nbsp;</p>
<p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;">&nbsp;</p>
<p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;">&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://plkong.javaeye.com/blog/238159#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 07 Sep 2008 20:48:19 +0800</pubDate>
        <link>http://plkong.javaeye.com/blog/238159</link>
        <guid>http://plkong.javaeye.com/blog/238159</guid>
      </item>
      <item>
        <title>懈寄生---走出软件作坊：三五个人十来条枪 如何成为开发正规军（十四）</title>
        <author>david_lv</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://david-lv.javaeye.com">david_lv</a>&nbsp;
          链接：<a href="http://david-lv.javaeye.com/blog/238157" style="color:red;">http://david-lv.javaeye.com/blog/238157</a>&nbsp;
          发表时间: 2008年09月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          他渐渐合上流露挂念的双眼时， <br />我意识到自己是一株懈寄生， <br />当他枯萎时， <br />猛然发觉， <br />我失去的， <br />不只是他给的养分............<br /><br />很多人问我，我是怎么知道这么多的，别人怎么成为我？<br />我突然想起了痞子蔡的一篇小说：《懈寄生》。里面有上面的一篇诗句。<br /><br />我回顾了一下我从大学到如今，哪些书影响了我，哪些人影响了，哪些关键事件影响了我？希望能给大家以启发，大家可能在阅读的时候突然有所通灵，你可能也看过同一本书，遇见有人跟你说过同样类似的话，可能遇到过同样类似的情景，但可能就是转眼的一瞬间，一瞬间...<br /><br />虽然已逾10年，但大学期间最影响我的是以下这五本书：<br />1 严援朝的《CCDOS源代码剖析》<br />严援朝前辈的这本书，让我完整的，系统的理解了一个操作系统的工作原理，不仅指出了一个操作系统的各个模块结构，而且还详细的描述了如何实现。在描述的过程中还指出了面临的当时的硬件限制和DOS限制，更指出如何去巧妙的解决。从大学一开始，我学习的内容就比其他同学学的深入。同学们还在跟着老师学习课本，我就已经在阅读剖析真正的业界产品源代码。<br /><br /><br />我有两个启示：<br />A 想去深入了解一门技术，阅读源代码是最好最快的方法，虽然有些艰难，但不断阅读不断研究思考不断做笔记，突破后就能发生质变。如果你从入门到精通，这个时间将非常长，可能你在前进的过程中已经失去兴趣再也不想到达精通了。<br />B 想去深入理解什么产品，就去找制造这个产品的人写的书。这样的书没有歧义，能看出创造者的思路和创造的来龙去脉和他的眼光。不是亲自做的产品，不是亲自写的书。很多就有理解歧义，容易误导人，而且还不深刻，无法一步到位。<br /><br />2 Marco Cantu的《DELPHI高级开发指南》<br />这位老哥真是惊世。这本书在98年就敢卖80块钱。而且是只发行了一次印刷，再未重印过，可见读者之少。虽然写的内容是以DELPHI3为蓝本，但该书的内容直到如今，大部分DELPHI开发人员都无法阅读懂。老哥和DELPHI开发组人员一起工作良久，书中对DELPHI在WINDOWS编程、WINDOWS线程与内存控制、RTTI元数据与反射、COM编程、控件编写、DELPHI开发Internet功能都做了深入的描写。我真正第一步理解WINDOWS编程，恰恰是通过这本书。虽然过去学习VC++，但一直浑浑噩噩，学了许多但没有一下醍醐灌顶的感觉。这本书让我一下子把过去在VC++学习时代没有本质理解的WINDOWS编程突然全联系在了一起，功力大增。而且，我在大学期间就不断编写代码，从函数编程到OO编程，在这里我遇到了面向组件编程，一下子就迷上了属性方法事件这种结构。我疯狂的学习COM组件和DELPHI控件的编程。为了编写控件，又深入学习了RTTI元数据与反射。现在我对SOA、WebService、.netJAVA、组件、OO、函数、WINDOWS的通贯理解，全得益于它。现在这些技术，我都能从DELPHI控件和COM组件中延伸出来理解。虽然10年过去，但技术的变化并不大。<br /><br />李维先生有一本书，叫《Inside VCL(深入核心——VCL架构剖析》。和这位老哥的书的思路挺像。但李维先生的书是在2005年才出版。但李维先生的通俗易懂深入浅出幽默诙谐的写作风格还是非常值得大家一读。<br /><br />就是这一本本很难的书，我一一攻克（我回想大学，老想起一天睡3-4个小时，不断编程打工看书，精神状态不好，有点疯子痴呆状。我的宿舍兄弟怕我出事，老拉着我去和他一起挖蚯蚓钓鱼，说你一握到鱼竿你就什么都不会想了，你就会全神贯注在那根鱼线是否有颤动）。就是这一次次的攻克，让我不断质变。我还没有毕业，就感觉省城这个池子太浅，萌生了要去独自北京闯荡的念头。<br /><br />3 Charles Petzold《WINDOWS程序设计》<br />这又是一位神人。如果开发基于WINDOWS的软件而没有阅读过这位神人的书，真可谓可惜，而且会感觉你入门不正。这位神人不知道是否出身微软，我也没有百度过。好像我记起一个故事，不知道是不是关于这位神人的。说的是此爷曾经写过一本《WINDOWS未公开API》还是什么书，惹的微软要告他泄露微软的技术秘密。但该爷并没有阅读过WINDOWS的源代码。现在，微软开发操作系统，都要请这位爷做顾问。我过去看《DELPHI高级开发指南》理解WINDOWS，只能算是旁门左道。而这本书才是学习WINDOWS开发的正宗之道。该书对内存、线程、文件、窗口、消息、GDI、SOCKET都有非常深入的描写。当初打单身的时候每次阅读都要在星期六日只泡方便面不出被窝一气呵成从头读完。即使阅读多遍，每次阅读都还读的酣畅淋漓；每次阅读，都能对WINDOWS开发有一层的提高。<br /><br />当时还遇到一本好书《TCP/IP原理》。让我对网络编程，网络通信有了很透彻的理解。可惜自己一直从事企业管理软件开发，所以搁浅网络研究。如果有谁从事网络开发，此书必读。<br /><br />4 《微软的秘密》<br />这是一本我在97年买的书。这11年来，我还一直读它。这是一本跟了我最久的书。有关微软的书多不胜举，但能本质的看微软，看一个研发帝国如何研发产品当上软件霸主成为业界事实标准，唯有这本书。这本书从微软灵活的组织结构，专业的专家小组，既懂开发又懂商业的人才，项目管理开发测试三套马车，里程碑的开发阶段、不断推出改进树立标准，不断自我反思自我总结学习改进将的真是有结构有条理。我许多的开发管理思路都从此得到启发和借鉴。我的开发管理体系模型就是从这里一步步从点到线到面到层的不断完善起来。而且，我现在的咨询思想、流程梳理思想、需求调研思想，皆出于此。是我迈进开发管理的导师。<br /><br />5迈克 波特《竞争战略》<br />上学的时候，不仅仅痴迷计算机，对公司管理也非常感兴趣。所以自修学习财务管理的学位。这本《竞争战略》是一本MBA课程。当时此书给我真是打开了另一片世界：原来企业还可以这样做。企业要思考客户，思考竞争对手，思考在产业链上的竞争位置，思考产品差异化。这些思想，都对我以后产品研发和产品运作带来了很大的影响。<br /><br />6 《计算机世界》<br />这不是一本书，这是报纸。我在大学校园，一个北方省城，一个普通的大学，而不是在北京，更不是在什么北大清华。能够了解业界，了解最新的技术，了解世界的各大公司动态，从他们的动态总结他们到底想干什么，想构建怎样的产品战略，想如何和竞争对手竞争，我每个星期盼着报纸的到来，每次阅读都做了大量的笔记和分析。在大学里，我的心中就不仅仅只有程序，还有业界竞争和未来趋势的思考。<br /><br />在校园阶段，最影响我的是我的两个老师，一个是我的Pascal老师，一个是我的操作系统老师。<br /><br />我如今都深深记得我的Pascal老师对我的发火（他其实一直很看好我，因此爱之深恨之切）：你不要老提钱、钱。他嫌我太商业化，而污染了深入研究技术的心灵。<br /><br />他这句话我仍然现在记得，并且在我商业运营产品和公司的过程中不断想起，不断反思。让我在商业和人道之间做着调整和平衡。这句话，让我对师一直肃穆崇敬。<br /><br />我的操作系统老师，是他把我引入了一个正式的操作系统的世界。给全体同学讲完课之余，还给我讲UNIX的操作系统，从结构到源代码到操作系统的发展历史到未来操作系统的演变。让我对操作系统从技术到架构到操作系统的本质意义都有很高的视野。我们俩经常在一起交流操作系统、编译器、开发语言之间的互动影响关系。<br /><br />我出道了，来到了北京。由于我对COM三层架构的深刻理解和实际开发经验，还有对DELPHI的深厚编程功力，我很顺利的就找到了一家公司担任了高级开发人员。在北京，更大的世界展露在了我的世界。我在海淀图书城战栗世界之大技术之广阔，于是一个猛子就扎了进去。一本本好书，让我如坐火箭，一年之中就成为了公司最顶尖的技术人员。<br /><br /><br />以下是我刚出道最影响我的火箭之书：<br /><br /><br />1RonSoukup的《MicrosoftSQLServer7.0技术内幕》<br />假如没有这本书，我的技术世界就会缺一半。可见这本书给我的影响之大。我一直从事企业管理软件信息化开发。企业管理软件的开发，一直以来就有两个很重要的技术，一个是数据库，一个是组件技术。我过去用DLL，然后用COM，然后用EJB，然后用WebService，直到如今的SOA，都是组件技术的发展。而数据库，我却一直固守在SQLSERVER的天下。很多人学习SQLSERVER，其实是在学习T-SQL，知道很多SQLSERVER的SQL函数而已，会写复杂的取数SQL和SP而已。而我一开始进入的数据库世界就是数据库查询引擎、数据库存储引擎、数据库的数据内部存储格式、数据库事务、数据库日志、数据库锁。这本书都是从原理和实现的角度上来讲。其实这本书是以SQLSERVER为蓝本，真正讲的是一个商业数据库产品的架构和实现。如果你阅读完此书，然后你阅读SQLITE源代码，再阅读MySQL的源代码，相信你也能创造一个数据库产品。<br /><br />本书作者是SQLSERVER的开发组组长。相当于SQLSERVER之父，一直把SQLSERVER从无到有到跻身世界三大商业数据库之列（ORACLE、DB2、SQLSERVER。过去辉煌的Infomix、Sybase如今已经风采不在）。本书的序也是神人级别，Jim Gray。吉姆 格雷，但愿我没有拼错他的名字。此爷为计算机界最高科学奖项“图灵奖”的获得者。因为此爷提出了一个概念：数据库事务。<br /><br />2Box Don 《COM本质论》<br />我的技术世界的另一半。我是幸运的，我居然能遇到我技术世界的两个支柱中最重要的两本书。此爷大家估计都知道，此爷对COM的理解，比微软自己还深刻。此爷还制定了SOAP，是WebService的通信基础。没有此书，我仍然停留在COM编程应用的层次。有了此书，我的组件技术世界才算有了组件体系。我才彻底理解了面向对象、组件，以及如今的WebService、SOA、WCF、SCA、SDO。即使以后出了比SOA和WebService更更新的技术，我都能很快理解它的规范和它为什么要这样做。<br /><br />《设计模式》我也买了一本，我也做架构，但它对于我的架构影响并不大。可能我是个伪架构师，只为了解决企业软件具体问题，而非搭建一个钢筋水泥的框架。所以此书我和《基业常青》放在一起，有时候拿出来看看，把他们看作前进的目标。但现在的路，还无法到达，我还需要继续走。<br /><br />3李维《DELPHI高级开发》[台湾版]<br />名字我忘了，实在抱歉，网上也找不到。当年我们为了用DELPHI开发COM+（当年DELPHI5开发COM+有内存泄露和线程并发问题，我们甚至联系了DELPHI开发组），但是业界却没有这方面深度的书。我们最后到台湾把李维先生的书买回大陆。此书对DELPHI开发COM和性能调整做了深度的描写。估计大部分DELPHI开发者都没有阅读过本书。本书也没有在大陆销售过，我们看的也是繁体文字。没有这本书，我们就会割裂，一边在深入研究DELPHI，一边在深入研究微软COM技术，但两者的结合就是有问题。李维先生给我们做了完美的结合，给我们一代产品的研发带来了扎实的技术指导。<br /><br />4王玉荣《流程管理》<br />在公司工作的时候，我已经很快成为最顶尖的开发人员。我能解决大家遇到了各种性能问题，内存问题，线程问题，接口变动抽象问题、数据库设计问题等等。但是，一个产品如何畅销，如何更能正规化，如何更能提升产品价格和形象，如何让产品更能帮助客户业务竞争力，我当时在苦苦思索解决方案。王玉荣女士的《流程管理》来到了我的眼前。这本书为我打开了咨询之路。原来软件实施还能这样做。<br />我们过去开发软件，都是开发完去实施做数据准备，做培训，做推动上线，做服务技术支持。但从未有正规的方法体系，也未有咨询师的实施方法，所以实施显得很土，产品形象提不起来。<br /><br />5《谁动了我的奶酪》<br />当年我还是个快乐的程序员，不断思考着解决着产品开发实施服务全过程的各种问题。从高级开发到实施经理到开发经理做了个遍。直到遇到了这本书。这本书让我惊觉，我的职业规划是什么？我以后要如何发展？<br />过去，我一直有个梦想就是成为中国一流的开发人员，但是我曾经接近这个目标的时候，让我遇到了此书。此书给我敲了一个大脑壳。<br /><br />我的奶酪是什么？我的奶酪什么时候会变质？我的下一块奶酪如何得到？我究竟想要什么样的奶酪？<br /><br />于是，我的职业规划开始的思索，我的职业发展开始走上了计划性，而不是随老板随公司逐流。<br /><br />6《CORBA企业解决方案》<br />没有这本书，我的开发我的产品可能还叫一群程序员写出来的软件。我们虽然号称做着企业级的软件，也在实践着企业级的解决方案，与EMC、IBM、HP、飞利浦、微软成为合作伙伴一同工作，但我们的软件仍然还像是程序员的软件。<br /><br />没有这本书，我不会对COM，对EJB，对中间件，对ESB，对SOAP、对如今的.NET战略有如此透彻及长远的思考。此书对对象注册、定位、消息、事务、安全、容器、异构、持久化、池化、用户会话、可伸缩性、负载平衡、容错都有深刻而体系的描写。此书，从气质到内容，无一不透出企业级解决方案的大气与广度。<br /><br />你做的是企业级应用吗？看看这本书。<br /><br />7陈宏刚 林斌 凌小宁 张益肇 熊明华 张亚勤 的《软件开发的科学与艺术》<br /><br />《微软的秘密》有些站在产业的角度上看微软，而且主要看微软这个商业公司如何运作。而这本书更深入了描述了微软的软件开发是如何做的。张亚勤的提纲携领，指出.NET战略，服务化、全球化、互联网化。张益肇的软件生命周期、凌小宁的软件设计场景，熊明华的软件项目开发管理都是我多次汲取养分的章节。其中很多做法都被我引入我自己的日常软件设计开发管理当中。很有实用性。<br /><br /><br />在我出道和升级的过程中，我仍然要感谢两个人，他们深刻影响了我职业发展：<br />1我的师傅。我的公司有个企业文化或企业制度，就是每个人都需要指定一个师傅。有什么问题都可以问他。他也会监督你的工作，带领你快速融入团队融入公司融入当前任务。他不仅教会了我在职业化公司如何工作如何生存，还教了我很多看人看事的道理。<br /><br />我当年也禁不住互联网泡沫的诱惑，看人家263住在嘉里中心，而且工资给的巨高，我想跳槽。于是请教我的师傅。<br /><br /><br />他给我的答案是：如果你想挣钱，那么你就去吧。如果你想发展，那么你就留下来。<br /><br /><br />于是，我想了想，就留了下来。2001年，国内互联网泡沫破裂。N多互联网公司搬出嘉里中心。<br /><br />还有一个小例子，我现在居然也记得很清楚。有一次，我和师傅闲聊起买车，我说我想买个黑颜色车。他问我为什么？我说黑颜色大气，很有企业感。我问他你想买什么颜色的车？他说：红颜色。因为红颜色在黑夜安全，别人都能很容易看见。<br /><br />对，这就是我师傅。可见他的性格与情操。<br /><br />2李维先生。李维最影响我的不是他写的繁体书，而是两件事情。<br /><br /><br />第一件，李维先生在2002年，在CSDN的撮合下，在机械工业出版社的支持下，来大陆进行了一次演讲。他不仅讲到了技术的演变，业界的竞争背景，还讲到了未来的技术发展，程序员的职业规划。短短一个下午，当时北京沙尘暴，但当时的场面比沙尘暴更热烈。李维先生的这次演讲让我更深刻体会了业界的发展与软件人的发展。我的一个多年好友评价我说：你就是从那一年一下变了。变得成熟了，有广度有深度有眼光有战略了，再也不是过去那个莽撞的意气风发的年轻人。<br /><br />第二件，李维先生推荐我去borland中国公司。尽管我婉言谢绝了李维先生的好意，我在此仍然要好好谢谢他。我感觉我自己的全部知识和实战，都是来源于我时时刻刻接触的企业和客户，他们是我所有灵感的源泉。没有他们的问题，我的技术可能没有用武之地，我也不会知道一项技术的客户价值到底有多大，我也不会知道这项技术的缺陷和应用点。我一旦脱离这个环境，让我去介绍纯技术的产品，可能我很快就会被架空，变成一个职业的产品经理，以产品讲产品了。很多外企的产品经理都有这个问题。<br /><br />再次我还要感谢5个网站，在上面我认识了很多朋友，也吸收了很多养分<br /><br /><br />delphibbs让我认识了很多DELPHI界的好友，也提升了我很多的DELPHI技术（左轻侯、张晓龙、蒋涛、曹晓刚、千中元、cakk、温柔一刀、王寒松、周爱民、soul、宋兴烈等等，好友太多了）；<br /><br />csdn让我看到最新的软件业动态和最新的技术（上面N多牛人）；<br /><br />donews让我看到了IT业界和互联网业界（林兴陆、谭智、刘韧、麦田、何田、老邢就是在那里认识的）；<br /><br />topoint让我和业界第一线的企业管理软件实施人员近距离交流探讨（白鱼谭、白菜、王甲佳都是很好的朋友）；<br /><br />amteam让我打开了咨询之门（一叶知秋和萧秋水是很欣赏的两位）<br /><br /><br />我的大学基础，我的出道成长，书和人不断影响着我，让我变得成熟和深厚，但是仍然有一些书让我变的更加张弛有度。没有这些书，我只能是个技术人员，或是个项目经理，我可能无法把控一艘企业大船的航向。我通过学习这些书和这些人，让我有了出海远航的能力。<br /><br /><br />它们是：<br />1 二月河的《雍正皇帝》<br />企业由各种各样的人组成。每个人或者每个利益团伙都有各自的目的和利益，而企业也有自己的每年每月的盈利目标和任务。这是一条大船，在大海上，会遇到各种各样的情况，所以每个人的位置，每个人的际遇也在不断变化。可能你会成为船长，也可能突然被大副扔下海。我常常感觉管理像是小时候玩的挑木棍的游戏。每个动作都必须轻，都必须看细节看仔细，不能动其他的任何一个小木棍，你要小心观察哪个小木棍可以挑起来。你要小心翼翼的挑起来。<br /><br /><br />雍正皇帝给我的感觉就是这样。所以我常常阅读，常常思考企业现状，平衡每个人，包括各个部门的经理，包括客户，包括老板，包括手下。<br /><br />2 程东升的《华为真相》<br />《雍正皇帝》说的是皇帝的事情。皇帝有生杀大权，而且也有古代忠君思想。所以还是有一定局限性的。而现代企业，老板不能决定员工的生死，而且员工也不必忠诚于老板。双方都是互相依存的关系。所以《华为真相》更有借鉴性。华为处于快速发展的通信产业，面对的是国际化的竞争，还面临国内政策的变化，华为的新人管理、员工管理、股权管理、接班人之争、领导人思想，每次我心浮气燥的时候，我都看一看，都能让我静下心，不喜功，不消沉。国内为企业立传的很多，包括《联想风云》《蓝色海尔》《蒙牛内幕》等等，很多，但这本是最客观的。<br /><br />李维先生写的《Borland传奇》也非常好。过去风传Borland要卖给Bea、要卖给Oracle。没想到如今BEA也被Oracle收购了，Borland把IDE独立成了CodeGear，最近又被一家不知名的公司收购。唉，有时候时也运也命也。花落谁家，人生就是这样不可测，你只有能掌握的时候尽量掌握，但命运来袭时也要保持好自己，如果真的失败，那也只能是命运的安排。一声叹息。<br /><br />3 老外的《毛泽东》<br />老外名字我忘了。但毛泽东能带来一无所有的中国旧社会民众，从无到有的直到建立新中国，其中面临多少斗争，沉沉浮浮多少，最终成就一代伟人。读古鉴今，互相思考共性和差异，更让我客观的理解如今的中国社会和中国人行，在操盘企业和客户管理和销售突破上，都有很好的心态。<br /><br />4《程序员》杂志<br />每期都买《程序员》杂志。每年还要买合订本。这本杂志让我不断能跟踪业界最前沿的技术和动态发展，给我在具体产品规划发展中起了很大的参考帮助。<br /><br />5《财富》杂志<br /><br />由于我处的公司也是一个典型的中小型企业。整天处理部门间、部门内、客户的各种异常，天天日复一日。就感觉企业只能做这么大，再往大做就不知道怎么走了。所以，经常阅读《财富》杂志。上面的文章并不能解决我做大的问题，也不能给我做大的启发，因为上面大部分的文章都是跨国公司，很多都是成立上百年的顶级跨国公司的案例。之所以阅读，就是希望能把自己的胸怀与眼光放长远了，不要拘泥于现实，要往远看，不要在这个小盘子中斗争这点蝇头小利。心有多大，舞台就有多大。<br /><br />要感谢的人，目前只有一个，我的老板。<br /><br />我的老板，他在平衡利益、平衡团队、拿捏权力、客户突破、销售契机、战术迂回、战略创新、管理创新都比我高很多。我从他那里学习了很多，虽然他也把我多次上上下下，有时核心有时踢出，有时捧起有时打压，有时多疑有时亲信。但这么多年来，是他对我的“揉练”让我沉稳成熟许多，把握这艘航船更加坚定更加胸有成竹处惊不乱。<br /><br />这些书，这些人，在我10年的工作生涯中影响着我，让我不断提升自己的技术层次、管理层次、运营层次、眼光与胸怀。<br /><br />很多人评论说：你的运气真好，总能遇到关键的人和关键的书，你一点弯路都没走啊。我怎么就找不到关键人和关键书呢，问我有什么方法没有？<br /><br />我想给大家讲一个故事，可能对大家有启发：<br /><br />说的是两个朋友，一个是品赏蟋蟀的专家，可以凭声音就知道是什么蟋蟀，而且厉害不厉害。而另一个是个商人。他们俩在田野里散步。蟋蟀专家掉了一个铜板，但是蟋蟀专家并没有意识到，他的商人朋友为他捡了起来。蟋蟀专家奇怪的问：你怎么知道我掉了铜板？他的商人朋友说：因为你喜欢蟋蟀，所以你老关注蟋蟀，所以你只能听见蟋蟀的声音。而我喜欢钱，我老关注钱，所以我只能听见钱的声音，而听不到蟋蟀的声音。<br /><br />就是这个道理。你关注什么，你就会得到什么。想想你自己持续关注过一个东西或事物10年么？<br /><br />还有些网友问我是怎么读书的，怎么读了这么多的书？这个问题我的朋友也问过他，他很想学习我。他看一本书，往往3个月也看不完，看完也讲不清结构，而我和他一块去西单图书大厦，都是逛同样的时间，我总是能找到很好的书，也能很快找到书的重点，并且能给大家回来后复述并讲清自己的观点。<br /><br />关于读书技巧，有一点心得：<br /><br />第一，我经常梳理自己的知识体系，技术的，管理的，业务的。不断梳理，所以心中的主线、重点、未来趋势、空白弱点，都一清二楚。所以我读书都是由针对性的，我从不走马观花。我知道自己的所需，我也知道自己的拥有。而且每看自己需要的内容，就很容易和自己现有的知识体系对接在一起。<br /><br />第二，我读书就和猕猴吃食一样，先看书的目录，然后发现自己感兴趣的章节，直接找自己关注的问题答案。如果发现这本书有不少自己想看的，就会买回去，细看，并且做笔记。先把自己想看的看完，做完笔记。然后再思考目录，看看自己遗漏什么没有。然后再根据筛选再读一遍遗漏的地方。然后就把书从头到尾都看个遍。对于自己已经明白的就很快翻过去。<br /><br />第三，从小到大，我都保持着读书的爱好，一本好书在手，经常饭不吃觉不睡。在大学如此，上班后单身也是如此，现在结了婚也是如此。所以家人也理解我这个爱好，给我提供了很多的条件帮助，让我能安心读书。在大学的时候，也是每天睡3-4个小时，打工编程赚钱（有时编程太累就把键盘推到一边，头上盖好西服就趴那里睡着了），并且还把财务管理和计算机两个学位拿下来，还阅读深度技术书籍。即使工作后单身，也常常周六日通宵达旦的看书。现在做了高层经理人，负责的事情多了许多，出差也多了不少。但每次都是上洗手间的时候也拿本书，飞机上也带本书。每当《财富》和《程序员》来了的时候，晚上拿回家，吃晚饭收拾完家把孩子打发睡觉后，自己起来偷偷阅读直到全部读完才睡觉。这么多年，睡眠时间短都这么多年过来了，好像我一直是这样，也就习惯了。
          <br/>
          <span style="color:red;">
            <a href="http://david-lv.javaeye.com/blog/238157#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 07 Sep 2008 20:39:49 +0800</pubDate>
        <link>http://david-lv.javaeye.com/blog/238157</link>
        <guid>http://david-lv.javaeye.com/blog/238157</guid>
      </item>
      <item>
        <title>生成效率最高的树？</title>
        <author>pengyun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pengyun.javaeye.com">pengyun</a>&nbsp;
          链接：<a href="http://pengyun.javaeye.com/blog/238151" style="color:red;">http://pengyun.javaeye.com/blog/238151</a>&nbsp;
          发表时间: 2008年09月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          树是系统中经常用到的控件，在数据量大的情况下，加载的速度通常就会比较慢！要想提高加载速度，最好就是分层的从服务端读取数据，分层加载页面的树结点。下面的树利用ajax技术，通过soap协议调用webService，读取数据库的数据；由dojo提供的树控件方法生成树。加载页面时，只读取、生成第一、二层的树结点；当用户第一次展开某结点时，再次从服务端读取该结点的子结点，由于使用了AJAX技术，每次访问服务端时，不再需要刷新网页，使得页面仍然会保持很好的稳定性。<br /><pre name="code" class="javascript">
&lt;script>
           dojo.require("dojo.data.ItemFileWriteStore");
           dojo.require("dijit.Tree");
           dojo.require("dojo.parser");
&lt;/script>
        
&lt;script type="text/javascript" src="../js/soapclient.js">&lt;/script>//包括soap访问webService的方法，网上就可以下得到
&lt;script type="text/javascript" >
var pagenumber=0;
var pagesize=0;
var orderBy='0';
var treesDate ={ label:'name',identifier:'eId',items:data};
var popStore = new dojo.data.ItemFileWriteStore({data: treesDate});
var myModel = new dijit.tree.ForestStoreModel({
      store: popStore,
      rootId: "0",
      rootLabel: "分类",
      childrenAttrs: ["children"]
     });        
var _tree=dijit.byId("tree"); 
/*
读取webService数据方法
codeID:父结点id,
chitem：父结点item,
layerInt: 标记展开的层数
layerSum: 总共要读取的层数
*/       
function getTreeNodes(codeID,chitem,layerInt,layerSum){
            var pl = new SOAPClientParameters();
             pl.add('codeID',codeID) ;
             pl.add('pageNumber',0) ;
             pl.add('pageSize',0) ;
             pl.add('orderBy',0) ;
             SOAPClient.invoke(url, "getCodeByParCodeID", pl, false,  function GetEnu_callBack(ul, soapResponse){
               var pInfo = {
                        parent: chitem,  
                        attribute: "children" 
                     };
               if(ul!=null && ul.length>0 ){
                     for(var i = 0; i &lt; ul.length; i++){  
                                  var ulo=ul[i];
                                  var newitem=popStore.newItem({name: ulo["ns:name"],type:ulo["ns:parCode"] ,eId:ulo["ns:id"],haveChild:"0"}, pInfo);//haveChild=0:初始，1:有子结点，2:无子结点
                                  if(layerInt&lt;layerSum)getTreeNodes(ulo["ns:id"],newitem,layerInt+1,layerSum);
                                  
                             }
                      if(chitem!=null){
                            popStore.setValue(chitem,"haveChild","1"); 
                            var node = dijit.byId("tree")._itemNodeMap[chitem.eId];
                            node._updateItemClasses(node.item);
                      }
                }else{
                    popStore.setValue(chitem,"haveChild","2");  
                }       
          });
        
        }
        
/*
展开指定结点、指定层的树节点方法
tree：展开的树
treeNode：展开的树结点node
layerInt: 标记展开的层数
layerSum: 展开指定结点下几层
*/
function expandAllChildrenNode(tree,treeNode,layerInt,layerSum){
          tree._expandNode(treeNode);
          var childrenArray=treeNode.getChildren();
          for (var i=0; i&lt;childrenArray.length; i++){
             if(layerInt&lt;layerSum) expandAllChildrenNode(tree,childrenArray[i],layerInt+1,layerSum);
             //if(layerInt==layerSum&&tree.model.mayHaveChildren(childrenArray[i].item))childrenArray[i].
             if(layerInt==layerSum)childrenArray[i]._updateItemClasses(childrenArray[i].item);
          }
        }              
        
   
   
function init(){
        getTreeNodes(0,null,0,2);//打开页面时读取、加载两层树结点
      expandAllChildrenNode(_tree,_tree.rootNode,0,1);//默认展开只一层，加载第二层结点的目的主要是为了获得第一层结点是否可展开的信息
/*
当用户展开结点时加载该结点的子结点的子结点
*/      
   dojo.connect(dijit.byId("tree"), "_onExpandoClick", function(message){
                       var node = message.node;
                       var ch2node=node.getChildren();
                       for (var i=0; i&lt;ch2node.length; i++){ 
                         if(ch2node[i].getChildren().length==0&&ch2node[i].item.haveChild=="0"){
                          var ch2item =ch2node[i].item;
                          getTreeNodes(ch2item.eId,ch2item,0,1);
                        }
                      }
             });   
}//END INIT
            
 dojo.addOnLoad(init);
&lt;/head>
&lt;body class="tundra">
&lt;div id="tree" showRoot="true" persist="false" dojoType="dijit.Tree"  store="popStore" labelAttr="name"  childrenAttr="children"  model="myModel" >&lt;/div> 
&lt;/body>&lt;/html>
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://pengyun.javaeye.com/blog/238151#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 07 Sep 2008 20:21:46 +0800</pubDate>
        <link>http://pengyun.javaeye.com/blog/238151</link>
        <guid>http://pengyun.javaeye.com/blog/238151</guid>
      </item>
      <item>
        <title>chrome冲着谁？</title>
        <author>feng19</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://feng19.javaeye.com">feng19</a>&nbsp;
          链接：<a href="http://feng19.javaeye.com/blog/238148" style="color:red;">http://feng19.javaeye.com/blog/238148</a>&nbsp;
          发表时间: 2008年09月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="entry">
<p><span style="font-size: small;">　　google chrome发布了，表面说是挑ie的，看门道的认定是先搞firefox的。</span>
</p>
<p><span style="font-size: small;"><br />
</span>
</p>
<p><span style="font-size: small;">　　我看google首要目的是促进浏览器进化，以免将来flash、silverlight这些东东成了新平台
。浏览器对多媒体处理是欠缺的，根本无法与flash、silverlight相比，在后台技术泛滥的年代，用户交互设计是至关重要的，看看apple的
成功就知道了。只要还是js、html、css这些技术，还是浏览器这个平台，google无所畏惧，就怕新平台出现，那时google要抓点信息，就要
看新平台脸色了，那是一个巨大的威胁。</span>
</p>
<p><span style="font-size: small;"><br />
</span>
</p>
<p><span style="font-size: small;">　　google对chrome的市场份额不太关心。重要的是让其他浏览器厂商上火，加速浏览器开发，以便webapp快速稳定应用，因为google
本身就是
webapp大家，最关心的是webapp。对于浏览器插件开发，他是不屑的，那代表浏览器不够强，webapp的不够行，才需要插件弥补，可见那些赌
chrome会弄插件平台，将firefox挑下马的，有机会将裤子输掉。</span>
</p>
<p><span style="font-size: small;"><br />
</span>
</p>
<p><span style="font-size: small;">　　google目标是web
application，现在的浏览器还远远不够。chrome是就站出来立个榜样，google告谕大家：未来的浏览器要有更牛的vm，更快的渲染引
擎，更安全的环境，要时刻记住浏览器是应用平台，不是xx工具，所以每个标签都是一个进程，跟平常的桌面程序一样。</span>
</p>
<p><span style="font-size: small;"><br />
</span>
</p>
<p><span style="font-size: small;">　　体验chrome一把，是的，速度快点，界面简洁，其他就没什么了。更多感觉这个chrome是临时拼凑的：看看名字，那是firefox的一个内部协议名；看看他的网络设置，用的是ie的&ldquo;internet
选项&rdquo;；渲染引擎，用的是webkit；v8又是收购的吧。没有贬低google的意思，商业就是这样的，最小投入最大产出，更何况chrome只不过是
用google战略里的道具，本身是没什么的。(这一段，可用一篇来写，变成极好的炒作文章，题目就是&ldquo;google
chrome，抄袭之王&rdquo;，那点击率还不是狂飙，大小网站还不哗啦啦地&ldquo;原创&rdquo;，一笑)</span>
</p>
<p><span style="font-size: small;"><br />
</span>
</p>
<p><span style="font-size: small;">　　再说说js的vm。v8曰我的速度是firefox，safari的10倍，是ie的56倍，firefox3.1的tracemonkey又号称是v8的4倍。从数字上看，是向中国地方政府部门学习，有望成为数盲（关于数盲这个概念，王小波的黑铁时代好像有详细阐述）。从技术手法上看，是现代经济
学的嫡传弟子，选择自己需要的数据，然后可以得到自己想要的任何结果。v8，tracemonkey比以前的vm更快是肯定的，因为用的是jit。至于数字，应该是营销吧。</span>
</p>
<p><span style="font-size: small;"><br />
</span>
</p>
<p><span style="font-size: small;">　　对于我来说，网速才是第一位的，js执行速度无关紧要，当然对于美国人来说，网速 is no
problem。网速慢还是可以忍受，无法克制的是看到电信的&ldquo;用户xxx，你好！
如果你看到本页面&mdash;&mdash;&rdquo;，是的，这会让人崩溃，还好，我抵抗力够强，这个时候我的心情和李敖当年在蒋家监狱中的心情是一样的。</span>
</p>
<p><span style="font-size: small;"><br />
</span>
</p>
<p><span style="font-size: small;">　　后记：本文先于&ldquo;google chrome，抄袭之王&rdquo;出世，放在独立博客上。孤魂野鬼一个，没人理，也够无聊的，就向娱乐圈靠拢一下，用抄袭话题在javaeye炒作炒作，吸引些读者去个人博客，世事难料，流量没带来（抄袭一文不够劲爆？），自己倒成了javaeye的初级记者，放弃了个人博客。可悲啊！谁让自己那么虚荣呢。</span>
</p>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://feng19.javaeye.com/blog/238148#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 07 Sep 2008 20:03:10 +0800</pubDate>
        <link>http://feng19.javaeye.com/blog/238148</link>
        <guid>http://feng19.javaeye.com/blog/238148</guid>
      </item>
      <item>
        <title>第一章：Dao初接触</title>
        <author>meanboy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://meanboy.javaeye.com">meanboy</a>&nbsp;
          链接：<a href="http://meanboy.javaeye.com/blog/238136" style="color:red;">http://meanboy.javaeye.com/blog/238136</a>&nbsp;
          发表时间: 2008年09月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">软件开发没有银弹，但是却还有那么多人在执着的寻找这颗银弹。</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ２００５年底，小X接触java刚满一年，但是经过几个中小型项目的锻炼，已经可以独立完成诸如新闻发布、评论、投票之类的模块了。（这里完成的意思为功能点可用）但是小X对接口、设计模式、解藕之类的概念均处于白纸阶段。某天早上，小X正在为公司里新接的一个项目拼命码代码，小X的部门经理Y刚完成了自己在股市里的交易，闲来无事，在网上四处瞎逛，直到有一篇文章吸引了他的注意。那篇文章详细介绍了基于ibatis框架的Dao层使用，以及Dao层可以让业务逻辑不必再关心持久层操作细节的好处。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &ldquo;我们公司不正是在用ibatis么？看来我们的软件又能更上一层楼了。&rdquo;Y经理露出了微笑。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下午，Y经理把他手下的程序员都叫进了会议室，当然，也包括小X。&ldquo;这次叫大家来主要是让大家了解一下Dao层，我们将会从下个项目开始使用这个模式。&rdquo;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Y经理慷慨激昂的把早上自己看到的那篇文章完整的复述了一遍。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &ldquo;大家都了解了么？&rdquo;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &ldquo;恩，差不多了。&rdquo;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Y经理很满意大家的答案，相信自己的能力在大家心目中又上了一个台阶，代价仅仅是上午喝一杯咖啡的时间而已。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &ldquo;把业务逻辑和持久层的细节分离具体有什么好处呢？老大，感觉比以前要多写代码阿，这不是更麻烦了么&hellip;&hellip;而且每次的项目开发时间都这么紧&hellip;&hellip;&rdquo;小X疑惑的问道，当然后半句的音量只有他自己能听得到。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &ldquo;假如我们以后需要把数据存储到xml文件，而不是数据库里的时候，我们使用这种模式的话只需要添加一个基于xml的Dao实现类，并修改一下ibatis的Dao配置文件就可以了。&rdquo;Y经理微笑的回答道。&ldquo;散会。&rdquo;Y经理第一个走出了会议室。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &ldquo;下午股市行情应该不错吧，再这样下去没多久，我就可以去买套排屋了。哈哈哈。&rdquo;Y经理的情绪有点激动了。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &ldquo;老大这么说挺有道理的，但是我怎么还是感觉有些地方不对劲呢...&rdquo;小X慢慢的回到了自己的座位上。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &ldquo;啊！！还有个功能点还没完成呢！明天要检查阿！&rdquo;自己桌面上的Eclipse编辑器把小X拉回了现实。&ldquo;开什么会嘛！又要加班了！！！&rdquo;小X愤愤的想到。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;残酷的现实让小X完全忘记了下午的会议内容，但是不论小X有没有意识到，Dao模式都已经走进了他的职业生涯。</p>
          <br/>
          <span style="color:red;">
            <a href="http://meanboy.javaeye.com/blog/238136#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 07 Sep 2008 18:47:04 +0800</pubDate>
        <link>http://meanboy.javaeye.com/blog/238136</link>
        <guid>http://meanboy.javaeye.com/blog/238136</guid>
      </item>
      <item>
        <title>jCT 第三版简要文档</title>
        <author>achun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://achun.javaeye.com">achun</a>&nbsp;
          链接：<a href="http://achun.javaeye.com/blog/238089" style="color:red;">http://achun.javaeye.com/blog/238089</a>&nbsp;
          发表时间: 2008年09月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p style="font-family: courier new;">SVN已经更新.最新下载：<a href="http://jsct.googlecode.com/svn/trunk/jCT/jct.js" target="_self">jCT最新版本</a>
</p>
<p style="font-family: courier new;">&nbsp;</p>
<p style="font-family: courier new;"><span style="font-size: small;"><span style="font-weight: bold;">jCT全称</span>
:</span>
</p>
<p style="font-family: courier new;"><span style="font-size: small;"><br />
</span>
</p>
<p style="margin-left: 40px; font-family: courier new;"><span style="font-size: small;"><span style="color: #993300;"><strong><a id="Common_Templates_(_)">javaScript</a>
 Common Templates</strong>
</span>
&nbsp; 就是 <span style="font-weight: bold; color: #990000;">javaScript 共用模板</span>
<br />
</span>
</p>
<p style="margin-left: 40px; font-family: courier new;"><span style="font-size: small;"><br />
</span>
</p>
<p style="margin-left: 40px; font-family: courier new;"><span style="font-size: small;">属于WEB开发<span style="font-weight: bold;">模板技术</span>
的一种.jCT用javaScript写成,通常工作于浏览器客户端.</span>
</p>
<p style="font-family: courier new;"><span style="font-size: small;"><br />
</span>
</p>
<p style="font-family: courier new;"><span style="font-size: small;"><span style="font-weight: bold;">基本功能</span>
:</span>
</p>
<p style="font-family: courier new;"><span style="font-size: small;"><br />
</span>
</p>
<p style="margin-left: 40px; font-family: courier new;"><span style="font-size: small;">作为模板技术,完成<span style="font-weight: bold; color: #000000;">后台数据</span>
与<span style="font-weight: bold;">htm模板(jCT模板)</span>
的组装,得到最终<span style="font-weight: bold;">表现</span>
代码是jCT的基本功能.</span>
</p>
<p style="font-family: courier new;"><span style="font-size: small;"><br />
</span>
</p>
<p style="font-family: courier new;"><span style="font-size: small;"><span style="font-weight: bold;">设计理念</span>
:</span>
</p>
<p style="font-family: courier new;"><span style="font-size: small;"><br />
</span>
</p>
<p style="margin-left: 40px; font-family: courier new;"><span style="font-size: small;">作为模板技术,jCT仅仅负责把<span style="font-weight: bold;">模板javaScript对象</span>
化.并提供<span style="font-weight: bold;">数据组装文法.</span>
</span>
</p>
<p style="margin-left: 40px; font-family: courier new;"><span style="font-size: small;">从文法形式上看jCT的文法极其类似php,aps,jsp的文法,也就是<span style="font-weight: bold;">嵌入html模板文法</span>
</span>
</p>
<p style="margin-left: 40px; font-family: courier new;"><span style="font-size: small;">这种文法,事实上是嵌入了javaScript脚本,采用完全<span style="font-weight: bold;">与javaScript脚本一致</span>
的语法来书写模板,达到了与javaScript完全兼容.</span>
</p>
<p style="margin-left: 40px; font-family: courier new;"><span style="font-size: small;">因此jCT本身的功能并<span style="font-weight: bold;">不直接参与获取后台数据</span>
.与<span style="font-weight: bold;">如何实施表现.</span>
这些功能可以通过书写模板的时候直接写入进去,反正都是javaScript脚本.或者采取其他的手段从外部控制.</span>
</p>
<p style="margin-left: 40px; font-family: courier new;"><span style="font-size: small;">由于在实际的应用中业务行为可能很复杂,jCT提供了<span style="font-weight: bold;">子模板对象</span>
的支持.从jCT对象的最终形式 javaScript 对象来说,这就形成了一棵<span style="font-weight: bold;">对象树</span>
,而且这个对象树的组织完全是由模板代码决定.<br />
</span>
</p>
<p>&nbsp;</p>
<p style="font-family: courier new;"><span style="font-size: small;"><span style="font-weight: bold;">调用</span>
:</span>
</p>
<p style="font-family: courier new;"><span style="font-size: small;"><br />
</span>
</p>
<p style="margin-left: 40px; font-family: courier new;"><span style="font-size: small;">jCT本身没有规定必须如何调用jCT,对应用来说,jCT就是一个根据提供的文本模板来生成jCT实例对象的<span style="font-weight: bold;">模板编译器</span>
</span>
</p>
<p style="margin-left: 40px; font-family: courier new;"><span style="font-size: small;">而这个可以组织数据得到表现代码的实例对象具体都做了哪些和<span style="font-weight: bold;">应用有关的动作</span>
,完全有模板的内容决定.毕竟所有的执行代码都在模板里,都是使用者<span style="font-weight: bold;">自己写</span>
的.<br />
</span>
</p>
<pre name="code" class="js">var instance=new jCT(txt);//构建jCT对象,仅仅准备基础数据，txt就是模板源文件
instance.Build();//这才是真正的自构建</pre>
<p><span style="font-family: courier new,courier; font-size: small;"><strong>执行 :</strong>
</span>
</p>
<p style="margin-left: 40px; font-family: courier new;"><span style="font-size: small;">构建完成了，如何执行呢?事实上根本就不存在执行这个说法,因为所谓的执行就是去运行txt模板源代码里定义的方法，由于代码是使用者自己写的，都定义了什么方法，书写者是知道的，比如说</span>
<span style="font-size: small;">模板源代码里定义了方法hello,要执行hello的话就<br />
instance.hello();就行了。jCT是如何做到这样的，请继续看。<br />
</span>
</p>
<p style="margin-left: 40px; font-family: courier new;"><span style="font-size: small;"><br />
</span>
</p>
<p><span style="font-size: small;"><span style="font-weight: bold;">jCT是如何构建实例的</span>
:<br />
<br />
</span>
</p>
<div style="margin-left: 40px; font-family: courier new;"><span style="font-size: small;">事实上,jCT并<span style="font-weight: bold;">不直接构建</span>
出完整的<span style="font-weight: bold;">jCT实例</span>
,jCT仅仅是<span style="font-weight: bold;">生成</span>
一个可以<span style="font-weight: bold;">自构建的对象</span>
.这个对象什么时候需要构建,什么时候需要执行(装配数据得到表现代码),jCT并不负责,这就需要应用里有一个<span style="font-weight: bold;">触发自构建对象</span>
进行构建和执行的开始.<br />
jCT这样做的原因是考虑到实例有可能<span style="font-weight: bold;">重新构建</span>
,所以干脆把这个构建的任务交由实例对象自己完成.<br />
<br />
</span>
</div>
<p><span style="font-size: small;"><span style="font-weight: bold;">jCT实例如何运行</span>
:<br />
<br style="font-family: courier new;" />
</span>
</p>
<div style="margin-left: 40px;"><span style="font-size: small;">因实例是自构建的,在实现上要<span style="font-weight: bold;">保留一些成员</span>
函数和成员对象来满足自构建的需求.最重要的保留成员有:</span>
<br />
</div>
<div style="margin-left: 40px; font-family: courier new;"><ol>
<li><span style="font-size: small;"><span><strong>Fn</strong>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-weight: bold;">保留对象</span>
,供jCT实例使用,不能对Fn已有的属性修改<br />
</span>
</span>
</li>
<li><span style="font-size: small;"><span><strong>Build</strong>
&nbsp;&nbsp; </span>
<span style="font-weight: bold;">保留方法</span>
<span>,模板构建</span>
<span>方法</span>

</span>
</li>
<li><span style="font-size: small;"><span><strong>GetView</strong>
</span>
&nbsp; </span>
<span style="font-size: small;"><span style="font-weight: bold;">保留方法</span>
</span>
<span style="font-size: small;"><span>,获取装配数据后的表现代码</span>

</span>
</li>
<li><span style="font-size: small;"><strong><span>Extend</span>
</strong>
</span>
<span style="font-size: small;">&nbsp;&nbsp; </span>
<span style="font-size: small;"><span style="font-weight: bold;">保留方法</span>
</span>
<span style="font-size: small;"><span>,</span>
</span>
<span style="font-size: small;"><span>递归扩展jCT对象和子jCT对象</span>
</span>
</li>
<li><span style="font-size: small;"><strong><span>RunNow</span>
&nbsp;&nbsp; </strong>
<strong>特例方法</strong>
<span>,用户可以自实现这个方法,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此方法</span>
</span>
<span style="font-size: small;">在<span style="color: #800000;"><strong>Build后</strong>
</span>
<strong>,<span style="color: #800000;">Extend中</span>
</strong>
自动运行,</span>
</li>
<li><span style="font-size: small;"><span><strong>ExecChilds</strong>
(childs{},functionname String)</span>
</span>

<span style="font-size: small;">
</span>
<span style="font-size: small;"><span style="font-weight: bold;">保留方法</span>
</span>

<span style="font-size: small;"><span>提供了便捷的操作</span>
</span>
<span style="font-size: small;"><span>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行childs </span>
<span>jCT对象</span>
<span>,某个方法,默认是Exec方法</span>
</span>
</li>
<li><span style="font-size: small;"><span><strong>Buildchilds</strong>
(childs[]</span>
</span>
<span style="font-size: small;">
</span>
<span style="font-size: small;"><span><strong></strong>
</span>
</span>
)<span style="font-size: small;"><span style="font-weight: bold;">保留方法</span>
</span>

<span style="font-size: small;"><span>提供了便捷的操作</span>
</span>
<br />
<span style="font-size: small;"><span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行childs </span>
<span>jCT对象</span>
<span>的Build方法,默认所有的childs </span>
<span>jCT对象</span>
</span>
</li>
</ol>
<span style="font-size: small;"><strong>RunNow</strong>
就是最重要的方法了,是实例开始运行的起点,可以在模板源代码里直接定义此方法来运行.由于这个方法是在Build后运行的,而且可以自定义,那所有复杂的变化都会围绕这个的用法发生变化<br />
<strong>GetView</strong>
</span>
<span style="font-size: small;"><span> 方法内部的代码就是经过jCT编译转化过来的使用者自己写的模板代码（非成员部分）。当你实作一个jCT实例并<strong>Build()</strong>
后，你可以通过GetView.toString(),查看jCT到底把模板编译成了什么，同时也就明白了jCT的原理，明白jCT的方法具有很高的效率.</span>
</span>
<div style="margin-left: 40px;">
</div>
</div>
<div style="margin-left: 40px; font-family: courier new;">
<strong><span style="font-size: small;"><span>Extend </span>
</span>
</strong>
<span style="font-size: small;"><span>对jCT的影响也是巨大的,</span>
</span>
<span style="font-size: small;"><span>原本jCT的文法虽然不算复杂,把嵌入式javascript语句和html混合的代码看
上去很纷乱,引入Extend后,这些嵌入的javascript语句可以从html模板中分离出来。这样将形成这样的文件结构：</span>
</span>
</div>
<div style="margin-left: 40px; font-family: courier new;"><ol>
<li><span style="font-family: courier new,courier; font-size: small;">嵌入</span>
<span style="font-family: courier new,courier; font-size: small;">javasctipy代码的</span>
<span style="font-size: small;"><span style="font-family: courier new,courier;">jCT</span>
</span>
<span style="font-family: courier new,courier; font-size: small;">模板</span>
<span style="font-family: courier new,courier; font-size: small;">文件,通常就是html文件啦<br />
&nbsp;&nbsp; 依照jCT的文法形式书写<strong>嵌入式</strong>
</span>
<span style="font-family: courier new,courier; font-size: small;"><strong>javasctipy</strong>
代码,<br />
&nbsp;&nbsp; 这些代码经过jCT编译后会得到<strong>jCT实例对象<br />
&nbsp;&nbsp; </strong>
</span>
<span style="font-family: courier new,courier; font-size: small;">重要的是里面含有</span>
<span style="font-family: courier new,courier; font-size: small;">RunNow的定义，RunNow里有<br />
&nbsp;&nbsp; <strong>this.Extend(obj);</strong>
<br />
</span>
</li>
<li><span style="font-family: courier new,courier; font-size: small;">用来扩展jCT实例对象的javascript文件<br />
&nbsp;&nbsp; 因为jCT实例对象有自扩展</span>
<span style="font-size: small;"><span>方法</span>
<strong><span>Extend</span>
</strong>
<span>，所以这种文件里面直接写下一个期望得到jCT实例对象就行了，这个对象就是上面</span>
</span>
<span style="font-family: courier new,courier; font-size: small;"><strong>this.Extend(obj);</strong>
里的obj，例如：<br />
</span>
<pre name="code" class="js">var obj={
  RunNow:function(){alert('hello jCT');},
  Exec:function(D){document.body.innerHTML=this.GetView(D);}
}</pre>
</li>
</ol>
</div>
<div style="margin-left: 40px; font-family: courier new;"><span style="font-family: courier new,courier; font-size: small;">jCT就是通过这样的方法完成扩展.</span>
</div>
<div style="margin-left: 40px; font-family: courier new;"><br />
</div>
<div style="font-family: courier new;"><span style="font-size: small;"><span style="font-weight: bold;">jCT文法定义</span>
:</span>
</div>
<div style="font-family: courier new;"><br />
</div>
<div style="font-family: courier new; padding-left: 30px;"><span style="font-family: courier new,courier; font-size: small;">首先jCT的语法标记是可以自己定义的，当然jCT已经为您预先定义了3种最常用的语法标记,Fn.Tags定义了这个，具体代码如下：</span>
</div>
<div style="font-family: courier new; padding-left: 30px;">
<pre name="code" class="js">Tags:{//几种不同的模板定义风格
	comment:{//注释标签风格
		block:{begin:'&lt;!---',end:'--&gt;'},//语法块标记
		exp:{begin:'+-',end:'-+'},//取值表达式
		member:{begin:'/*+',end:'*/'},//定义成员语法标记
		memberend:{begin:'/*-',end:'*/'},//定义成员结束语法标记
		clean:{begin:'&lt;!--clean',end:'/clean--&gt;'}//清理标记
	},
	script:{//脚本标签风格
		block:{begin:'&lt;script type=&quot;text/jct&quot;&gt;',end:'&lt;/script&gt;'},
		exp:{begin:'+-',end:'-+'},
		member:{begin:'/*+',end:'*/'},
		memberend:{begin:'/*-',end:'*/'},
		clean:{begin:'&lt;!--clean',end:'/clean--&gt;'}
	},
	code:{//code标签风格
		block:{begin:'&lt;code class=&quot;jct&quot;&gt;',end:'&lt;/code&gt;'},
		exp:{begin:'+-',end:'-+'},
		member:{begin:'/*+',end:'*/'},
		memberend:{begin:'/*-',end:'*/'},
		clean:{begin:'&lt;!--clean',end:'/clean--&gt;'}
	}
}
</pre>
</div>
<div style="font-family: courier new; padding-left: 30px;">&nbsp;</div>
<div style="font-family: courier new; padding-left: 30px;"><span style="font-size: small;">也就是说jCT的有4类文法标记</span>
</div>
<div style="font-family: courier new; padding-left: 30px;"><ol>
<li><span style="font-size: small;">语句块block:&nbsp; 用来书写javascript语句，或者标示一个成员的界限</span>
</li>
<li><span style="font-size: small;">成员定义member:用来定义jCT实例对象的成员函数或者子jCT实例对象<br />
</span>
</li>
<li><span style="font-size: small;">取值表达式exp: 用来书写javascript值表达式<br />
</span>
</li>
<li><span style="font-size: small;">清理标记clear:用来完成<strong>一致性</strong>
设计</span>
，<span style="font-size: small;">参见早期文档</span>
<br />
</li>
</ol>
</div>
<div style="font-family: courier new; padding-left: 30px;"><span style="font-size: small;">由于member在定义子jCT实例对象的时候需要一个结束位置定义,才有了memberend,并且member和memberend必须包括在block标记内。而exp是不应该出现在block内的。通过这些标记，就可以<strong>写javascript代码</strong>
，<strong>定义成员函数</strong>
，<strong>定义子jCT实例</strong>
。这整个就是在用另一种排版写javascript代码，当然是全兼容javascript了.<br />
由于成员函数和子jCT实例对象都是采用的同一个标记，为了区分他们的不同，简单的在实例名称的前面加一个符号@以示区分,下面是个函数定义:<br />
</span>
<pre name="code" class="js">&lt;!---/*+hello*/
alert('hello');
--&gt;
</pre>
</div>
<div style="font-family: courier new; padding-left: 30px;"><span style="font-size: small;">下面是个子jCT实例定义：要注意子<strong>实例</strong>
定义要<strong>有开始，有结束</strong>
</span>
<br />
<pre name="code" class="js">&lt;!---/*+@hello*/--&gt;
&lt;h1&gt;hello&lt;/h1&gt;
&lt;!---/*-@hello*/--&gt;
</pre>
<br />
<span style="font-size: small;">
并且在jCT编译模板阶段会自动根据第一个出现的block去<strong>自动判断</strong>
采用那个<strong>文法</strong>
</span>
<strong><span style="font-size: small;">风格</span>
</strong>
<span style="font-size: small;"><strong>标记</strong>
<br />
如果你有自己的想法，那就<strong>自己定义</strong>
一个风格吧。<br />
</span>
</div>
<p><strong><span style="font-size: small;">例子</span>
</strong>
：</p>
<p style="padding-left: 30px;"><span style="font-size: small;">请看我博客里的<a href="../../../category/33268" target="_self">jCT专题</a>
</span>
，<span style="font-size: small;">里面有最简单的例子，另外我更希望感兴趣的你能直接提出html代码和需求，我们讨论如何用jCT的方法写出.</span>
</p>
<div style="font-family: courier new; padding-left: 30px;">
</div>
          <br/>
          <span style="color:red;">
            <a href="http://achun.javaeye.com/blog/238089#comments" style="color:red;">已有 <strong>5</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 07 Sep 2008 14:26:14 +0800</pubDate>
        <link>http://achun.javaeye.com/blog/238089</link>
        <guid>http://achun.javaeye.com/blog/238089</guid>
      </item>
      <item>
        <title>IE和火狐下获取单元格内容的共通方法</title>
        <author>jiasongmao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://code.javaeye.com">jiasongmao</a>&nbsp;
          链接：<a href="http://code.javaeye.com/blog/238078" style="color:red;">http://code.javaeye.com/blog/238078</a>&nbsp;
          发表时间: 2008年09月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          IE和火狐下获取单元格内容所使用的方法是不一样的，IE用的innerText，而火狐是用contentText，可以通过下面所列的方法实现两个浏览器的通用.在使用时只需要把这两个函数放到JS文件的开始位置或其他JS方法之前就行。方法如下：<br />function isIE(){ //ie? <br />   if (window.navigator.userAgent.toLowerCase().indexOf("msie")>=1) <br />    return true; <br />   else <br />    return false; <br />} <br /><br />if(!isIE()){ //firefox innerText define<br />   HTMLElement.prototype.__defineGetter__(     "innerText", <br />    function(){<br />     var anyString = "";<br />     var childS = this.childNodes;<br />     for(var i=0; i&lt;childS.length; i++) {<br />      if(childS[i].nodeType==1)<br />       anyString += childS[i].tagName=="BR" ? '\n' : childS[i].innerText;<br />      else if(childS[i].nodeType==3)<br />       anyString += childS[i].nodeValue;<br />     }<br />     return anyString;<br />    } <br />   ); <br />   HTMLElement.prototype.__defineSetter__(     "innerText", <br />    function(sText){ <br />     this.textContent=sText; <br />    } <br />   ); <br />}
          <br/>
          <span style="color:red;">
            <a href="http://code.javaeye.com/blog/238078#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 07 Sep 2008 13:30:29 +0800</pubDate>
        <link>http://code.javaeye.com/blog/238078</link>
        <guid>http://code.javaeye.com/blog/238078</guid>
      </item>
      <item>
        <title>浏览器越多，我越烦恼，希望chrome见光死</title>
        <author>chenpingpi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chenpingpi.javaeye.com">chenpingpi</a>&nbsp;
          链接：<a href="http://chenpingpi.javaeye.com/blog/238065" style="color:red;">http://chenpingpi.javaeye.com/blog/238065</a>&nbsp;
          发表时间: 2008年09月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; google浏览器chrome大张旗鼓的揭开神秘面纱后，我怀着忐忑不安的心情去下载，然后立刻用来浏览本人辛苦研发的<a href="http://www.duoduoweb.com">www.duoduoweb.com</a>网站。我担心的事情如期的发生，网站登录不了，花了两个通宵开发出来的个人网址之家所有功能都瘫痪。可这些在ie和firefox都是完好运行的。再细深究，发现chrome完全不支持dwr,不支持调用javascript办法时通过名字传递对象。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &ldquo;我是否要把网站改成兼容chrome&rdquo;，这个问题在我脑中回旋。改，谈何容易，网站有一半的功能是用dwr开发的，要我抛开dwr，用另外一种方式来实现这一半的功能，就像要我半条命了。不改，在体验chrome浏览器后，发现它在速度、稳定、安全方面的确有很大的优势，假如它在不久的将来占据了一定的市场份额后，那我也就失去了大量的用户。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是chrome真的会在不久的将来占有一定的市场份额吗？我看未必，chrome只考虑了用户的体验，忽略了更重要的因素&mdash;&mdash;兼容。对中国很多用户来说，无法正常使用网上银行、无法使用支付宝、QQ空间显示不正常，就连他们自己的产品gmail兼容都有问题。在目前的市场格局下，作为一个新产品推向市场，大量不兼容使用广泛的应用，无疑就是等于自杀。vista就是一个值得参考的例子。 vista刚刚推出的时候连QQ都不支持，如果微软想通过这种方式把QQ的用户转成MSN的用户，那就太幼稚了，简直就是痴人说梦。假如腾讯不推出兼容vista的QQ版，结果只会让vista失去大部分的QQ用户，这个市场份额有多大，微软也是心知肚明的。而基于目前的市场情况，chrome想网上银行、支付宝、QQ空间改成兼容它，似乎不大可能。chrome也就只能失去了这些用户，而这些用户量的大小足以把chrome置于死地。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如此看来，google推出了这么个不成熟、兼容性差的浏览器，是非常不明智之举。假如这些问题不能尽快解决，见光死的可能性很大。当然这也是我希望的结果，毕竟两强相争时程序员已经搞难受了，再来个三足鼎立，那真是要命了。</p>
          <br/>
          <span style="color:red;">
            <a href="http://chenpingpi.javaeye.com/blog/238065#comments" style="color:red;">已有 <strong>4</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 07 Sep 2008 12:15:41 +0800</pubDate>
        <link>http://chenpingpi.javaeye.com/blog/238065</link>
        <guid>http://chenpingpi.javaeye.com/blog/238065</guid>
      </item>
      <item>
        <title>利用license机制来保护Java软件产品的安全</title>
        <author>infinite</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://infinite.javaeye.com">infinite</a>&nbsp;
          链接：<a href="http://infinite.javaeye.com/blog/238064" style="color:red;">http://infinite.javaeye.com/blog/238064</a>&nbsp;
          发表时间: 2008年09月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: x-small;"><span style="font-size: 12pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">关键字：</span><span style="font-size: 12pt; color: #000000; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">license</span></span><span style="font-size: 12pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">、</span><span style="font-size: 12pt; color: #000000; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">Java</span></span><span style="font-size: 12pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">、软件产品、数字签名、编译混淆、类装载器</span></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-indent: 22.5pt; text-align: left; mso-char-indent-count: 2.5; mso-pagination: widow-orphan;"><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">中国是个盗版软件横行泛滥的国度，也许这里面有我们社会主义初级阶段这个国情的因素，我们确实离不开盗版软件。但要发展壮大本国的软件产业，知识产权保护亟需重视起来。除了寄希望于大环境方面的改善，我们自己也可以做些力所能及的事情，保护好自己的软件产品，以免自己的辛勤劳动成果被他人轻松窃取。</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: 9pt; color: #000000; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;"><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">通常可以通过</span><span style="font-size: 9pt; color: #000000; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">license</span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">机制来保护软件产品的安全，我们可以限定只有购买了</span><span style="font-size: 9pt; color: #000000; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">license</span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">的用户在特定的机器上使用我们的软件。</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: 9pt; color: #000000; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;"><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">我设想的</span><span style="font-size: 9pt; color: #000000; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">license</span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">机制有以下的主要功能点：</span></p>
<table class="MsoNormalTable" cellspacing="0" border="1" cellpadding="0" style="background: #e6e6e6; margin: auto auto auto 5.4pt; border-collapse: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext;">
<tbody>
<tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes;">
<td valign="top" width="561" style="padding-right: 5.4pt; padding-left: 5.4pt; background: none transparent scroll repeat 0% 0%; padding-bottom: 0cm; width: 420.7pt; padding-top: 0cm; mso-border-alt: solid windowtext .5pt; border: windowtext 1pt solid;">
<p class="MsoNormal" align="left" style="margin: 0cm 5.45pt 0pt 26.45pt; text-indent: -21pt; text-align: left; tab-stops: list 21.0pt; mso-pagination: widow-orphan;"><span style="font-size: 9pt; color: #000000; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt;">&Oslash;</span><span style="font-size: 9pt; color: #000000; font-family: &quot;'Times New Roman'&quot;; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">应用程序可以创建以及验证绑定给用户、系统等实体的</span><span style="font-size: 9pt; color: #000000; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">license</span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">。</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 5.45pt 0pt 26.45pt; text-indent: -21pt; text-align: left; tab-stops: list 21.0pt; mso-pagination: widow-orphan;"><span style="font-size: 9pt; color: #000000; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt;">&Oslash;</span><span style="font-size: 9pt; color: #000000; font-family: &quot;'Times New Roman'&quot;; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">防止用户随意拷贝软件和</span><span style="font-size: 9pt; color: #000000; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">license</span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">。</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 5.45pt 0pt 26.45pt; text-indent: -21pt; text-align: left; tab-stops: list 21.0pt; mso-pagination: widow-orphan;"><span style="font-size: 9pt; color: #000000; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt;">&Oslash;</span><span style="font-family: Times New Roman;"><span style="font-size: 9pt; color: #000000; font-family: &quot;'Times New Roman'&quot;; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9pt; color: #000000; mso-font-kerning: 0pt;">licenses</span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">可以是永久性的或者临时性的（在某个特定时期内有效）</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 5.45pt 0pt 26.45pt; text-indent: -21pt; text-align: left; tab-stops: list 21.0pt; mso-pagination: widow-orphan;"><span style="font-size: 9pt; color: #000000; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt;">&Oslash;</span><span style="font-family: Times New Roman;"><span style="font-size: 9pt; color: #000000; font-family: &quot;'Times New Roman'&quot;; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9pt; color: #000000; mso-font-kerning: 0pt;">licenses</span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">的验证由</span><span style="font-size: 9pt; color: #000000; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">JAVA Security API</span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">提供的数字签名机制来实现。</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 5.45pt 0pt 26.45pt; text-indent: -21pt; text-align: left; tab-stops: list 21.0pt; mso-pagination: widow-orphan;"><span style="font-size: 9pt; color: #000000; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt;">&Oslash;</span><span style="font-family: Times New Roman;"><span style="font-size: 9pt; color: #000000; font-family: &quot;'Times New Roman'&quot;; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9pt; color: #000000; mso-font-kerning: 0pt;">license</span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">安装模块需要用特殊机制对其进行保护，以防被反编译轻易破解。</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt 23.45pt; text-indent: -18pt; text-align: left; tab-stops: list 18.0pt; mso-pagination: widow-orphan;"><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; color: #000000; mso-fareast-font-family: 'Times New Roman'; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">1</span></span></strong><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; color: #000000; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">、</span></strong><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; color: #000000; font-family: &quot;'Times New Roman'&quot;; mso-fareast-font-family: 'Times New Roman'; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">&nbsp; </span></span></strong><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">定义</span></strong><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; color: #000000; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">license</span></span></strong><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">的文件格式</span></strong><strong style="mso-bidi-font-weight: normal;"></strong></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt 23.45pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: 9pt; color: #000000; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">License</span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">文件采用普通</span><span style="font-size: 9pt; color: #000000; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">java properties</span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">文件的定义格式。</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt 23.45pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">文件中定义了产品、版本、</span><span style="font-size: 9pt; color: #000000; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">Mac</span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">地址、</span><span style="font-size: 9pt; color: #000000; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">license</span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">类型、</span><span style="font-size: 9pt; color: #000000; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">license</span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">有效期等信息。如下所示：</span></p>
<table class="MsoNormalTable" cellspacing="0" border="1" cellpadding="0" style="background: #e6e6e6; margin: auto auto auto 23.4pt; border-collapse: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext;">
<tbody>
<tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes;">
<td valign="top" width="537" style="padding-right: 5.4pt; padding-left: 5.4pt; background: none transparent scroll repeat 0% 0%; padding-bottom: 0cm; width: 402.7pt; padding-top: 0cm; mso-border-alt: solid windowtext .5pt; border: windowtext 1pt solid;">
<p class="MsoNormal" align="left" style="margin: 0cm 5.45pt 0pt; text-align: left; mso-layout-grid-align: none; mso-pagination: widow-orphan;"><span style="font-size: 9pt; color: #000000; font-family: &quot;ɼourier New'&quot;; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">Product.name=cpu</span></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 5.45pt 0pt; text-align: left; mso-layout-grid-align: none; mso-pagination: widow-orphan;"><span style="font-size: 9pt; color: #000000; font-family: &quot;ɼourier New'&quot;; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">Product.version=3.2</span></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 5.45pt 0pt; text-align: left; mso-layout-grid-align: none; mso-pagination: widow-orphan;"><span style="font-size: 9pt; color: #000000; font-family: &quot;ɼourier New'&quot;; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">License.type=Commercial</span></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 5.45pt 0pt; text-align: left; mso-layout-grid-align: none; mso-pagination: widow-orphan;"><span style="font-size: 9pt; color: #000000; font-family: &quot;ɼourier New'&quot;; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">License.expiry=2010-05-12</span></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 5.45pt 0pt; text-align: left; mso-layout-grid-align: none; mso-pagination: widow-orphan;"><span style="font-size: 9pt; color: #000000; font-family: &quot;ɼourier New'&quot;; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">Server.macaddress=00-1B-77-2C-9D-8F</span></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 5.45pt 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-family: Times New Roman;"><span style="font-size: 9pt; color: #000000; font-family: &quot;ɼourier New'&quot;; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">signature=302d0215008b4ef2390e11d28f5ea7b86f71ba5168bfeaa6b402146c77706b985be68cc515</span></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 5.45pt 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-family: Times New Roman;"><span style="font-size: 9pt; color: #000000; font-family: &quot;ɼourier New'&quot;; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">c6079b31ad50e3f17552</span></span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: 9pt; color: #000000; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;"><span style="font-family: Times New Roman;">&nbsp;&nbsp; </span></span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">其中最下面一串数据为根据上面几项基本信息签名产生的注册号。</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt 23.45pt; text-indent: -18pt; text-align: left; tab-stops: list 18.0pt; mso-pagination: widow-orphan;"><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; color: #000000; mso-fareast-font-family: 'Times New Roman'; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">2</span></span></strong><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; color: #000000; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">、</span></strong><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; color: #000000; font-family: &quot;'Times New Roman'&quot;; mso-fareast-font-family: 'Times New Roman'; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">&nbsp; </span></span></strong><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">创建以及验证</span></strong><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 12pt; color: #000000; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">license</span></span></strong></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">以下是部分实现代码</span><span style="font-size: 9pt; color: #000000; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">(</span></span><span style="font-size: 9pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">篇幅问题，只好只粘方法说明</span><span style="font-size: 9pt; color: #000000; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;"><span style="font-family: Times New Roman;">)</span></span><span style="font-size: 12pt; color: #000000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">：</span></p>
<table class="MsoNormalTable" cellspacing="0" border="1" width="588" cellpadding="0" style="background: #e6e6e6; margin: au