<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>我很全面，我很阳光！</title>
    <description>其实我是个演员!</description>
    <link>http://damies.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>SQL排重并获得排重后最新记录</title>
        <author>damies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://damies.javaeye.com">damies</a>&nbsp;
          链接：<a href="http://damies.javaeye.com/blog/221642" style="color:red;">http://damies.javaeye.com/blog/221642</a>&nbsp;
          发表时间: 2008年07月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="sql">select   * from   c_pro_men   a  where   pla_end_dat   =  (select   max(pla_end_dat)   from   c_pro_men   where   emp_code   = a.emp_code and pro_id=1073)  and pro_id = 1073</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://damies.javaeye.com/blog/221642#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 30 Jul 2008 17:36:05 +0800</pubDate>
        <link>http://damies.javaeye.com/blog/221642</link>
        <guid>http://damies.javaeye.com/blog/221642</guid>
      </item>
      <item>
        <title>Lucene全文检索样例（解决大文本建索引）</title>
        <author>damies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://damies.javaeye.com">damies</a>&nbsp;
          链接：<a href="http://damies.javaeye.com/blog/160655" style="color:red;">http://damies.javaeye.com/blog/160655</a>&nbsp;
          发表时间: 2008年01月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>建索引:</p><pre name="code" class="java">package  com.pccw;   
  
 import  java.io.BufferedReader;   
 import  java.io.File;   
 import  java.io.FileInputStream;   
 import  java.io.IOException;   
 import  java.io.InputStreamReader;   
 import  java.util.Date;   
  
 import  org.apache.lucene.analysis.Analyzer;   
 import  org.apache.lucene.analysis.standard.StandardAnalyzer;   
 import  org.apache.lucene.document.Document;   
 import  org.apache.lucene.document.Field;   
 import  org.apache.lucene.index.IndexWriter;   
  
 /** */ /**   
 * author Shane in PCCW
 *
  */   
 public   class  TextFileIndexer   {   
     public   static   void  main(String[] args)  throws  Exception   {   
         /**/ /*  指明要索引文件夹的位置,这里是C盘的S文件夹下  */   
        File fileDir  =   new  File( &quot;c:\\s&quot; );   
  
         /**/ /*  这里放索引文件的位置  */   
        File indexDir  =   new  File( &quot;c:\\index&quot; );   
        Analyzer luceneAnalyzer  =   new  StandardAnalyzer();   
        IndexWriter indexWriter  =   new  IndexWriter(indexDir, luceneAnalyzer,   
                 true );
        indexWriter.setMaxFieldLength(99999999);//增加内存域长度限制（非常重要）
        File[] textFiles  =  fileDir.listFiles();   
         long  startTime  =   new  Date().getTime();   
           
         // 增加document到索引去    
           for  ( int  i  =   0 ; i  &lt;  textFiles.length; i ++ )   {   
             if  (textFiles[i].isFile()   
                     &amp;&amp;  textFiles[i].getName().endsWith( &quot;.txt&quot; ))   {   
                System.out.println( &quot; File  &quot;   +  textFiles[i].getCanonicalPath()   
                         +   &quot; 正在被索引. &quot; );   
                String temp  =  FileReaderAll(textFiles[i].getCanonicalPath(),   
                         &quot; GBK &quot; );   
                System.out.println(temp);   
                Document document  =   new  Document();   
                Field FieldPath  =   new  Field( &quot; path &quot; , textFiles[i].getPath(),   
                        Field.Store.YES, Field.Index.NO);   
                Field FieldBody  =   new  Field( &quot; body &quot; , temp, Field.Store.YES,   
                        Field.Index.TOKENIZED,   
                        Field.TermVector.WITH_POSITIONS_OFFSETS);   
                document.add(FieldPath);   
                document.add(FieldBody);   
                indexWriter.addDocument(document);   
            }    
        }    
         // optimize()方法是对索引进行优化    
         indexWriter.optimize();   
        indexWriter.close();   
           
         // 测试一下索引的时间    
          long  endTime  =   new  Date().getTime();   
        System.out   
                .println( &quot; 这花费了 &quot;   
                         +  (endTime  -  startTime)   
                         +   &quot;  毫秒来把文档增加到索引里面去! &quot;   
                         +  fileDir.getPath());   
    }    
  
     public   static  String FileReaderAll(String FileName, String charset)   
             throws  IOException   {   
        BufferedReader reader  =   new  BufferedReader( new  InputStreamReader(   
                 new  FileInputStream(FileName), charset));   
        String line  =   new  String();   
        String temp  =   new  String();   
           
         while  ((line  =  reader.readLine())  !=   null )   {   
            temp  +=  line + &quot;\n&quot;;   
        }    
        reader.close();   
         return  temp;   
    }    
}   </pre><p>查询:</p><pre name="code" class="java">package  com.pccw;   
  
 import  java.io.IOException;   
  
 import  org.apache.lucene.analysis.Analyzer;   
 import  org.apache.lucene.analysis.standard.StandardAnalyzer;   
 import  org.apache.lucene.queryParser.ParseException;   
 import  org.apache.lucene.queryParser.QueryParser;   
 import  org.apache.lucene.search.Hits;   
 import  org.apache.lucene.search.IndexSearcher;   
 import  org.apache.lucene.search.Query;   
  
 public   class  TestQuery   {   
     public   static   void  main(String[] args)  throws  IOException, ParseException   {   
        Hits hits  =   null ;   
        String queryString  =   &quot;中华&quot; ;   
        Query query  =   null ;   
        IndexSearcher searcher  =   new  IndexSearcher( &quot; c:\\index &quot; );   
  
        Analyzer analyzer  =   new  StandardAnalyzer();   
         try    {   
            QueryParser qp  =   new  QueryParser( &quot; body &quot; , analyzer);   
            query  =  qp.parse(queryString);   
        }   catch  (ParseException e)   {   
        }    
         if  (searcher  !=   null )   {   
            hits  =  searcher.search(query);   
             if  (hits.length()  &gt;   0 )   {   
                System.out.println( &quot; 找到: &quot;   +  hits.length()  +   &quot;  个结果! &quot; );   
            }    
        }    
    }  
  
}   
</pre><p>&nbsp;</p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://damies.javaeye.com/blog/160655#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 31 Jan 2008 10:05:39 +0800</pubDate>
        <link>http://damies.javaeye.com/blog/160655</link>
        <guid>http://damies.javaeye.com/blog/160655</guid>
      </item>
      <item>
        <title>txt读取字符串（为实习生作的例子）</title>
        <author>damies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://damies.javaeye.com">damies</a>&nbsp;
          链接：<a href="http://damies.javaeye.com/blog/160199" style="color:red;">http://damies.javaeye.com/blog/160199</a>&nbsp;
          发表时间: 2008年01月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">try {
			FileInputStream fi = new FileInputStream(&quot;f:/3.txt&quot;);
			BufferedReader bs = new BufferedReader(new InputStreamReader(fi));
			try {
				while(bs.readLine()!=null){
				String str = bs.readLine();
				System.out.println(str);
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}</pre>&nbsp;
          <br/>
          <span style="color:red;">
            <a href="http://damies.javaeye.com/blog/160199#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 Jan 2008 18:27:19 +0800</pubDate>
        <link>http://damies.javaeye.com/blog/160199</link>
        <guid>http://damies.javaeye.com/blog/160199</guid>
      </item>
      <item>
        <title>关于Lucene索引合并解决方法</title>
        <author>damies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://damies.javaeye.com">damies</a>&nbsp;
          链接：<a href="http://damies.javaeye.com/blog/159835" style="color:red;">http://damies.javaeye.com/blog/159835</a>&nbsp;
          发表时间: 2008年01月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>由于Clustor的问题造成无法对索引进行同步，脑子中马上浮现用rmi(双机)，UDP广播（多机）作通信中间件对clustor进行索引同步但这样经过测试后效率相对较低，故另辟蹊径，最终用索引合并的方式进行快速的索引整合，达到时间短索引同步快的目的。代码如下：</p><pre name="code" class="java">package com.pccw;

import java.io.File;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.FSDirectory;

public class AdvancedTextFileIndexer {
	/**
	 * @author Shane Zhao about merge Index in PCCW BJDEV
	 * 将小索引文件合并到大的索引文件中去
	 * 
	 * @param from
	 *            将要合并到to文件的文件
	 * @param to
	 *            将from文件合并到该文件
	 * @param sa
	 */
	private static void mergeIndex(File from, File to,StandardAnalyzer sa) {
		IndexWriter indexWriter = null;
		try {
			System.out.println(&quot;正在合并索引文件!\t &quot;);
			indexWriter = new IndexWriter(to, sa, false);
			indexWriter.setMergeFactor(100000);
			indexWriter.setMaxFieldLength(Integer.MAX_VALUE);
			indexWriter.setMaxBufferedDocs(Integer.MAX_VALUE);
			indexWriter.setMaxMergeDocs(Integer.MAX_VALUE);
			FSDirectory[] fs = { FSDirectory.getDirectory(from, false) };
			indexWriter.addIndexes(fs);
			indexWriter.optimize();
			indexWriter.close();
			System.out.println(&quot;已完成合并!\t &quot;);
		} catch (Exception e) {
			System.out.println(&quot;合并索引出错！&quot;);
			e.printStackTrace();
		} finally {
			try {
				if (indexWriter != null)
					indexWriter.close();
			} catch (Exception e) {

			}

		}

	}
	
	public static void main(String[] areg){
		File from = new File(&quot;F:/web/faq/lucene/indexDir&quot;);
		File to = new File(&quot;F:/indexDir&quot;);
		mergeIndex(from,to,new StandardAnalyzer());
	}

}</pre><p>测试效率为两个150M的索引文件合并时间在10-15s 效率还是很令人满意的。</p>
          <br/>
          <span style="color:red;">
            <a href="http://damies.javaeye.com/blog/159835#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 28 Jan 2008 10:21:22 +0800</pubDate>
        <link>http://damies.javaeye.com/blog/159835</link>
        <guid>http://damies.javaeye.com/blog/159835</guid>
      </item>
      <item>
        <title>封掉MSN后仍可登录的方法</title>
        <author>damies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://damies.javaeye.com">damies</a>&nbsp;
          链接：<a href="http://damies.javaeye.com/blog/152886" style="color:red;">http://damies.javaeye.com/blog/152886</a>&nbsp;
          发表时间: 2008年01月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          香港人还真是封了MSN不封QQ搞不懂，今天终于搞定啦你封我我也可以上，嘿嘿! 上Msn的方法：）在 C:\WINDOWS\system32\drivers\etc下的hosts文件最后一行加上 65.54.239.141 gateway.messenger.hotmail.com 就可以了<img src="/images/smiles/icon_idea.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://damies.javaeye.com/blog/152886#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Jan 2008 17:35:05 +0800</pubDate>
        <link>http://damies.javaeye.com/blog/152886</link>
        <guid>http://damies.javaeye.com/blog/152886</guid>
      </item>
      <item>
        <title>Spring 2.0 AOP 与事务配置 </title>
        <author>damies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://damies.javaeye.com">damies</a>&nbsp;
          链接：<a href="http://damies.javaeye.com/blog/142093" style="color:red;">http://damies.javaeye.com/blog/142093</a>&nbsp;
          发表时间: 2007年11月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>Spring 2.0 AOP 与事务配置 </strong><br />
************Spring 1.0的标准事务配置*************** <br />
先定义一个baseTxService进行基本的事务定义，类型为TransactionProxyFactoryBean。如果service没有基于接口，使用cgilib来实现AOP，定义
<property name="proxyTargetClass" value="true"></property>
<br />
实际的Manager类设置parent=baseTxService，target 为匿名的实际Manager类。如果需要定义特殊的事务，利用merge=true的属性，在manager的transactionAttributes节点进行新事务的定义。 </p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;baseTxService&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.transaction.interceptor.TransactionProxyFactoryBean&quot;</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="attribute">abstract</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;transactionManager&quot;</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">&quot;transactionManager&quot;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;proxyTargetClass&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;transactionAttributes&quot;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;get*&quot;</span><span class="tag">&gt;</span><span>PROPAGATION_REQUIRED,readOnly</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;find*&quot;</span><span class="tag">&gt;</span><span>PROPAGATION_REQUIRED,readOnly</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;save*&quot;</span><span class="tag">&gt;</span><span>PROPAGATION_REQUIRED</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;remove*&quot;</span><span class="tag">&gt;</span><span>PROPAGATION_REQUIRED</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;/</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;preInterceptors&quot;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">bean</span><span>=</span><span class="attribute-value">&quot;methodSecurityInterceptor&quot;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;bookManager&quot;</span><span>&nbsp;</span><span class="attribute">parent</span><span>=</span><span class="attribute-value">&quot;baseTxService&quot;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;target&quot;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springside.bookstore.admin.manager.BookManager&quot;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>**************Spring 2.0的新配置：********* <br />
如果如果service没有基于接口，使用cgilib来实现AOP，定义proxy-target-class=&quot;true&quot; </p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">aop:config</span><span>&nbsp;</span><span class="attribute">proxy-target-class</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">aop:advisor</span><span>&nbsp;</span><span class="attribute">pointcut</span><span>=</span><span class="attribute-value">&quot;execution(*&nbsp;com.xyz.service..*Manager.*(..))&quot;</span><span>&nbsp;</span><span class="attribute">advice-ref</span><span>=</span><span class="attribute-value">&quot;txAdvice&quot;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">aop:advisor</span><span>&nbsp;</span><span class="attribute">pointcut</span><span>=</span><span class="attribute-value">&quot;execution(*&nbsp;com.xyz.service..*Manager.save(..))&quot;</span><span>&nbsp;</span><span class="attribute">advice-ref</span><span>=</span><span class="attribute-value">&quot;fooAdvice&quot;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">aop:config</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">tx:advice</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;txAdvice&quot;</span><span>&nbsp;</span><span class="attribute">transaction-manager</span><span>=</span><span class="attribute-value">&quot;transactionManager&quot;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">tx:attributes</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">tx:method</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;get*&quot;</span><span>&nbsp;</span><span class="attribute">read-only</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">tx:method</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;find*&quot;</span><span>&nbsp;</span><span class="attribute">read-only</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">tx:method</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;*&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;/</span><span class="tag-name">tx:attributes</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">tx:advice</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;bookManager&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springside.bookstore.commons.service.BookManager&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
</p>
<p><bean class="org.springside.bookstore.commons.service.BookManager" id="bookManager"></bean>其中com.xyz是你的项目package限定前缀。 </p>
<p><font color="#ff0000">2.进步 </font><br />
1. AOP的配置方式也AOP了。 <br />
对比1.0的配置文件，因为下面2提到的限制，事关安全acegi methodSecurityInterceptor 拦截器要配置在关于事务的TransactionProxyFactoryBean的preInterceptors属性里，这样子就一点不AOP了。 <br />
<br />
而2.0使用ponintcut expression，很AOP的配置一切Aspect。 <br />
<br />
2. 1.0时，一个已经AOP过的object不能再次被AOP。 <br />
在Spring 1.0的文档里Rod说，比如<bean parent="baseTxService" id="bookManager"></bean>已经进行了一次AOP，如果想在这个Bean上再配一层AOP，比如要对方法执行结果缓存，无论以1.0 还是2.0的方式定义，cglib方式是会报错的，而基于接口的方式，结果不确定。 <br />
<br />
3. BookManager能直接定义自己，而不是像1.0那样作匿名内部target。 <br />
<br />
虽然在1.0时代的BeanNameAutoProxyCreator 达到类似作用，但只能用BeanName来模糊匹配比较危险，没有AspectJ的pointcut语法细致。 <br />
<br />
<font color="#ff0000">3. 语法 </font><br />
满江红翻译的 Spring参考文档 6.3 schema-based AOP support 提供了aspect,advisor,advide三种组装方法的解释，其中aspect是aspectJ原装，但稍复杂。 <br />
<br />
唯一有点难懂的是pointcut里的语法，其实也很好学，Spring参考文档6.2.3.4 示例里有完整说明 ，其实一排子过去是 <br />
<br />
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)其中带问号的modifiers-pattern?(public/protected) 和 declaring-type-pattern? throws-pattern? 可以不填 <br />
<br />
execution(* *..BookManager.save(..))的解读: <br />
第一颗* 代表ret-type-pattern 返回值可任意， <br />
*..BookManager 代表任意Pacakge里的BookManager类。 <br />
如果写成com.xyz.service.* 则代表com.xyz.service下的任意类 <br />
com.xyz.service..* com.xyz.service则代表com.xyz.service及其子package下的任意类 <br />
save代表save方法，也可以写save* 代表saveBook()等方法 <br />
(..) 匹配0个参数或者多个参数的，任意类型 <br />
(x,..) 第一个参数的类型必须是X <br />
(x,,,s,..) 匹配至少4个参数，第一个参数必须是x类型，第二个和第三个参数可以任意，第四个必须是s类型。 <br />
注意事项： <br />
1. name-pattern千万不要写成*..*Manager ，这样子会把所有第三方类库的Manager比如Spring的PlatformTranstationManager 也加入aop，非常危险。所以最好还是加上项目的package前缀，如&quot;org.springside..*Manager&quot; <br />
<br />
2. 因为有*，会修饰所有方法，有些hibernateTemplate的final的方法不能被cglib修改，会抛warning，无害。 <br />
<br />
4. 事务定义选项 <br />
事务定义一般默认的PROPAGATION_REQUIRED即可，另提供的几个选择很少使用。值得注意的是一个PROPAGATION_NESTED，嵌入式事务的意义在于多级事务，如果出错只rollback子事务自己，不rollback主事务的所有操作。比如OrderManager的shipOrder函数 调用 save函数，如果save()被定义为嵌入式事务，当进入save()时，会存储save point。如果在save 中出错，会rollback 到刚才的save point，但不影响其他的操作。这需要JDBC3.0 SavePoint功能的支持。 而一般service间互相嵌入调用时，如果都定义为PROPAGATION_REQUIRED，有其中一个操作出错，rollback全部操作。 <br />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://damies.javaeye.com/blog/142093#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 20 Nov 2007 16:13:28 +0800</pubDate>
        <link>http://damies.javaeye.com/blog/142093</link>
        <guid>http://damies.javaeye.com/blog/142093</guid>
      </item>
      <item>
        <title>关于Soeckt 流操作的数据转换工具方法</title>
        <author>damies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://damies.javaeye.com">damies</a>&nbsp;
          链接：<a href="http://damies.javaeye.com/blog/137522" style="color:red;">http://damies.javaeye.com/blog/137522</a>&nbsp;
          发表时间: 2007年11月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.sunhill.k1c.sms.util; &nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.nio.*; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//数据转换&nbsp;</span></li>
    <li class=""><span class="comment"></span><span class="comment">/** </span>&nbsp;</li>
    <li class=""><span><span class="comment">*create&nbsp;by&nbsp;Shane&nbsp;about&nbsp;dataconvert&nbsp;<span>&nbsp;&nbsp;</span>&nbsp;</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">*PCCW&nbsp;BJ&nbsp;DEV </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;DataConvertUtil&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;byte2int(</span><span class="keyword">byte</span><span>[]&nbsp;b){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;b[</span><span class="number">3</span><span>]&nbsp;&amp;&nbsp;</span><span class="number">0xff</span><span>&nbsp;|&nbsp;(b[</span><span class="number">2</span><span>]&nbsp;&amp;&nbsp;</span><span class="number">0xff</span><span>)&nbsp;&lt;&lt;&nbsp;</span><span class="number">8</span><span>&nbsp;|&nbsp;(b[</span><span class="number">1</span><span>]&nbsp;&amp;&nbsp;</span><span class="number">0xff</span><span>)&nbsp;&lt;&lt;&nbsp;</span><span class="number">16</span><span>&nbsp;|&nbsp;(b[</span><span class="number">0</span><span>]&nbsp;&amp;&nbsp;</span><span class="number">0xff</span><span>)&nbsp;&lt;&lt;&nbsp;</span><span class="number">24</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;int2Byte(</span><span class="keyword">int</span><span>&nbsp;value){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;b=</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">byte</span><span>[</span><span class="number">4</span><span>]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteBuffer&nbsp;buffer&nbsp;=&nbsp;ByteBuffer.allocate(</span><span class="number">4</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.asIntBuffer().put(value); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;i&lt;</span><span class="number">4</span><span>;i++){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b[i]=&nbsp;buffer.get(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;b; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">long</span><span>&nbsp;byte2uint(</span><span class="keyword">byte</span><span>&nbsp;b[])&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(</span><span class="keyword">long</span><span>)b[</span><span class="number">3</span><span>]&nbsp;&amp;&nbsp;(</span><span class="keyword">long</span><span>)</span><span class="number">255</span><span>&nbsp;|&nbsp;((</span><span class="keyword">long</span><span>)b[</span><span class="number">2</span><span>]&nbsp;&amp;&nbsp;(</span><span class="keyword">long</span><span>)</span><span class="number">255</span><span>)&nbsp;&lt;&lt;&nbsp;</span><span class="number">8</span><span>&nbsp;|&nbsp;((</span><span class="keyword">long</span><span>)b[</span><span class="number">1</span><span>]&nbsp;&amp;&nbsp;(</span><span class="keyword">long</span><span>)</span><span class="number">255</span><span>)&nbsp;&lt;&lt;&nbsp;</span><span class="number">16</span><span>&nbsp;|&nbsp;((</span><span class="keyword">long</span><span>)b[</span><span class="number">0</span><span>]&nbsp;&amp;&nbsp;(</span><span class="keyword">long</span><span>)</span><span class="number">255</span><span>)&nbsp;&lt;&lt;&nbsp;</span><span class="number">24</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;uint2byte(</span><span class="keyword">long</span><span>&nbsp;value)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">byte</span><span>&nbsp;b[]&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">byte</span><span>[</span><span class="number">4</span><span>]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b[</span><span class="number">0</span><span>]&nbsp;=&nbsp;(</span><span class="keyword">byte</span><span>)(</span><span class="keyword">int</span><span>)(value&nbsp;&gt;&gt;&nbsp;</span><span class="number">24</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b[</span><span class="number">1</span><span>]&nbsp;=&nbsp;(</span><span class="keyword">byte</span><span>)(</span><span class="keyword">int</span><span>)(value&nbsp;&gt;&gt;&nbsp;</span><span class="number">16</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b[</span><span class="number">2</span><span>]&nbsp;=&nbsp;(</span><span class="keyword">byte</span><span>)(</span><span class="keyword">int</span><span>)(value&nbsp;&gt;&gt;&nbsp;</span><span class="number">8</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b[</span><span class="number">3</span><span>]&nbsp;=&nbsp;(</span><span class="keyword">byte</span><span>)(</span><span class="keyword">int</span><span>)value; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;b; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;String&nbsp;byte2String(</span><span class="keyword">byte</span><span>[]&nbsp;b){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;String(b); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;getSubByte(</span><span class="keyword">byte</span><span>[]&nbsp;buffer,</span><span class="keyword">int</span><span>&nbsp;from,</span><span class="keyword">int</span><span>&nbsp;len){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(from+len&gt;buffer.length){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len=buffer.length-from; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;b&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">byte</span><span>[len]; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;i&lt;len;i++){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b[i]=&nbsp;buffer[i+from]; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;b; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setSubByte(</span><span class="keyword">byte</span><span>[]&nbsp;dest,&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;src,</span><span class="keyword">int</span><span>&nbsp;from,</span><span class="keyword">int</span><span>&nbsp;len){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(dest==</span><span class="keyword">null</span><span>){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(from+len&gt;dest.length){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(src!=</span><span class="keyword">null</span><span>){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;i&lt;len;i++){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(i&gt;=src.length){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dest[i+from]=</span><span class="number">0</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">else</span><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dest[i+from]=src[i]; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">else</span><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;i&lt;len;i++){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dest[i+from]=</span><span class="number">0</span><span>;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://damies.javaeye.com/blog/137522#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 02 Nov 2007 10:50:32 +0800</pubDate>
        <link>http://damies.javaeye.com/blog/137522</link>
        <guid>http://damies.javaeye.com/blog/137522</guid>
      </item>
      <item>
        <title>oracle存储过程基本方法</title>
        <author>damies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://damies.javaeye.com">damies</a>&nbsp;
          链接：<a href="http://damies.javaeye.com/blog/137516" style="color:red;">http://damies.javaeye.com/blog/137516</a>&nbsp;
          发表时间: 2007年11月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.基本结构 <br />CREATE OR REPLACE PROCEDURE 存储过程名字<br />(<br />    参数1 IN NUMBER,<br />    参数2 IN NUMBER<br />) IS<br />变量1 INTEGER :=0;<br />变量2 DATE;<br />BEGIN <br />END 存储过程名字<br /><br /><br /><br />2.SELECT INTO STATEMENT<br />  将select查询的结果存入到变量中，可以同时将多个列存储多个变量中，必须有一条<br />  记录，否则抛出异常(如果没有记录抛出NO_DATA_FOUND)<br />  例子： <br />  BEGIN<br />  SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;<br />  EXCEPTION<br />  WHEN NO_DATA_FOUND THEN<br />      xxxx;<br />  END;<br />  ...<br /><br />3.IF 判断<br />  IF V_TEST=1 THEN<br />    BEGIN <br />       do something<br />    END;<br />  END IF;<br /><br />4.while 循环<br />  WHILE V_TEST=1 LOOP<br />  BEGIN<br /> XXXX<br />  END;<br />  END LOOP;<br /><br />5.变量赋值<br />  V_TEST := 123;<br /><br />6.用for in 使用cursor<br />  ...<br />  IS<br />  CURSOR cur IS SELECT * FROM xxx;<br />  BEGIN<br /> FOR cur_result in cur LOOP<br />  BEGIN<br />   V_SUM :=cur_result.列名1+cur_result.列名2<br />  END;<br /> END LOOP;<br />  END;<br /><br />7.带参数的cursor<br />  CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;<br />  OPEN C_USER(变量值);<br />  LOOP<br /> FETCH C_USER INTO V_NAME;<br /> EXIT FETCH C_USER%NOTFOUND;<br />    do something<br />  END LOOP;<br />  CLOSE C_USER;
          <br/>
          <span style="color:red;">
            <a href="http://damies.javaeye.com/blog/137516#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 02 Nov 2007 10:26:17 +0800</pubDate>
        <link>http://damies.javaeye.com/blog/137516</link>
        <guid>http://damies.javaeye.com/blog/137516</guid>
      </item>
      <item>
        <title>Java socket开发实例入门</title>
        <author>damies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://damies.javaeye.com">damies</a>&nbsp;
          链接：<a href="http://damies.javaeye.com/blog/114909" style="color:red;">http://damies.javaeye.com/blog/114909</a>&nbsp;
          发表时间: 2007年08月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          socket用中文意思就是我们常说的&rdquo;套接字&ldquo;，我们用它来解决基于TCP/IP协议的网络通信。Java有一套功能强大而又易于使用的网络开发API，这个API是一系列的接口和类，在java.net和javax.net包中可以找到它们。套接字一般分为两种：流套接字（Stream Socket)和数据报套接字（Datagram Sockets）。关于套接字的编程可以写成一本书，本文不想在这里做深入探究（其实是本人功力还不够，嘿嘿...）,这次主要是了解一下流套接字的基本开发。
<div><br />
<font size="4"><strong>一、几个重要的API</strong>：</font><br />
<strong><font size="3">1、InetAddress类<br />
</font>描述</strong>：该类在套接字编程中份演着目的地角色，通常作为参数传递给流套接字类和数据报套接字的构造方法或其它方法。</div>
<div>&nbsp;</div>
<div><strong>构造方法</strong>：该类只有一个默认的不带参的构造方法。<br />
不能直接用new创建一个InetAddress对象。象这样做 <br />
&nbsp;&nbsp;&nbsp; InetAddress ia = new InetAddress ();<br />
就是错误的。但是我们可以通过它的5个静态工厂方法获得一个InetAddress对象或对象数组。</div>
<div>&nbsp;</div>
<div><strong>重要方法：</strong><br />
&nbsp;&nbsp;&nbsp; <strong>static InetAddress[] getAllByName(String host);<br />
</strong>&nbsp;&nbsp;&nbsp; 通过传递参数host(主机名)，返回一个InetAddress对象数组的引用。如果指定的主机没有IP地址存在，则方法抛出一个UnknownHostException 异常对象。</div>
<div>&nbsp;&nbsp;&nbsp; <strong>static InetAddress getByAddress(byte[] addr);<br />
</strong>&nbsp;&nbsp;&nbsp; 通过传递一个用字节数组表示的二进制IP地址参数（4字节对应Ipv4,16字节对应Ipv6），返回一个InetAddress对象的引用。如果返回对象的数组既不是4字节也不是16字节，则方法抛出一个UnknownHostException 异常对象。</div>
<div>&nbsp;&nbsp;&nbsp; <strong>static InetAddress getByAddress(String host, byte[] addr);<br />
</strong>&nbsp;&nbsp;&nbsp; 创建一个基于给定主机名和给定字节数组组成的IP地址的InetAddress对象。如果返回对象中的数组既不是4字节也不是16字节，则方法抛出一个UnknownHostException 异常对象。</div>
<div>&nbsp;&nbsp;&nbsp; <strong>static InetAddress getByName(String host);<br />
</strong>&nbsp;&nbsp;&nbsp; 返回一个与给定主机名的InetAddress对象。如果指定的主机没有IP对应，则方法抛出一个UnknownHostException异常对象。</div>
<div>&nbsp;&nbsp;&nbsp; <strong>static InetAddress getLocalHost();<br />
</strong>&nbsp;&nbsp;&nbsp; 返回一个包含本地主机的IP地址的InetAddress对象。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 上面讲到的方法均提到返回一个或多个InetAddress对象的引用，实际上每一个方法都要返回一个或多个Inet4Address/Inet6Address对象的引用。一旦获得了InetAddress对象，你就可以使用其他非静态方法得到你想要的东东了。</div>
<div>&nbsp;</div>
<div><font size="3">2、Socket类<br />
</font><strong>描述：</strong>Socket是建立网络连接时使用的。在连接成功时，服务端和客户端都会产生一个Socket实例，操作这个实例，完成所需的会话。对于一个网络连接来说，套接字是平等的，并没有差别，不因为在服务器端或在客户端而产生不同级别。</div>
<div>&nbsp;</div>
<div><strong>构造方法：</strong>该类有多个构造方法，常用的有两个：<strong>Socket(InetAddress addr, int port) </strong>和 <strong>Socket(String host, int port)<br />
</strong>&nbsp;&nbsp;&nbsp; 两个构造方法都创建了一个基于指定接服务器主机名或InetAddress和服务器端口号的流套接字。对于第一个InetAddress子类对象通过addr参数获得服务器主机的IP地址，对于第二个函数host参数包被分配到InetAddress对象中，如果没有IP地址与host参数相一致，那么将抛出UnknownHostException异常对象。<br />
&nbsp;&nbsp;&nbsp; 如果创建连接成功，java网络API将在客户端的流套接字中捆绑客户程序的IP地址和任意一个端口号，否则两个函数都会抛出一个IOException对象。</div>
<div>&nbsp;</div>
<div><strong>重要方法：</strong><br />
&nbsp;&nbsp;&nbsp; <strong>InputStream getInputStream();<br />
</strong>&nbsp;&nbsp;&nbsp; 获得网络连接输入，同时返回一个IutputStream对象实例。</div>
<div>&nbsp;&nbsp;&nbsp; <strong>OutputStream getOutputStream();<br />
</strong>&nbsp;&nbsp;&nbsp; 获得网络连接输出,连接的另一端将得到输入，同时返回一个OutputStream对象实例。</div>
<div>&nbsp;&nbsp;&nbsp; 必须捕获两个方法可能产生的IOException。怎么操作这些流对象就看你要作什么了！：）</div>
<div>&nbsp;</div>
<div><strong><font size="3">3、ServerSocket类</font></strong><br />
<strong>描述：</strong>该类用于服务器端。<br />
<strong>构造方法</strong>：该类有四个构造方法，常用的有：<br />
&nbsp;&nbsp;&nbsp; <strong>ServerSocket(int port)<br />
</strong>&nbsp;&nbsp;&nbsp; 通过指定监听端口号来创建ServerSocket对象，如果在这时出现错误将抛出IOException异常对象，否则将创建ServerSocket对象并开始准备接收连接请求。接下来无限循环调用accept()方法。</div>
<div>&nbsp;</div>
<div><strong>重要方法：</strong><br />
&nbsp;&nbsp;&nbsp; <strong>Socket accept();<br />
</strong>&nbsp;&nbsp;&nbsp; 调用开始后accept()方法将导致调用线程阻塞直到连接建立。在建立连接后accept()返回一个最近创建的Socket对象，该Socket对象绑定了客户程序的IP地址和端口号。</div>
<div>&nbsp;</div>
<div><strong><font size="3">4、注意事项：</font></strong><br />
&nbsp;&nbsp;&nbsp; 在服务端和客户端均未发送数据时，不要在同时在两端的while()循环里读取 InputStream。否则将造成阻塞。<br />
&nbsp;&nbsp;&nbsp; 如果用字符流处理数据，请在数据末尾加上 &ldquo;<strong>\r\n</strong>&rdquo;,并记得 <strong>flush()</strong>一下。</div>
<div>&nbsp;</div>
<div><strong><font size="4">二、实例</font></strong><br />
<strong><font size="3">1、 服务端 SimpleServerSocket:</font></strong><br />
&nbsp;&nbsp;&nbsp; 例子采用字节流来操作，注释部分是采用字符流来操作。</div>
<div>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.unihub.unicall.test; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.IOException; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.net.ServerSocket; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;SocketServerTest&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;ServerSocket&nbsp;server&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;port&nbsp;=&nbsp;</span><span class="number">9999</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;SocketServerTest()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;counter&nbsp;=&nbsp;</span><span class="number">1</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.server&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ServerSocket(</span><span class="keyword">this</span><span>.port); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;ex)&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(</span><span class="string">&quot;Can't&nbsp;listening&nbsp;on&nbsp;port:&quot;</span><span>&nbsp;+&nbsp;</span><span class="keyword">this</span><span>.port); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace(System.err); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(-</span><span class="number">1</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;Start&nbsp;listening&nbsp;on&nbsp;port:&quot;</span><span>&nbsp;+&nbsp;</span><span class="keyword">this</span><span>.port); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(</span><span class="keyword">true</span><span>)&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;ServerThread(server.accept(),counter).start(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counter++; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SocketServerTest&nbsp;sserver&nbsp;=&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;SocketServerTest(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<p>线程类：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.unihub.unicall.test; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.BufferedInputStream; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.io.BufferedOutputStream; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.IOException; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.net.Socket; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;com.unihub.unicall.common.util.SocketUtil; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ServerThread&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Thread&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Socket&nbsp;client; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;counter; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;ServerThread(Socket&nbsp;client,&nbsp;</span><span class="keyword">int</span><span>&nbsp;counter)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;[info]&nbsp;Create&nbsp;connection&nbsp;with&nbsp;&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;client.getInetAddress().getHostAddress().toString() &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;</span><span class="string">&quot;&nbsp;successful.&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.client&nbsp;=&nbsp;client; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.counter&nbsp;=&nbsp;counter; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;run()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedInputStream&nbsp;bis&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BufferedInputStream(client &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getInputStream()); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedOutputStream&nbsp;bos&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BufferedOutputStream(client &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getOutputStream()); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;BufferedReader&nbsp;in&nbsp;=&nbsp;new&nbsp;BufferedReader(new </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;InputStreamReader(client.getInputStream())); </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;PrintWriter&nbsp;out&nbsp;=&nbsp;new&nbsp;PrintWriter(client.getOutputStream(),true); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bos.write((</span><span class="string">&quot;Hi!&nbsp;Enter&nbsp;QUIT&nbsp;to&nbsp;exit.\r\n&quot;</span><span>).getBytes()); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bos.flush(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;done&nbsp;=&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;bytes&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">byte</span><span>[client.getReceiveBufferSize()]; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(!done)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;contentLength&nbsp;=&nbsp;bis.read(bytes); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(contentLength&nbsp;==&nbsp;-</span><span class="number">1</span><span>)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;contentLength&nbsp;=&nbsp;&quot;</span><span>&nbsp;+&nbsp;contentLength); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;done&nbsp;=&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;recieve&nbsp;=&nbsp;new&nbsp;String(bytes,&nbsp;0,&nbsp;contentLength); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(recieve.trim().equalsIgnoreCase(&quot;quit&quot;))&nbsp;{ </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;done&nbsp;=&nbsp;true; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;[info]&nbsp;&quot;&nbsp;+&nbsp;recieve); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">// </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bos </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.write((&quot;Echo&nbsp;server(&quot;&nbsp;+&nbsp;counter&nbsp;+&nbsp;&quot;):&quot; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;recieve&nbsp;+&nbsp;&quot;\r\n&quot;).getBytes()); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bos.flush(); </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;b1&nbsp;=&nbsp;SocketUtil.getSubByte(bytes,&nbsp;</span><span class="number">0</span><span>,&nbsp;</span><span class="number">4</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;b2&nbsp;=&nbsp;SocketUtil.getSubByte(bytes,&nbsp;</span><span class="number">4</span><span>,&nbsp;</span><span class="number">4</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;b3&nbsp;=&nbsp;SocketUtil.getSubByte(bytes,&nbsp;</span><span class="number">20</span><span>,&nbsp;</span><span class="number">257</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;111111111111:&quot;</span><span>+SocketUtil.byte2int(b1)); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;报文长度:&quot;</span><span>+SocketUtil.byte2int(b2)); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;报文内容:&quot;</span><span>+</span><span class="keyword">new</span><span>&nbsp;String(b3,</span><span class="string">&quot;ISO-8859-1&quot;</span><span>)); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;String&nbsp;recieve; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;while((recieve&nbsp;=&nbsp;in.readLine())&nbsp;!=&nbsp;null) </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;{ </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;if(recieve.trim().equalsIgnoreCase(&quot;quit&quot;)){break;} </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;else </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;{ </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;System.out.println(&quot;[info]&nbsp;&quot;&nbsp;+&nbsp;recieve); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;out.println(&quot;Echo&nbsp;server(&quot;+&nbsp;counter&nbsp;+&quot;):&quot;&nbsp;+&nbsp;recieve); </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;} </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;} </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">finally</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(client&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.close(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;[info]&nbsp;Disconnect&nbsp;successful.&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e1)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e1.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
<p><strong><font size="3">2、 客户端 SimpleSocket:</font></strong></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.cyberobject.socket; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.*; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.net.*; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;SimpleSocket&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>{&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">private</span><span>&nbsp;Socket&nbsp;client; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;host&nbsp;=&nbsp;</span><span class="string">&quot;192.168.0.66&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;port&nbsp;=&nbsp;</span><span class="number">30000</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;SimpleSocket()&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.client&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Socket(InetAddress.getByName(</span><span class="keyword">this</span><span>.host),</span><span class="keyword">this</span><span>.port); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;[info]&nbsp;Connect&nbsp;to&nbsp;&quot;</span><span>&nbsp;+&nbsp;</span><span class="keyword">this</span><span>.host&nbsp;+&nbsp;</span><span class="string">&quot;&nbsp;successful.&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;in&nbsp;=&nbsp;new&nbsp;BufferedReader(new </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStreamReader(client.getInputStream())); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter&nbsp;out&nbsp;=&nbsp;new&nbsp;PrintWriter(client.getOutputStream(),true); </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;systemIn&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BufferedReader(</span><span class="keyword">new</span><span>&nbsp;InputStreamReader(System.in)); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;BufferedInputStream&nbsp;bis&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BufferedInputStream(client.getInputStream()); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;BufferedOutputStream&nbsp;bos&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BufferedOutputStream(client.getOutputStream()); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;[info]&nbsp;Start...&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;done&nbsp;=&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(!done) </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;recieve&nbsp;=&nbsp;in.readLine(); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(recieve&nbsp;==&nbsp;null)&nbsp;done&nbsp;=&nbsp;true; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(recieve); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(systemIn.readLine()); </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;bytes&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">byte</span><span>[client.getReceiveBufferSize()]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;len&nbsp;=&nbsp;</span><span class="number">0</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(!done) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;bis.read(bytes); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(len&nbsp;==&nbsp;-</span><span class="number">1</span><span>)&nbsp;done&nbsp;=&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;recieve&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;String(bytes,&nbsp;</span><span class="number">0</span><span>,&nbsp;len); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(recieve); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bos.write(systemIn.readLine().getBytes()); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bos.flush(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;[info]&nbsp;Stop.&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;ex)&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;ex.printStackTrace(System.err); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">finally</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(client&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.close(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;SimpleSocket&nbsp;ssocket&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SimpleSocket(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://damies.javaeye.com/blog/114909#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 21 Aug 2007 16:08:12 +0800</pubDate>
        <link>http://damies.javaeye.com/blog/114909</link>
        <guid>http://damies.javaeye.com/blog/114909</guid>
      </item>
      <item>
        <title>全面认识UML类图元素</title>
        <author>damies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://damies.javaeye.com">damies</a>&nbsp;
          链接：<a href="http://damies.javaeye.com/blog/82239" style="color:red;">http://damies.javaeye.com/blog/82239</a>&nbsp;
          发表时间: 2007年05月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          开发Java应用程序时，开发者要想有效地利用统一建模语言（UML），必须全面理解UML元素以及这些元素如何映射到Java。本文重点讨论UML类图中的元素。<br />
　　<br />
　　类图是最常用的UML图，它用于描述系统的结构化设计。其中包括类关系以及与每个类关联的属性及行为。类图能出色地表示继承与合成关系。为了将类图作为一种高效的沟通工具使用，开发者必须理解如何将类图上出现的元素转换到Java中。下面来进一步探索这一转换过程。<br />
　　<br />
　　<strong>元素</strong><br />
　　<br />
　　在后面的小节中，分别讲解了类图的各个元素及其在Java中相应的表示。我会列出元素名，后续简短的代码片断和一幅图来表示元素在类图上的样子。每一节的最后简要总结了该元素。<br />
　　<br />
　　<strong>类（Class）</strong><br />
　　<br />
　　类（图A）是对象的蓝图，其中包含3个组成部分。第一个是Java中定义的类名。第二个是属性（attributes）。第三个是该类提供的方法。<br />
　　<br />
　　属性和操作之前可附加一个可见性修饰符。加号（+）表示具有公共可见性。减号（-）表示私有可见性。#号表示受保护的可见性。省略这些修饰符表示具有package（包）级别的可见性。如果属性或操作具有下划线，表明它是静态的。在操作中，可同时列出它接受的参数，以及返回类型，如图A的&ldquo;Java&rdquo;区域所示。<br />
　　<br />
　　 <center>图A<br />
<img src="http://www.cnblogs.com/images/cnblogs_com/linfuguo/2003.12.15.14.11.4.1.jpg" height="145" align="baseline" hspace="5" alt="" width="500" /><br />
<br />
　　 </center><center>　</center><br />
　　<br />
　　<strong>包（Package）</strong> <br />
　　<br />
　　包（图B）是一种常规用途的组合机制。UML中的一个包直接对应于Java中的一个包。在Java中，一个包可能含有其他包、类或者同时含有这两者。进行建模时，你通常拥有逻辑性的包，它主要用于对你的模型进行组织。你还会拥有物理性的包，它直接转换成系统中的Java包。每个包的名称对这个包进行了惟一性的标识。 <br />
　　<br />
　　 <center>图B</center><br />
　　 <center><img src="http://www.cnblogs.com/images/cnblogs_com/linfuguo/2003.12.15.14.11.16.2.jpg" height="144" align="baseline" hspace="5" alt="" width="500" />　</center><br />
　　<br />
　　<strong>接口（Interface）</strong> <br />
　　<br />
　　接口（图C）是一系列操作的集合，它指定了一个类所提供的服务。它直接对应于Java中的一个接口类型。接口既可用图C的那个图标来表示，也可由附加了&lt;<interface></interface>&gt;的一个标准类来表示。通常，根据接口在类图上的样子，就能知道与其他类的关系。 <br />
　　<br />
　　 <center>图C</center><br />
　　 <center><img src="http://www.cnblogs.com/images/cnblogs_com/linfuguo/2003.12.15.14.11.25.3.jpg" height="145" align="baseline" hspace="5" alt="" width="500" />　</center><br />
　　<br />
　　<strong>关系</strong><br />
　　<br />
　　后面的例子将针对某个具体目的来独立地展示各种关系。虽然语法无误，但这些例子可进一步精炼，在它们的有效范围内包括更多的语义。<br />
　　<br />
　　实体之间一个&ldquo;使用&rdquo;关系暗示一个实体的规范发生变化后，可能影响依赖于它的其他实例（图D）。更具体地说，它可转换为对不在实例作用域内的一个类或对象的任何类型的引用。其中包括一个局部变量，对通过方法调用而获得的一个对象的引用（如下例所示），或者对一个类的静态方法的引用（同时不存在那个类的一个实例）。也可利用&ldquo;依赖&rdquo;来表示包和包之间的关系。由于包中含有类，所以你可根据那些包中的各个类之间的关系，表示出包和包的关系。<br />
　　<br />
　　 <center>图D</center><br />
　　 <center>　</center>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.cnblogs.com/images/cnblogs_com/linfuguo/2003.12.15.14.11.35.4.jpg" height="143" align="baseline" hspace="5" alt="" width="500" /><br />
　　<br />
　　<strong>关联（Association）</strong><br />
　　<br />
　　实体之间的一个结构化关系表明对象是相互连接的。箭头是可选的，它用于指定导航能力。如果没有箭头，暗示是一种双向的导航能力。在Java中，关联（图E）转换为一个实例作用域的变量，就像图E的&ldquo;Java&rdquo;区域所展示的代码那样。可为一个关联附加其他修饰符。多重性（Multiplicity）修饰符暗示着实例之间的关系。在示范代码中，Employee可以有0个或更多的TimeCard对象。但是，每个TimeCard只从属于单独一个Employee。<br />
　　<br />
　　 <center>图E</center><br />
　　 <center>　</center><img src="http://www.cnblogs.com/images/cnblogs_com/linfuguo/2003.12.15.14.11.45.5.jpg" height="144" align="baseline" hspace="5" alt="" width="500" /><br />
　　<br />
　　聚合（Aggregation）<br />
　　<br />
　　聚合（图F）是关联的一种形式，代表两个类之间的整体/局部关系。聚合暗示着整体在概念上处于比局部更高的一个级别，而关联暗示两个类在概念上位于相同的级别。聚合也转换成Java中的一个实例作用域变量。<br />
　　<br />
　　关联和聚合的区别纯粹是概念上的，而且严格反映在语义上。聚合还暗示着实例图中不存在回路。换言之，只能是一种单向关系。<br />
　　<br />
　　 <center>图F</center><br />
　　 <center>　<img src="http://www.cnblogs.com/images/cnblogs_com/linfuguo/2003.12.15.14.11.53.6.jpg" height="144" align="baseline" hspace="5" alt="" width="500" /></center><br />
　　<br />
　　<strong>合成（Composition）</strong><br />
　　<br />
　　合成 （图G）是聚合的一种特殊形式，暗示&ldquo;局部&rdquo;在&ldquo;整体&rdquo;内部的生存期职责。合成也是非共享的。所以，虽然局部不一定要随整体的销毁而被销毁，但整体要么负责保持局部的存活状态，要么负责将其销毁。局部不可与其他整体共享。但是，整体可将所有权转交给另一个对象，后者随即将承担生存期职责。<br />
　　Employee和TimeCard的关系或许更适合表示成&ldquo;合成&rdquo;，而不是表示成&ldquo;关联&rdquo;。<br />
　　<br />
　　 <center>图G</center><br />
　　 <center>　<img src="http://www.cnblogs.com/images/cnblogs_com/linfuguo/2003.12.15.14.12.4.7.jpg" height="143" align="baseline" hspace="5" alt="" width="500" /></center><br />
　　<br />
　　<strong>泛化（Generalization）</strong><br />
　　<br />
　　泛化（图H）表示一个更泛化的元素和一个更具体的元素之间的关系。泛化是用于对继承进行建模的UML元素。在Java中，用extends关键字来直接表示这种关系。<br />
　　<br />
　　 <center>图H</center><br />
　　 <center><img src="http://www.cnblogs.com/images/cnblogs_com/linfuguo/2003.12.15.14.12.13.8.jpg" height="144" align="baseline" hspace="5" alt="" width="500" />　</center><br />
　　<br />
　　<strong>实现（Realization）</strong><br />
　　<br />
　　实例（图I）关系指定两个实体之间的一个合同。换言之，一个实体定义一个合同，而另一个实体保证履行该合同。对Java应用程序进行建模时，实现关系可直接用implements关键字来表示。<br />
　　<br />
　　 <center>图I</center><br />
　　 <img src="http://www.cnblogs.com/images/cnblogs_com/linfuguo/2003.12.15.14.12.21.9.jpg" height="143" align="baseline" hspace="5" alt="" width="500" /> <center>&nbsp;</center><br />
　　<br />
　　<strong>精确映射</strong><br />
　　<br />
　　如本文所述，UML类图上的元素能精确映射到Java编程语言。开发团队的成员可利用这种精确性来加强沟通，取得对系统结构化设计的共识。
          <br/>
          <span style="color:red;">
            <a href="http://damies.javaeye.com/blog/82239#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 May 2007 16:36:15 +0800</pubDate>
        <link>http://damies.javaeye.com/blog/82239</link>
        <guid>http://damies.javaeye.com/blog/82239</guid>
      </item>
      <item>
        <title>类与类关系的UML图与代码表现 </title>
        <author>damies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://damies.javaeye.com">damies</a>&nbsp;
          链接：<a href="http://damies.javaeye.com/blog/82221" style="color:red;">http://damies.javaeye.com/blog/82221</a>&nbsp;
          发表时间: 2007年05月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font face="Arial">
<div class="code_title">类与类之间的关系对于理解面向对象具有很重要的作用，以前在面试的时候也经常被问到这个问题，在这里我就介绍一下。<br />
类与类之间存在以下关系:<br />
<strong><font color="#3366ff">(1)泛化(Generalization)<br />
(2)关联(Association)<br />
(3)依赖(Dependency)<br />
(4)聚合(Aggregation)</font></strong></div>
<div class="code_title"><br />
<font face="Arial"><strong>UML图与应用代码例子:</strong><br />
<strong><font size="4" color="#ff9900"><font color="#3366ff">1.泛化(Generalization)</font><br />
</font><font size="3" color="#339966">[泛化]</font><br />
</strong>表示类与类之间的继承关系，接口与接口之间的继承关系，或类对接口的实现关系。一般化的关系是从子类指向父类的，与继承或实现的方法相反。<br />
<font size="3" color="#339966"><strong>[具体表现]<br />
</strong></font><font color="#ff0000">父类</font> 父类实例＝new <font color="#ff0000">子类</font>()<br />
<strong><font size="3" color="#339966">[UML图](图1.1)<br />
</font><img src="http://seagar.javaeye.com/upload/picture/pic/1320/10bfdb9d-ed2d-4226-bab2-f814d2e10a82.jpg" onload="resizeImg(this,520)" alt="" /><br />
</strong><font face="Arial"><font color="#339966"><strong>图1.1</strong></font> <strong>Animal类与Tiger类,Dog类的泛化关系</strong></font></font></div>
<font face="Arial"><font face="Arial"><strong>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;Animal{}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="keyword">class</span><span>&nbsp;Tiger&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Animal{}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Test&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>{&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;test()&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Animal&nbsp;a=</span><span class="keyword">new</span><span>&nbsp;Tiger();&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><font face="Arial"><strong><font size="4" color="#3366ff">2.依赖(Dependency)</font><br />
</strong><font size="3" color="#339966"><strong>[依赖]<br />
</strong></font>对于两个相对独立的对象，当一个对象负责构造另一个对象的实例，或者依赖另一个对象的服务时，这两个对象之间主要体现为依赖关系。<br />
<font size="3" color="#339966"><strong>[具体表现]<br />
</strong></font>依赖关系表现在<font color="#ff0000">局部变量</font>，<font color="#ff0000">方法的参数</font>，以及对<font color="#ff0000">静态方法的调用</font><br />
<font size="3" color="#339966"><strong>[现实例子]<br />
</strong></font>比如说你要去拧螺丝，你是不是要借助(也就是依赖)螺丝刀(Screwdriver)来帮助你完成拧螺丝(screw)的工作<br />
<font size="3" color="#339966"><strong>[UML表现](图1.2)</strong></font><br />
</font></p>
<div align="left"><strong><img src="http://seagar.javaeye.com/upload/picture/pic/1319/ec7bca6c-c01a-4772-a91b-3a695773ddfb.jpg" onload="resizeImg(this,520)" alt="" /></strong>
<div align="left"><br />
<font face="Arial"><strong><font color="#339966">图1.2 </font>Person类与Screwdriver类的依赖关系</strong><br />
<font face="Arial"><font size="3" color="#339966"><strong><br />
</strong></font></font></font></div>
</div>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Person{&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**&nbsp;拧螺丝&nbsp;*/</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;screw(Screwdriver&nbsp;screwdriver){&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;screwdriver.screw();&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><font face="Arial"><strong><font size="4" color="#3366ff">3.关联(Association)</font><br />
</strong><font size="3" color="#339966"><strong>[关联]<br />
</strong></font>对于两个相对独立的对象，当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时，这两个对象之间为关联关系。<br />
<font size="3" color="#339966"><strong>[具体表现]<br />
</strong></font>关联关系是使用<font color="#ff0000">实例变量</font>来实现<br />
<font size="3" color="#339966"><strong>[现实例子]<br />
</strong></font>比如客户和订单，每个订单对应特定的客户，每个客户对应一些特定的订单；再例如公司和员工，每个公司对应一些特定的员工，每个员工对应一特定的公司<br />
<strong><font size="3" color="#339966">[UML图] (图1.3)<br />
</font><img src="http://seagar.javaeye.com/upload/picture/pic/1318/d4b10677-364d-4c34-beb7-416f8e835d8c.jpg" onload="resizeImg(this,520)" alt="" /><br />
<font face="Arial"><strong><font color="#339966">图1.3 </font></strong>公司和员工的关联关系</font></strong></font><br />
<font face="Arial"><strong><br />
</strong></font></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Company{&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Employee&nbsp;employee;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Employee&nbsp;getEmployee(){&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;employee;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setEmployee(Employee&nbsp;employee){&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.employee=employee;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//公司运作&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;run(){&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;employee.startWorking();&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><font face="Arial"><strong><font size="4" color="#3366ff">(4)聚合（Aggregation）</font><br />
<font size="3" color="#339966">[聚合]<br />
</font></strong>当对象A被加入到对象B中，成为对象B的组成部分时，对象B和对象A之间为聚集关系。聚合是关联关系的一种，是较强的关联关系，强调的是<font color="#ff0000">整体</font>与<font color="#ff0000">部分</font>之间的关系。<br />
<font size="3" color="#339966"><strong>[具体表现]<br />
</strong></font>与关联关系一样，聚合关系也是通过<font color="#ff0000">实例变量</font>来实现这样关系的。关联关系和聚合关系来语法上是没办法区分的，从<font color="#ff0000">语义</font>上才能<font color="#ff0000">更好的区分</font>两者的区别。<br />
<font size="3" color="#339966"><strong>[关联与聚合的区别]</strong></font><br />
(1)关联关系所涉及的两个对象是处在同一个层次上的。比如人和自行车就是一种关联关系，而不是聚合关系，因为人不是由自行车组成的。<br />
聚合关系涉及的两个对象处于不平等的层次上，一个代表整体，一个代表部分。比如电脑和它的显示器、键盘、主板以及内存就是聚集关系，因为主板是电脑的组成部分。<br />
(2)对于具有聚集关系（尤其是强聚集关系）的两个对象，整体对象会制约它的组成对象的生命周期。部分类的对象不能单独存在，它的生命周期依赖于整体类的对象的生命周期，当整体消失，部分也就随之消失。比如张三的电脑被偷了，那么电脑的所有组件也不存在了，除非张三事先把一些电脑的组件（比如硬盘和内存）拆了下来。<br />
<font size="3" color="#339966"><strong>[UML图](图1.4)</strong></font><br />
<strong><img src="http://seagar.javaeye.com/upload/picture/pic/1326/7032798b-36ca-4b89-a462-97ba056cbe48.jpg" onload="resizeImg(this,520)" alt="" /><br />
<font face="Arial"><strong><font color="#339966">图1.3 </font><font color="#000000">电脑和组件的聚合关系</font></strong></font><br />
<br />
</strong></font><br />
</p>
</strong></font></font>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Computer{&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;CPU&nbsp;cpu;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;CPU&nbsp;getCPU(){&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;cpu;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setCPU(CPU&nbsp;cpu){&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.cpu=cpu;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//开启电脑&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;start(){&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//cpu运作&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpu.run();&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
</ol>
</div>
</font>
          <br/>
          <span style="color:red;">
            <a href="http://damies.javaeye.com/blog/82221#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 May 2007 15:16:49 +0800</pubDate>
        <link>http://damies.javaeye.com/blog/82221</link>
        <guid>http://damies.javaeye.com/blog/82221</guid>
      </item>
      <item>
        <title>不使用webwork标签直接用Jsp取得Action中的值</title>
        <author>damies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://damies.javaeye.com">damies</a>&nbsp;
          链接：<a href="http://damies.javaeye.com/blog/81832" style="color:red;">http://damies.javaeye.com/blog/81832</a>&nbsp;
          发表时间: 2007年05月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp; 今天突然一个同事问我webwork如果不用标签只用JSP能不能取到值?在以前还真没考虑过这个问题,不过想想webwork的基本机制我想应该是可以的于是做了一个简单的试验证实了一下首先WEBWORK的核心机制是OGNL,于是追了一下有关XWORK的代码,发现了OgnlValueStack这个有趣的东东很明显一个存放值的堆栈于是在网上搜索了一下关于OgnlValueStack的相关最后的解决方法是:在jsp中引入<font face="Arial">&lt;%@ page import=&quot;com.opensymphony.xwork.util.OgnlValueStack&quot;%&gt;代码中添加</font></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>OgnlValueStack&nbsp;ov&nbsp;=&nbsp;(OgnlValueStack)&nbsp;request.getAttribute(</span><span class="string">&quot;webwork.valueStack&quot;</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>String&nbsp;url&nbsp;=&nbsp;(String)&nbsp;ov.findValue(</span><span class="string">&quot;url&quot;</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>url是我Action中的一个值这样就可以取到了,还是比较方便的!</p>
<div class="code_title">
<div class="code_title"></div>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://damies.javaeye.com/blog/81832#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 May 2007 14:23:07 +0800</pubDate>
        <link>http://damies.javaeye.com/blog/81832</link>
        <guid>http://damies.javaeye.com/blog/81832</guid>
      </item>
      <item>
        <title>23种模式趣味解释</title>
        <author>damies</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://damies.javaeye.com">damies</a>&nbsp;
          链接：<a href="http://damies.javaeye.com/blog/81767" style="color:red;">http://damies.javaeye.com/blog/81767</a>&nbsp;
          发表时间: 2007年05月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>创建型模式 <br />
</strong><br />
1、FACTORY&mdash;追MM少不了请吃饭了，麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西，虽然口味有所不同，但不管你带MM去麦当劳或肯德基，只管向服务员说&quot;来四个鸡翅&quot;就行了。麦当劳和肯德基就是生产鸡翅的Factory <br />
<br />
工厂模式：客户类和工厂类分开。消费者任何时候需要某种产品，只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时，工厂类也要做相应的修改。如：如何创建及如何向客户端提供。 <br />
<br />
2、BUILDER&mdash;MM最爱听的就是&quot;我爱你&quot;这句话了，见到不同地方的MM,要能够用她们的方言跟她说这句话哦，我有一个多种语言翻译机，上面每种语言都有一个按键，见到MM我只要按对应的键，它就能够用相应的语言说出&quot;我爱你&quot;这句话了，国外的MM也可以轻松搞掂，这就是我的&quot;我爱你&quot;builder。（这一定比美军在伊拉克用的翻译机好卖） <br />
<br />
建造模式：将产品的内部表象和产品的生成过程分割开来，从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化，客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。 <br />
<br />
3、FACTORY METHOD&mdash;请MM去麦当劳吃汉堡，不同的MM有不同的口味，要每个都记住是一件烦人的事情，我一般采用Factory Method模式，带着MM到服务员那儿，说&quot;要一个汉堡&quot;，具体要什么样的汉堡呢，让MM直接跟服务员说就行了。 <br />
<br />
工厂方法模式：核心工厂类不再负责所有产品的创建，而是将具体创建的工作交给子类去做，成为一个抽象工厂角色，仅负责给出具体工厂类必须实现的接口，而不接触哪一个产品类应当被实例化这种细节。 <br />
<br />
4、PROTOTYPE&mdash;跟MM用QQ聊天，一定要说些深情的话语了，我搜集了好多肉麻的情话，需要时只要copy出来放到QQ里面就行了，这就是我的情话prototype了。（100块钱一份，你要不要） <br />
<br />
原始模型模式：通过给出一个原型对象来指明所要创建的对象的类型，然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类，产品类不需要非得有任何事先确定的等级结构，原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。 <br />
<br />
5、SINGLETON&mdash;俺有6个漂亮的老婆，她们的老公都是我，我就是我们家里的老公Sigleton，她们只要说道&quot;老公&quot;，都是指的同一个人，那就是我(刚才做了个梦啦，哪有这么好的事) <br />
<br />
单例模式：单例模式确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的&quot;单一实例&quot;的需求时才可使用。 <br />
<br />
<strong>结构型模式</strong> <br />
<br />
6、ADAPTER&mdash;在朋友聚会上碰到了一个美女Sarah，从香港来的，可我不会说粤语，她不会说普通话，只好求助于我的朋友kent了，他作为我和Sarah之间的Adapter，让我和Sarah可以相互交谈了(也不知道他会不会耍我) <br />
<br />
适配器（变压器）模式：把一个类的接口变换成客户端所期待的另一种接口，从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。 <br />
<br />
7、BRIDGE&mdash;早上碰到MM，要说早上好，晚上碰到MM，要说晚上好；碰到MM穿了件新衣服，要说你的衣服好漂亮哦，碰到MM新做的发型，要说你的头发好漂亮哦。不要问我&quot;早上碰到MM新做了个发型怎么说&quot;这种问题，自己用BRIDGE组合一下不就行了 <br />
<br />
桥梁模式：将抽象化与实现化脱耦，使得二者可以独立的变化，也就是说将他们之间的强关联变成弱关联，也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系，从而使两者可以独立的变化。 <br />
<br />
8、COMPOSITE&mdash;Mary今天过生日。&quot;我过生日，你要送我一件礼物。&quot;&quot;嗯，好吧，去商店，你自己挑。&quot;&quot;这件T恤挺漂亮，买，这条裙子好看，买，这个包也不错，买。&quot;&quot;喂，买了三件了呀，我只答应送一件礼物的哦。&quot;&quot;什么呀，T恤加裙子加包包，正好配成一套呀，小姐，麻烦你包起来。&quot;&quot;......&quot;，MM都会用Composite模式了，你会了没有？ <br />
<br />
合成模式：合成模式将对象组织到树结构中，可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。 <br />
<br />
9、DECORATOR&mdash;Mary过完轮到Sarly过生日，还是不要叫她自己挑了，不然这个月伙食费肯定玩完，拿出我去年在华山顶上照的照片，在背面写上&quot;最好的的礼物，就是爱你的Fita&quot;，再到街上礼品店买了个像框（卖礼品的MM也很漂亮哦），再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来......，我们都是Decorator，最终都在修饰我这个人呀，怎么样，看懂了吗？ <br />
<br />
装饰模式：装饰模式以对客户端透明的方式扩展对象的功能，是继承关系的一个替代方案，提供比继承更多的灵活性。动态给一个对象增加功能，这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。 <br />
<br />
10、FACADE&mdash;我有一个专业的Nikon相机，我就喜欢自己手动调光圈、快门，这样照出来的照片才专业，但MM可不懂这些，教了半天也不会。幸好相机有Facade设计模式，把相机调整到自动档，只要对准目标按快门就行了，一切由相机自动调整，这样MM也可以用这个相机给我拍张照片了。 <br />
<br />
门面模式：外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口，使得子系统更易于使用。每一个子系统只有一个门面类，而且此门面类只有一个实例，也就是说它是一个单例模式。但整个系统可以有多个门面类。 <br />
<br />
11、FLYWEIGHT&mdash;每天跟MM发短信，手指都累死了，最近买了个新手机，可以把一些常用的句子存在手机里，要用的时候，直接拿出来，在前面加上MM的名字就可以发送了，再不用一个字一个字敲了。共享的句子就是Flyweight，MM的名字就是提取出来的外部特征，根据上下文情况使用。 <br />
<br />
享元模式：FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部，不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态，它们是相互独立的。将可以共享的状态和不