|  | 
				
					
			  
	2008年8月16日
	
 
			
			
		学习就从官方的测试开始,但不知道怎么回事官方的测试有问题,这我就把我配置的简单junit环境共享给大家把!1. 下载 hibernate-annotations-3.4.0.GA 并解压 ,cd 到解压后目录下2.  $>ant junit (天知道,怎么官方出的东西测试不能通过!!)    不要急,我们来看错误 (错误提示有删减)      错误-1:$>build.xml:95: ./jdbc not found.      解决办法-1: $>mkdir ./jdbc 3.   $>ant junit      错误-2:         ./build.xml:124: The following error occurred while executing this line:       ./build.xml:126: The following error occurred while executing this line:       ./common-build.xml:349: .\src\filters\hsqldb.filter as it doesn't exist.      解决办法-2:        $>mkdir  ./src/filters ;        $>echo "" > ./src/filters/hsqldb.filter ;4.    $>ant junit      错误-3:        ./build.xml:124: The following error occurred while executing this line:        ./build.xml:126: The following error occurred while executing this line:        ./common-build.xml:351: .\src\test-resources not found.       $>mkdir  ./src/test-resources ;5.    $>ant junit      错误-4:没有ant 错误了!,但测试都为错误,那我们就看看 第一个测试吧,找下原因!          test-resources:           [mkdir] Created dir: hibernate-anntations-3.4.0.GA\build\test-reports\hsqldb           [echo] Running against db: hsqldb           [junit] Running org.hibernate.test.annotations.ConfigurationTest           [junit] Tests run: 7, Failures: 0, Errors: 6, Time elapsed: 1.218 sec           .............      $>find . -name "ConfigurationTest.java" #pwd /hibernate-anntations-3.4.0.GA         ./test/org/hibernate/test/annotations/configuration/ConfigurationTest.java         ./test/org/hibernate/test/annotations/ConfigurationTest.java       根据路径 org.hibernate.test.annotations.ConfigurationTest       gvim  ./test/org/hibernate/test/annotations/ConfigurationTest.java       发现第20行: cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );       感觉应该没有配置 jdbc       gvim ./test/org/hibernate/test/annotations/hibernate.cfg.xml #果然 没配置       我这就放个我的简单配置上来(使用 hbm hsqldb 内存数据库测 试 ): <!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 <hibernate-configuration>
 <session-factory>
 <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
 <property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
 <property name="connection.url">jdbc:hsqldb:mem:hbn_ann</property>
 <property name="connection.username">sa</property>
 <property name="connection.password"></property>
 
 <mapping resource="org/hibernate/test/annotations/Boat.hbm.xml"/>
 <mapping package="org.hibernate.test.annotations"/>
 <mapping class="org.hibernate.test.annotations.Plane"/>
 </session-factory>
 </hibernate-configuration>
       我这就是要hsqldb吧,既然上面错误1有 jdbc 文件夹,那就是放 jdbc jar 的地方        $> cp ../hsqldb.jar  ./jdbc     6.    $>ant junit      呵呵 测试 第一个正确了 ! (目前配置后,测试环境并不是全部都正确,比如第2个测试)      其他测试错误日志在    .\build\test-reports\hsqldb ...      比如第2个错误 异常部分       org.hibernate.HibernateException: The dialect was not set. Set the property hibernate.dialect.     at org.hibernate.dialect.Dialect.instantiateDialect(Dialect.java:256)     at org.hibernate.dialect.Dialect.getDialect(Dialect.java:234)         ........ 大家一边学习,一边配置测试 环境吧。    错误日记 都会在 build\test-reports\hsqldb下 
			
			
		参考: http://tech.ddvip.com/2008-12/122835390597191.html 页面可以直接运行: <html><head>
 
 <style type="text/css">
 
 .box1 {
 float:left;
 width:21px;
 height:21px;
 position:relative;
 background: #F3F2E2 url(http://mp3.youdao.com/images/mbox_bg.gif) no-repeat;
 }
 .box1 {
 background-position: 0px -60px;
 }
 
 
 </style>
 
 </head>
 
 <body>
 
 <div class="box1"
 onmouseover="this.style.backgroundPosition='0px -81px' "
 onmouseout="this.style.backgroundPosition='0px -102px' "
 >
 </div>
 
 </body>
 
 </html>
 
 
			
			
		
				javascript 学习
 
						       
						javascript 大体上可分为3个不同部分组成: 核心(ECMAscript),文本对象(DOM),浏览器对象(BOM)
 
				
						
								 核心(ECMAscript): 关键字,语句,运算符,对象
								文本对象(DOM):DOM将把整个页面规划成由节点层级构成的文档.
						
								
										解析遵循 W3C html dom 标准:
								
										 
										W3C dom 参考特别关注 DOM Node 说明   
 
								BOM 浏览器对象.  cookie,弹出新浏览器,浏览器设置大小
 核心(ECMAscript)Global 内置对象;
 方法: parseInt(),isNan(),encodeURI()...等都为此对象方法
 特别注意 eval();动态语言的象征 比如:eval("alert('hi')"); 但这个方法很邪恶(安全方面)
 文本对象(DOM)说明:
 
         | <bookstore><book category="cooking">
 <title lang="en">Everyday Italian</title>
 <author>Giada De Laurentiis</author>
 <year>2005</year>
 <price>30.00</price>
 </book>
 </bookstore>
 | 
 | 
 | 
 
 
 
   1. ECMAscript基础        $ 变量弱类型 ;     匈牙利类型标示 : var iOuouValue=100; 
        $ 结束行分号有无都可以;     但再 onsubmit="javascript:function();return false;"        $ 关键字 ; 提别注意 
                 "constructor" bean.constructor 
                      //print bean function(){                           ....
                       }
                 "typeof"   var test=1; alert(typeof testX); //output "undefined"                 "NaN" - not a number ->  isNan("blue"); //output "true"   ->isNan("123"); //output "false"         $ 对象; var o = new Object(); var a = {}  
                 这里特别说明下 我们普通写的 一个 function 就是一个 object                这   var a = {name:"刘凯毅"} 等同与 var a = function(){this.name="刘凯毅"};                     来个 {name:"test",pass:"123456",addr:"bj"} //这是什么 ?! json 
                     当 var str = '{name:"test",pass:"123456",addr:"bj"}'                     var objectBean = eval(str); //这里就是 对象 objectBea.name 使用了  
 域概念: | <SCRIPT type=text/javascript> var sMessage = 'Hello';
 function setSomething() {
 sColor = 'red';
 sMessage = 'Hello World!';
 }
 setSomething();
 alert(sMessage); //Hello World!
 alert(sColor); //red
 </SCRIPT>
 | <SCRIPT type=text/javascript> var sMessage = 'Hello';
 function setSomething() {
 var sColor = 'red';
 sMessage = 'Hello World!';
 }
 setSomething();
 alert(sMessage); //Hello World!
 alert(sColor); // 什么都没有
 </SCRIPT>
 
 
 | <SCRIPT type=text/javascript> var sMessage = 'Hello';
 function setSomething() {
 var sColor = 'red';
 var sMessage = 'Hello World!';
 }
 setSomething();
 alert(sMessage); //Hello
 alert(sColor); // 什么都没有
 </SCRIPT>
 
 
 | 
           
 为面向对象做基础:object prototype 类型的对象应用。参考 | // 最简单的 继承 Object.prototype.inObj = 1;
 
 function A()
 {
 this.inA = 2;
 }
 
 A.prototype.inAProto = 3;
 
 B.prototype = new A;            // Hook up A into B's prototype chain
 B.prototype.constructor = B;
 function B()
 {
 this.inB = 4;
 }
 
 B.prototype.inBProto = 5;
 
 x = new B;
 document.write(x.inObj + ', ' + x.inA + ', ' + x.inAProto + ', ' + x.inB + ', ' + x.inBProto);
 
 //1, 2, 3, 4, 5
 //增加点信心 http://www.json.org/json.js
 
 Object.prototype.toJSONString = function (filter) {return JSON.stringify(this, filter);
 };
 后我们就可以使用 bean.toJSONString()不是吗?
 
 | 
    $ arguments ;          function getFun(){alert(arguments.length);}   ;
                   getFun("xx") //output 1                 getFun("xx",23) //output 2 
 
    $ 语句 ;特殊说明下 for             for(var i=0i<iCount;i++)   或 for( attr in object ) ;
            如果无聊 你可以 for( sProp in window ){alert(sProp+"你丫点啊!");} //看看 javascript 的反射
               
                 
    
 
 面向对象:   var bean = new Bean();    
   1.工厂方法             function getAttr(){                  alert(this.attr)
             }             function Bean(tattr){                 var bean = new Object;                 bean.attr = tattr;                 bean.getAttr = getAttr;                 return bean ;
             }         根本就是山寨版 面向对象
   2.构造           function Bean(tattr){               this.attr = tattr ;               bean.getAttr = function(){                 alert(this.attr);               }               }    其上 2 总 再Bean 对象创建时,方法会 “重复生成函数”! 
   3.原型模式     function Bean(){}     Bean.prototype.attr = "";     Bean.prototype.getAttr=function(){alert(this.attr);}     
    解决  “重复生成函数” 问题,但新的问题 Bean.prototype.getArray = new Array(); 
    其 new 对象 bean1 和 bean2 都会共享 new Array 空间(是我们不想看到的) 
   4.混合 模型 :)  哈哈      function Bean(){         this.attr= "";
         this.getArray=new Array;
     }     Bean.prototype.getAttr=function(){alert(this.attr);}  
   5.动态原型 (注意下面开始,就是真正的面向对象!!!)        function Bean(){         this.attr= "";this.getArray=new Array;
         //classload 加载 时
         if(typeof Bean._initialized == "undefined" ){             Bean.prototype.getAttr=function(){alert(this.attr);};
             Bean._initialized= true ;         }
      }
    
 /****************************************************************/
 对象继承
   1.对象冒充!!(可支持多继承,山寨很强大)
       function classA(sstr){         this.color = sstr ;         this.sayColor = function(){             alert(this.color);
         };
       }       function classC(){}
        function classB(){             this.newMethod =ClassA ;             this.newMethod();             delete this.newMethod ; 
             this.newMethod =ClassC ;             this.newMethod();             delete this.newMethod ;                          this.arrt = "google";
         }     
   2.call() apply() 也山寨,       function classA(sstr){         this.color = sstr ;         this.sayColor = function(str){             alert(str+this.color);
         };
       }
        function classB(){            // this.newMethod =ClassA ;            // this.newMethod();            // delete this.newMethod ;             classA.call(this,"red");             //classA.apply(this,new Array("red"))
             this.arrt = "baidu";
        } 3.正统的继承 原型链 (但不支持多继承)
 function classA(){this.oo="test";}
 classA.prototype.color = "red";
 function classB(){}
 classB.prototype = new classA ;
 classB.prototype.sayName = function(){
 alert( this.color );
 }
 var bb = new classB ;
 bb.sayName(); // output red
 alert(bb.oo); // output test
 
 alert( bb instanceof classA); //output true
 alert( bb instanceof classB); //output  true4.如果你要多继承!!并且还支持 instanceof
 混合方式:
 function classA(){}
 function classB(){}
 function classC(){
 classA.call(this);
 classC.call(this);
 }
 classC.prototype = new classA ;//注意 这 instanceof 只能对 A有用
 
 
 
 
 
 
 
 
 
 
			
			
		
 下载:flash-plugin-10.0.15.3-release.i386.rpm
 
 rpm -ivh flash-plugin-10.0.15.3-release.i386.rpm
 
 
			
			
		
				tomcat > server.xml
 
 <Host name="localhost" appBase="webapps"
 unpackWARs="true" autoDeploy="true"
 xmlValidation="false" xmlNamespaceAware="false">
   <Context docBase="D:/workspace/meganotes/mn_mod_admin/target/mn_mod_admin/" path="/"  />
 。。。。
 
 
 关键:在Context上不要加reloadable和debug属性
 然后 使用eclipse tomcat 调试
 ok
 
			
			
		
		
				
				<?
				xml version="1.0" encoding="UTF-8"
				?>
				
						<
				project 
				name
				="ssh"
				>
 <
				property 
				file
				="ssh.properties"
				 
				/>
 <
				tstamp
				>
 <
				format 
				property
				="TODAY"
				 pattern
				="yyyyMMddHHmm"
				 
				/>
 </
				tstamp
				>
 <
				property 
				name
				="ssh.path"
				 value
				="/data/meganotes/shell/"
				 
				/>
 
 
 <
				target 
				name
				="shell/ 文件 上载/覆盖"
				>
 <
				input 
				addproperty
				="scp_coverage_shell_file"
 message
				="输入(ssh/ 下文件名 \n\r 上载或覆盖 到服务器 218 ${ssh.path} ):"
				>
 </
				input
				>
 <
				input
 message
				="请确定是否使用 ssh/${scp_coverage_shell_file} 覆盖服务器中 ${ssh.host}:${ssh.path}${scp_coverage_shell_file} (y,n)"
 validargs
				="y,n"
				 addproperty
				="do.coverage"
				 defaultvalue
				="n"
				 
				/>
 <
				condition 
				property
				="do.abort"
				>
 <
				equals 
				arg1
				="n"
				 arg2
				="${do.coverage}"
				 
				/>
 </
				condition
				>
 <
				fail 
				if
				="do.abort"
				>
				退出
				</
				fail
				>
 
 <
				sshexec 
				host
				="${ssh.host}"
				 username
				="${ssh.myName}"
 password
				="${ssh.myPass}"
				 trust
				="true"
 command
				="
 mkdir -p ${ssh.path}backup/${TODAY} ;
 if [ -f ${ssh.path}${scp_coverage_shell_file}   ] ;
 then
 cp ${ssh.path}${scp_coverage_shell_file} ${ssh.path}backup/${TODAY}/ ;
 fi ;
 "
				>
 </
				sshexec
				>
 <
				scp 
				file
				="ssh/${scp_coverage_shell_file}"
 todir
				="${ssh.myName}:${ssh.myPass}@${ssh.host}:${ssh.path}"
 trust
				="true"
				 verbose
				="true"
				 
				/>
 
 <
				sshexec 
				host
				="${ssh.host}"
				 username
				="${ssh.myName}"
 password
				="${ssh.myPass}"
				 trust
				="true"
 command
				="chmod 777 ${ssh.path}${scp_coverage_shell_file}"
				>
 </
				sshexec
				>
 </
				target
				>
 
 <
				target 
				name
				="shell/ 文件查看"
				>
 <
				input 
				addproperty
				="show_shell_file"
				 message
				="输入查看文件名(*sh):"
 defaultvalue
				="*"
				>
 </
				input
				>
 <
				sshexec 
				host
				="${ssh.host}"
				 username
				="${ssh.myName}"
 password
				="${ssh.myPass}"
				 trust
				="true"
 command
				="ls  /data/meganotes/shell/${show_shell_file}"
				>
 </
				sshexec
				>
 </
				target
				>
 
 <
				target 
				name
				="shell/ 文件拷贝"
				>
 <
				input 
				addproperty
				="scp_shell_file"
 message
				="输入 /data/meganotes/shell/ 下需要文件名(cp 到 ssh 下):"
				>
 </
				input
				>
 <
				scp
 file
				="${ssh.myName}:${ssh.myPass}@${ssh.host}:/data/meganotes/shell/${scp_shell_file}"
 todir
				="ssh"
				 trust
				="true"
				 verbose
				="true"
				 
				/>
 </
				target
				>
 
 
 
 <
				target 
				name
				="admin-mvn组合操作"
				>
 <
				exec 
				executable
				="cmd"
				>
 <
				arg 
				value
				="/c"
				 
				/>
 <
				arg 
				value
				="${basedir}/sh/mvn/meganotes_mvn_clear.bat"
				 
				/>
 </
				exec
				>
 <
				exec 
				executable
				="cmd"
				>
 <
				arg 
				value
				="/c"
				 
				/>
 <
				arg 
				value
				="${basedir}/sh/mvn/meganotes_mvn_install.bat"
				 
				/>
 </
				exec
				>
 <
				exec 
				executable
				="cmd"
				>
 <
				arg 
				value
				="/c"
				 
				/>
 <
				arg 
				value
				="${basedir}/sh/mvn/mn_mod_admin_mvn_intall.bat"
				 
				/>
 </
				exec
				>
 </
				target
				>
 
 
 <
				target 
				name
				="admin-tomcat日志"
				>
 <
				sshexec 
				host
				="${ssh.host}"
				 username
				="${ssh.myName}"
 password
				="${ssh.myPass}"
				 trust
				="true"
				 command
				="${ssh.adminRunLog}"
				>
 </
				sshexec
				>
 </
				target
				>
 
 <
				target 
				name
				="schedule-tomcat日志"
				>
 <
				sshexec 
				host
				="${ssh.host}"
				 username
				="${ssh.myName}"
 password
				="${ssh.myPass}"
				 trust
				="true"
 command
				="${ssh.scheduleRunLog}"
				>
 </
				sshexec
				>
 </
				target
				>
 <
				target 
				name
				="查找2008/下Mp3没转128-64文件夹"
				>
 <
				sshexec 
				host
				="${ssh.host}"
				 username
				="${ssh.myName}"
 password
				="${ssh.myPass}"
				 trust
				="true"
				 command
				="${ssh.64k}"
				>
 </
				sshexec
				>
 <
				sshexec 
				host
				="${ssh.host}"
				 username
				="${ssh.myName}"
 password
				="${ssh.myPass}"
				 trust
				="true"
				 command
				="${ssh.128k}"
				>
 </
				sshexec
				>
 <
				sshexec 
				host
				="${ssh.host}"
				 username
				="${ssh.myName}"
 password
				="${ssh.myPass}"
				 trust
				="true"
 command
				="${ssh.128kto64k.err}"
				>
 </
				sshexec
				>
 </
				target
				>
 
 <
				target 
				name
				="admin模块测试"
				>
 <
				input 
				addproperty
				="admin_test_input"
 message
				="测试类输入(Video*Test):"
				 defaultvalue
				="*Test"
				>
 </
				input
				>
 <
				echo 
				message
				="${admin_test_input}"
				></
				echo
				>
 <
				exec 
				executable
				="cmd"
				>
 <
				arg 
				value
				="/c"
				 
				/>
 <
				arg
 value
				="${basedir}/sh/admin_test.bat ${admin_test_input} "
				 
				/>
 </
				exec
				>
 </
				target
				>
 </
				project
				>
 
			
			
		
		
		
		
		
				   public
				 
				static
				 
				void
				 main(String[] args)  { 
   try  { 
   
  String charset 
								=
								 
								"
								UTF-8
								"
								; 
  String outfile 
								=
								 
								"
								d:\\category.20081218.gz
								"
								; 
  BufferedReader in 
								=
								 
								new
								 BufferedReader( 
  new
								 InputStreamReader( 
  new
								 FileInputStream(
								"
								d:\\category.20081218
								"
								), 
  charset)); 
   
  BufferedOutputStream out 
								= 
  new
								 BufferedOutputStream( 
  new
								 GZIPOutputStream( 
  new
								 FileOutputStream(outfile))); 
   
   
  System.out.println(
								"
								Writing file
								"
								); 
  String c; 
  while
								((c 
								=
								 in.readLine())
								!=
								null
								) 
  out.write( (c
								+
								"
								\n
								"
								).getBytes(charset)); 
  in.close(); 
  out.close(); 
  System.out.println(
								"
								Reading file
								"
								); 
  BufferedReader in2 
								= 
  new
								 BufferedReader( 
  new
								 InputStreamReader( 
  new
								 GZIPInputStream( 
  new
								 FileInputStream(outfile) 
  ),charset 
  ) 
  ); 
  String s; 
  while
								((s 
								=
								 in2.readLine()) 
								!=
								 
								null
								) 
  System.out.println(s); 
   }
						
						 
						catch
						(Exception e)  { 
  e.printStackTrace(); 
  } 
  } 
			
			
		
		官方上下  http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/ $.补全中文  修改      jquery.autocomplete.js 中     $input.bind(($.browser.opera ? "keypress" : "keydown")     改为      $input.bind(($.browser.opera ? "keypress" : "keyup ")      $. 在 localdata.js 》》 var cities = [..      中放些 中文 测试吧  测试页面 ,最简单的使用页面 。(应该算是最简单补全测试了) <script type="text/javascript" src="../lib/jquery.js"></script><script type='text/javascript' src='../jquery.autocomplete.js'></script>
 
 <link rel="stylesheet" type="text/css" href="../jquery.autocomplete.css" />
 <script type="text/javascript">
 $().ready(function() {
 $("#suggest1").autocomplete([
 "test1",
 "test2",
 "测试1",
 "测试2"
 ]);
 });
 </script>
 
 <input type="text" id="suggest1" />
 
 使用json  <script type="text/javascript" src="../lib/jquery.js"></script>
 <script type='text/javascript' src='../jquery.autocomplete.js'></script>
 
 <script type='text/javascript' src='localdata.js'></script>
 <link rel="stylesheet" type="text/css" href="../jquery.autocomplete.css" />
 <script type="text/javascript">
 var emails = [
 { name: "Peter Pan", to: "peter@pan.de" },
 { name: "Molly", to: "molly@yahoo.com" },
 { name: "Forneria Marconi", to: "live@japan.jp" },
 { name: "Master <em>Sync</em>", to: "205bw@samsung.com" },
 { name: "Dr. <strong>Tech</strong> de Log", to: "g15@logitech.com" },
 { name: "Don Corleone", to: "don@vegas.com" },
 { name: "Mc Chick", to: "info@donalds.org" },
 { name: "Donnie Darko", to: "dd@timeshift.info" },
 { name: "Quake The Net", to: "webmaster@quakenet.org" },
 { name: "Dr. Write", to: "write@writable.com" }
 ]
 
 
 $().ready(function() {
 $("#suggest13").autocomplete(emails, {
 //补全中选择显示
 formatItem: function(row, i, max) {
 return i + "/" + max + ": \"" + row.name + "\" [" + row.to + "]";
 },
 //补全匹配格式
 formatMatch: function(row, i, max) {
 return row.name ;
 },
 //补全选定后显示
 formatResult: function(row) {
 return row.to;
 }
 })
 });
 </script>
 
 
			
			不要为 拼写 ajax url 而郁闷了。希望能对大家有帮助。 /* 1.form ajax 使用:
 eG: form就是普通的 html form
 <input type="button" value="xx" onclick="formAjax('data.jsp',this.form,ajaxReturn)"/>
 function ajaxReturn(data){
 document.getElementById("div1").innerHTML =  data ;
 }
 
 
 2.ajax 使用   :
 AjaxFunction
 AjaxFunction('url?param=tt¶m2=te',function(text){
 alert(text);
 });
 
 3.迭代器:
 recursiveNodes(array,dom,pushFun,layer)
 array 迭代寄存器
 dom 被迭代对象
 pushFun 自定义收集方法
 pushFun(array,node,layer)
 node 迭代中对象
 layer 深度
 EG:
 var arr = [] ;
 recursiveNodes(arr ,dom,function(array,node,layer){
 arr.push(node);
 },2);
 
 
 
 */
 var _request;
 try {
 this._request = new XMLHttpRequest();
 } catch (e) {
 try {
 this._request = new ActiveXObject('Msxml2.XMLHTTP');
 } catch (e) {
 try {
 this._request = new ActiveXObject('Microsoft.XMLHTTP');
 } catch (e) {
 request = false;
 }
 }
 }
 
 var AjaxFunction = function(urls, getAjaxText) {
 AjaxFunction._getAjaxText = null;
 
 _url = '';
 _params = '';
 
 AjaxFunction._getAjaxText = getAjaxText;
 var strs = urls.split(/\?/);
 _url = strs[0];
 if (strs.length > 1)
 _params = strs[1];
 
 _request.open("POST", this._url, true);
 _request.setRequestHeader("Cache-Control", "no-cache");
 _request.setRequestHeader("content-type",
 "application/x-www-form-urlencoded");
 _request.send(_params);
 _request.onreadystatechange = _onComplete;
 };
 function _onComplete() {
 if (_request.readyState == 4) {
 if (_request.status == 200 || _request.status == 0) {
 if (_request.responseText != null && _request.responseText != ''
 && _request.responseText != ' ')
 AjaxFunction._getAjaxText(_request.responseText);
 }
 }
 }
 
 /*
 * 迭代 1. array,dom 2. array,dom,layer
 */
 function recursiveNodes(array, dom, pushFun, layer) {
 if (layer == 0)
 return;
 if (layer > 0) {
 --layer;
 if (dom.hasChildNodes && dom.hasChildNodes()) {
 for ( var i = 0; i < dom.childNodes.length; i++) {
 var nodeT = dom.childNodes.item(i);
 if (typeof pushFun == "function")
 pushFun(array,nodeT, layer);
 else
 array.push(nodeT);
 recursiveNodes(array, dom.childNodes.item(i), pushFun, layer);
 }
 } else
 return;
 } else if (layer < 0) {
 ++layer;
 var nodeT = dom.parentNode;
 if (nodeT) {
 if (typeof pushFun == "function") {
 pushFun(array,nodeT, layer);
 } else {
 array.push(nodeT);
 }
 recursiveNodes(array, dom.parentNode, pushFun, layer)
 } else
 return;
 }
 }
 
 function formAjax(url,ttform,returnFun){
 var datas = [];
 var arr = ['input','select'];
 recursiveNodes(datas,ttform,function(array,node,layer){
 for(var i=0;i<arr.length;i++){
 if( node.getAttribute ){
 var paramName = node.getAttribute('name') ;
 if( /select/i.test( node.nodeName ) ){
 array.push(paramName+'='+node.options[node.selectedIndex].value);
 }else if( paramName !=null &&  /^\s*(\w+)\s*$/g.test(paramName) && new RegExp(arr[i],'i').test(node.nodeName)  ){
 array.push(paramName+'='+node.value);
 }
 }
 }
 },999);
 //? ?
 //& &
 var urls = url+'?'+datas.join("&");
 AjaxFunction(urls,returnFun);
 }
 
 
			
			
		function trim(str){ return str.replace(/(^\s*)|(\s*$)/g,""); }
 
 function recursiveNodes(array,dom,layer){
 if( layer==0 ) return ;
 if(layer>0){
 --layer;
 if( dom.hasChildNodes && dom.hasChildNodes() ){
 for(var i=0;i<dom.childNodes.length;i++ ){
 array.push(dom.childNodes.item(i));
 recursiveNodes(array, dom.childNodes.item(i),layer ) ;
 }
 }else return  ;
 }else if(layer<0){
 ++layer;
 if( dom.parentNode ){
 array.push( dom.parentNode );
 recursiveNodes( array,dom.parentNode,layer)
 }else return ;
 }
 }
 
 /*
 [@name || && > < >= <= != @location='UK']
 */
 function singleStep(dom,stepAction,stepStr){
 var allArrData = [] ;
 var arrData = [] ;
 var num = stepAction.split(/\//).length ;
 recursiveNodes(allArrData,dom,num==2?1:999);
 
 stepStr = trim(stepStr) ;
 var nodeName  ;
 var nodeNum ;
 var conds = true ;
 //判断单匹配 是否有 属性对比  [@..=..]
 if( /\[(.*?)\]/.test(stepStr) ){
 nodeName = trim( /.*?(?=\[{1})/g.exec(stepStr)[0]   ).replace(/\*/g,".*") ;
 conds = /\[(.*?)\]/.exec(stepStr)[1].replace(/\*/g,".*") ;
 if(! isNaN(conds) ){
 nodeNum = parseInt(conds)-1;
 
 }else{
 //属性 替换为
 conds = conds.replace(/(@)(.*?)(?=\W)/g," allArrData[i].getAttribute('$2') ") ;
 conds = conds.replace( /([\W]+)(.*?)::\'(.*?)\'/g," $1 /$3/g.test($2) " ) ;
 conds = conds.replace( /(text\(\))/g ," allArrData[i].innerHTML ") ;
 conds = conds.replace( /([\w\s])(=)/g ,"$2=") ;
 
 }
 }else{
 nodeName = stepStr ;
 }
 
 for(var j=i=0;i<allArrData.length;i++){
 if(  eval('/'+nodeName+'/i.test( allArrData[i].nodeName ) ')   ){
 if(typeof nodeNum=="number"){
 if(j==nodeNum){ arrData.push( allArrData[i] );  return arrData; }
 else     ++j;
 }else if( eval(' allArrData[i].getAttribute && '+conds) ){
 arrData.push( allArrData[i] );
 }
 }
 }
 return arrData ;
 }
 
 
 function getXpath(dom,xpathStr){
 var xpaths = xpathStr.split(/(\/{1,2})/g);
 var arrDom = [dom] ;
 for(var i=1;i<xpaths.length;i=i+2){
 var arrData = [];
 for(var j=0;j<arrDom.length;j++)
 arrData = arrData.concat( singleStep(arrDom[j],xpaths[i],xpaths[i+1]) );
 arrDom = arrData ;
 }
 return arrDom ;
 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 ******************************************************************************************************
 function trim(str){ return str.replace(/(^\s*)|(\s*$)/g,""); }
 
 function recursiveNodes(array,dom,layer){
 if( layer==0 ) return ;
 if(layer>0){
 --layer;
 if( dom.hasChildNodes && dom.hasChildNodes() ){
 for(var i=0;i<dom.childNodes.length;i++ ){
 array.push(dom.childNodes.item(i));
 recursiveNodes(array, dom.childNodes.item(i),layer ) ;
 }
 }else return  ;
 }else if(layer<0){
 ++layer;
 if( dom.parentNode ){
 array.push( dom.parentNode );
 recursiveNodes( array,dom.parentNode,layer)
 }else return ;
 }
 
 }
 
 
 
 /*
 [@name || && > < >= <= != @location='UK']
 */
 function singleStep(dom,stepAction,stepStr){
 var allArrData = [] ;
 var arrData = [] ;
 var num = stepAction.split(/\//).length ;
 recursiveNodes(allArrData,dom,num==2?1:999);
 
 stepStr = trim(stepStr) ;
 var nodeName  ;
 var conds = true ;
 //判断单匹配 是否有 属性对比  [@..=..]
 if( /\[(.*?)\]/.test(stepStr) ){
 nodeName = trim( /^(.*?)\[{1}/.exec(stepStr)[1] ) ;
 //属性 替换为
 conds = /\[(.*?)\]/.exec(stepStr)[1].replace(/(@)(.*?)(?=\W)/g," allArrData[i].getAttribute('$2').toString() ") ;
 conds = conds.replace( /([\W]+)(.*?)::\'(.*?)\'/g," $1 /$3/g.test($2) " ) ;
 conds = conds.replace( /(text\(\))/g ," allArrData[i].innerHTML ") ;
 conds = conds.replace( /([\w\s])(=)/g ,"$2=") ;
 }else{
 nodeName = stepStr ;
 }
 
 for(var i=0;i<allArrData.length;i++){
 if(  new RegExp(nodeName, 'i').test( allArrData[i].nodeName ) && eval(conds) ){
 arrData.push( allArrData[i] );
 }
 }
 return arrData ;
 }
 
 
 function getXpath(dom,xpathStr){
 var xpaths = xpathStr.split(/(\/{1,2})/g);
 var arrDom = [dom] ;
 for(var i=1;i<xpaths.length;i=i+2){
 var arrData = [];
 for(var j=0;j<arrDom.length;j++)
 arrData = arrData.concat( singleStep(arrDom[j],xpaths[i],xpaths[i+1]) );
 arrDom = arrData ;
 }
 return arrDom ;
 }
 
 
			
			
		Python is a dynamic object-oriented programming language that can be used for many kinds of software development.
 
 It offers strong support for integration with other languages and tools, comes with extensive standard libraries, and can be learned in a few days.
 offers 提出
 integration 综合
 extensive 宽广
 standard libraries 标准库
 
 
 Many Python programmers report substantial productivity gains and feel the language encourages the development of higher quality, more maintainable code.
 report 宣告
 substantial 实质
 productivity 生产力
 
 
 
			
					直接 运行 div_show_drag.rar http://www.blogjava.net/Files/Good-Game/div_Show_drag.rar html test  <html><head>
 
 <script type="text/javascript" src="showDivUtil.js"></script>
 
 </head>
 
 <body>
 
 <input type="button" id="_in" value="google-baidu" onclick="test();"/>
 <div id='_div' />
 <script language="javascript">
 /*api说明
 ShowDiv( 源element , 是否使用现有 div )
 源element,是否使用现有 div 都可为null ;
 */
 var ediv = new ShowDiv('_in',null);
 
 function test(){
 if( ! ediv.isShow ){
 // tdiv[X,Y,H,W]准备展现div set->tdiv.X = ..    ,
 // tsubEle[X,Y,H,W]
 // 源ele大小位置  ,tscreen[screenH,screenW]屏幕长宽
 ediv.setLocation = function(tdiv,tsubEle,tscreen){
 /*  居中展现
 tdiv.W =200 ;
 tdiv.H = 300 ;
 tdiv.X = tscreen.screenW/2-tdiv.W/2 ;
 tdiv.Y = tscreen.screenH/2-tdiv.H/2 ;
 */
 
 /*  根据 tsubEle 位置 左显示
 tdiv.X = tsubEle.X+tsubEle.W ;
 tdiv.Y = tsubEle.Y ;
 */
 
 /*  根据 tsubEle 大小  左长条 显示
 tdiv.X = tsubEle.X+tsubEle.W ;
 tdiv.Y = tsubEle.Y ;
 */
 
 
 /*  根据 tsubEle 大小  下长条 显示
 tdiv.X = tsubEle.X+tsubEle.W ;
 tdiv.Y = tsubEle.Y ;
 tdiv.H = 200 ;
 tdiv.W = tsubEle.W ;
 */
 
 /*
  .. 等等 自己尝试吧*/ tdiv.innerHTML = "<li>google</li><li>baidu</li>" ;
 //可以参考
 Drag.init(tdiv);
 }
 ediv.setStyle('background-color:#F4F4F4;');
 ediv.show();
 }else{
 ediv.close();
 //ediv.delete();
 }
 }
 
 </script>
 </body>
 </html>
 
 showDivUtil.js /*
 * Skynet
 *  2008-9-15 00:56
 *   liukaiyi@gmail.com
 */
 function ShowDiv(subEle,ediv){
 //public
 this.style  ;
 this.isShow = false ;
 
 //private
 this._div  ;
 this._subEle  ;
 this._subEle  ;
 
 
 if( typeof ediv == "undefined" || ediv == null)
 this._div=document.createElement("div");
 else if( typeof ediv == "string")
 this._div=document.getElementById(ediv);
 else if(  /object/.test(typeof ediv) )
 this._div= ediv ;
 
 if( typeof subEle == "string")
 this._subEle=document.getElementById(subEle);
 else if(  /object/.test(typeof subEle) )
 this._subEle= subEle ;
 
 }
 
 //外置方法 x , y ,w , h , div
 ShowDiv.prototype.setLocation = new Function() ;
 
 //设置 div 样式
 ShowDiv.prototype.setStyle=function(styleStrOrObj){
 this.style=this._div.style ;
 if( typeof styleStrOrObj == "string"){
 var strs = styleStrOrObj.split(/;/) ;
 for(var i=0;i<strs.length;i++){
 var key = strs[i].split(/:/)[0];
 var value = strs[i].split(/:/)[1];
 var _s = key.indexOf("-") ;
 if( _s>0)
 key=key.substring(0,_s)+key.substring(_s+1,_s+2).toLocaleUpperCase()+key.substring(_s+2,key.length);
 if( key!=null&&key!=''&&key!=' ' ){
 eval( 'this._div.style.'+key+'="'+value+'"' );
 }
 }
 }else if(  /object/.test(typeof styleStrOrObj) ) {
 this._div.style = styleStrOrObj ;
 }
 if(this._div.style.position==null || this._div.style.position=="")
 this._div.style.position="absolute";
 }
 
 ShowDiv.prototype.show=function(){
 if( typeof this._subEle != "undefined" || this._subEle != null){
 this._subEle.Y = getElementPos(this._subEle).y;
 this._subEle.X = getElementPos(this._subEle).x ;
 this._subEle.W = this._subEle.offsetWidth ;
 this._subEle.H = this._subEle.offsetHeight ;
 }
 //this._div.Y = sset
 //this._div.X = sset
 this._div.W = parseInt( this._div.style.width );
 this._div.H = parseInt( this._div.style.height );
 
 this.setLocation(this._div,this._subEle,{screenW:document.body.clientWidth,screenH:document.body.clientHeight});
 this._div.style.left = this._div.X  ;
 this._div.style.top = this._div.Y ;
 
 if( this._div.W && this._div.H ){
 this._div.style.width = this._div.W ;
 this._div.style.height = this._div.H ;
 }
 document.body.appendChild(this._div);
 this.isShow = true ;
 }
 
 ShowDiv.prototype.close=function(){
 document.body.removeChild(this._div);
 this.isShow = false ;
 }
 
 ShowDiv.prototype.delete=function(){
 document.body.removeChild(this._div);
 this._div = null ;
 this.isShow = false ;
 }
 
 
 //得到 Element 位置
 // 说明:用 Javascript 获取指定页面元素的位置
 // 整理:http://www.codebit.cn
 // 来源:YUI DOM
 function getElementPos(el) {
 var ua = navigator.userAgent.toLowerCase();
 var isOpera = (ua.indexOf('opera') != -1);
 var isIE = (ua.indexOf('msie') != -1 && !isOpera); // not opera spoof
 if(el.parentNode === null || el.style.display == 'none'){
 return false;
 }
 var parent = null;
 var pos = [];
 var box;
 
 if(el.getBoundingClientRect){
 // IE
 box = el.getBoundingClientRect();
 var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
 var scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
 return {x:box.left + scrollLeft, y:box.top + scrollTop};
 }else if(document.getBoxObjectFor){
 // gecko
 box = document.getBoxObjectFor(el);
 var borderLeft = (el.style.borderLeftWidth)?parseInt(el.style.borderLeftWidth):0;
 var borderTop = (el.style.borderTopWidth)?parseInt(el.style.borderTopWidth):0;
 pos = [box.x - borderLeft, box.y - borderTop];
 }else {
 // safari & opera
 pos = [el.offsetLeft, el.offsetTop];
 parent = el.offsetParent;
 if (parent != el) {
 while (parent) {
 pos[0] += parent.offsetLeft;
 pos[1] += parent.offsetTop;
 parent = parent.offsetParent;
 }
 }
 if (ua.indexOf('opera') != -1|| ( ua.indexOf('safari') != -1 && el.style.position == 'absolute' )){
 pos[0] -= document.body.offsetLeft;
 pos[1] -= document.body.offsetTop;
 }
 }
 
 if (el.parentNode) { parent = el.parentNode; }
 else { parent = null; }
 
 
 // account for any scrolled ancestors
 while (parent && parent.tagName != 'BODY' && parent.tagName != 'HTML'){
 pos[0] -= parent.scrollLeft;
 pos[1] -= parent.scrollTop;
 if (parent.parentNode) { parent = parent.parentNode; }
 else { parent = null; }
 }
 return {x:pos[0], y:pos[1]};
 }
 
 
 
 
 
			
			
		上面加上我的注解(希望能对大家理解有帮助): /*************************************************** dom-drag.js
 * 09.25.2001
 * www.youngpup.net
 * Script featured on Dynamic Drive (http://www.dynamicdrive.com) 12.08.2005
 **************************************************
 * 10.28.2001 - fixed minor bug where events
 * sometimes fired off the handle, not the root.
 *    注解:  Skynet
 *    email : liukaiyi@gmail.com
 *        blog : www.blogjava.net/Good-Game
 **************************************************/
 
 var Drag = {
 
 obj : null,
 
 /* api 说明:
 *     方法调用可以参考:http://www.dynamicdrive.com/dynamicindex11/domdrag/
 *         o 拖拽 Handle
 *        oRoot 被拖拽 element  (可选, 默认不填 o为被拖拽对象  type=object)
 *        minX, maxX, minY, maxY 限制拖拽范围 (可选,默认不填为全屏 type=int )
 *         bSwapHorzRef, bSwapVertRef 判断是否允许 横,纵向拖拽(可选,默认不填无限制 type=boolean )
 *     fXMapper(x), fYMapper(y)  为外置函数 拖拽效果体现前调用 (x,y) 为当前element位置(可选 type=Function)
 */
 init : function(o, oRoot, minX, maxX, minY, maxY, bSwapHorzRef, bSwapVertRef, fXMapper, fYMapper)
 {
 /* 拖拽事件 挂载  (本js 主线 生命周期 描述)
 *    1. 预定 o.onmousedown事件触发运行  Drag.start。
 *    2. 触发 element-> onmousedown->Drag.start
 *        2.1    先得到 element 当前"改变初"位置,记入到 o.lastMouseX ;o.lastMouseY,挂载Drag.obj,Darp.root 为当前 element。
 *        2.2     预定 document.onmousemove    = Drag.drag; document.onmouseup = Drag.end。
 *    3.  触发 document.onmousemove 运行 Drag.drag-> 拖拽效果体现。
 *    4.  触发 document.onmouseup 运行 Drag.end-> 挂载 document.onmousemove;document.onmouseup;Drag.obj取消。
 */
 o.onmousedown = Drag.start;
 
 //是否能 横,纵向拖拽
 o.hmode            = bSwapHorzRef ? false : true ;
 o.vmode            = bSwapVertRef ? false : true ;
 //挂载 o.root
 o.root = oRoot && oRoot != null ? oRoot : o ;
 
 if (o.hmode  && isNaN(parseInt(o.root.style.left  ))) o.root.style.left   = "0px";
 if (o.vmode  && isNaN(parseInt(o.root.style.top   ))) o.root.style.top    = "0px";
 if (!o.hmode && isNaN(parseInt(o.root.style.right ))) o.root.style.right  = "0px";
 if (!o.vmode && isNaN(parseInt(o.root.style.bottom))) o.root.style.bottom = "0px";
 
 // 限定 移动范围
 o.minX    = typeof minX != 'undefined' ? minX : null;
 o.minY    = typeof minY != 'undefined' ? minY : null;
 o.maxX    = typeof maxX != 'undefined' ? maxX : null;
 o.maxY    = typeof maxY != 'undefined' ? maxY : null;
 
 o.xMapper = fXMapper ? fXMapper : null;
 o.yMapper = fYMapper ? fYMapper : null;
 
 /*自定义拖拽-事件添加(相当于我们在java中的 抽象类 中未实现的方法  比如:
 *    obj.onDrag = function(x, y) {
 *        scrolldiv.style.top=y * (-1) +"px";
 *    }
 */
 o.root.onDragStart    = new Function();
 o.root.onDragEnd    = new Function();
 o.root.onDrag        = new Function();
 },
 
 //由 function init >> o.onmousedown    = Drag.start;
 start : function(e)
 {
 //得到被拖拽 element
 var o = Drag.obj = this;
 e = Drag.fixE(e);
 
 //element 移动初位置
 var y = parseInt(o.vmode ? o.root.style.top  : o.root.style.bottom);
 var x = parseInt(o.hmode ? o.root.style.left : o.root.style.right );
 //可能的外置函数调用
 o.root.onDragStart(x, y);
 //event 初位置 记入
 o.lastMouseX    = e.clientX;
 o.lastMouseY    = e.clientY;
 
 if (o.hmode) {
 if (o.minX != null)    o.minMouseX    = e.clientX - x + o.minX;
 if (o.maxX != null)    o.maxMouseX    = o.minMouseX + o.maxX - o.minX;
 } else {
 if (o.minX != null) o.maxMouseX = -o.minX + e.clientX + x;
 if (o.maxX != null) o.minMouseX = -o.maxX + e.clientX + x;
 }
 
 if (o.vmode) {
 if (o.minY != null)    o.minMouseY    = e.clientY - y + o.minY;
 if (o.maxY != null)    o.maxMouseY    = o.minMouseY + o.maxY - o.minY;
 } else {
 if (o.minY != null) o.maxMouseY = -o.minY + e.clientY + y;
 if (o.maxY != null) o.minMouseY = -o.maxY + e.clientY + y;
 }
 
 /*>>>>>>>>>>>比较关键的挂载<<<<<<<<<<<<<<
 *
 *    使用 document.onmousemove 事件 而不使用 element的,是应为当拖动太快,可能会脱离element.
 */
 document.onmousemove    = Drag.drag;
 document.onmouseup        = Drag.end;
 
 return false;
 },
 
 //由 function start>> document.onmousemove    = Drag.drag;
 drag : function(e)
 {
 e = Drag.fixE(e);
 var o = Drag.obj;
 
 var ey    = e.clientY;
 var ex    = e.clientX;
 //得到 element 当前位置(vmode,hmode判断是否可以横纵向拖拽)
 var y = parseInt(o.vmode ? o.root.style.top  : o.root.style.bottom);
 var x = parseInt(o.hmode ? o.root.style.left : o.root.style.right );
 var nx, ny;
 
 if (o.minX != null) ex = o.hmode ? Math.max(ex, o.minMouseX) : Math.min(ex, o.maxMouseX);
 if (o.maxX != null) ex = o.hmode ? Math.min(ex, o.maxMouseX) : Math.max(ex, o.minMouseX);
 if (o.minY != null) ey = o.vmode ? Math.max(ey, o.minMouseY) : Math.min(ey, o.maxMouseY);
 if (o.maxY != null) ey = o.vmode ? Math.min(ey, o.maxMouseY) : Math.max(ey, o.minMouseY);
 
 //本js中 最主要的地方:
 //得到 鼠标移动 向量 drap(x,y) = fun_drap:event(x,y) - fun_start:event(x,y)
 //并于 得到拖拽效果:  element(x,y) + drap(x,y)
 nx = x + ((ex - o.lastMouseX) * (o.hmode ? 1 : -1));
 ny = y + ((ey - o.lastMouseY) * (o.vmode ? 1 : -1));
 
 if (o.xMapper)        nx = o.xMapper(y)
 else if (o.yMapper)    ny = o.yMapper(x)
 
 //效果体现
 Drag.obj.root.style[o.hmode ? "left" : "right"] = nx + "px";
 Drag.obj.root.style[o.vmode ? "top" : "bottom"] = ny + "px";
 Drag.obj.lastMouseX    = ex;
 Drag.obj.lastMouseY    = ey;
 //调用外置函数
 Drag.obj.root.onDrag(nx, ny);
 return false;
 },
 
 //由 function start>> document.onmouseup        = Drag.end;
 end : function()
 {
 document.onmousemove = null;
 document.onmouseup   = null;
 Drag.obj.root.onDragEnd(    parseInt(Drag.obj.root.style[Drag.obj.hmode ? "left" : "right"]),
 parseInt(Drag.obj.root.style[Drag.obj.vmode ? "top" : "bottom"]));
 Drag.obj = null;
 },
 
 //跨 浏览器 得到 event
 fixE : function(e)
 {
 if (typeof e == 'undefined') e = window.event;
 if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
 if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
 return e;
 }
 };
 
 
			
			
		参考: http://neil-jh.javaeye.com/blog/199345 效果:google <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
 <%@taglib uri="/struts-tags" prefix="s"%>
 <%@taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Insert title here</title>
 </head>
 <body>
 <li>
 <!-- 类中静态变量  -->
 <s:property value="%{@action.SsdAction@GOOD}"/>
 
 <!-- 调用 方法 -->
 <s:set name="num" value="20" />
 <s:set name="listData" value="%{ ssdMethod.getBeans(#num)  }" />
 
 <!-- 和 jstl 配合使用 -->
 <select>
 <c:forEach var="btmp" items="${listData}">
 <option value="${btmp.id} }">${btmp.name}</option>
 </c:forEach>
 </select>
 
 <!-- 调用枚举类
 public enum Type {
 //id value : gget sset
 g1(1,"test1"),
 g2(2,"test2"),
 g3(3,"test3");
 
  . -->
 <s:select list="%{ @myEnum.Type@values() }" listKey="id" listValue="value" />
 
 <!-- 循环遍历 添加逻辑 ..{?#this.id>2 } -->
 <s:select list="%{ @myEnum.Type@values().{?#this.id>2 } }" listKey="id" listValue="value" />
 
 </li>
 
 
 </body>
 </html>
 
			
			haptic 触觉  --of or relating to the sensation of touch.
 --关于             触动                         感觉。
 
 haptics is the science of applying tactile sensation to humen interaction with computers .
 字面翻译:  触觉论   是  一种  科学        申请                  触觉                   与  人类       互动            和       电脑
 :  触觉论 是将人类的接触感觉应用与计算机连接的一门科学。
 
 
 A haptic device is one that involves physical contact between the computer and the user .
 》》一个触觉设备            是一个         涉及      物理        连接       在                   电脑               和    人
 》》一个触觉设备包含 计算机和用户之间的物理连接
 
 usually through an input/output device,such as a joystick or   data gloves ,that senses the body,s movements.
 》》通常     通过         一个 输入/输出  设备   , 比如     一个 操纵杆 或    数据手套 , 这些设备     感觉   身体的移动 。
 
 
			
			主页:http://code.google.com/apis/protocolbuffers/docs/overview.html testProto.proto package foo.bar;option java_package = "com.proto";
 
 message Person {
 required string name = 1;
 required int32 id = 2;
 optional string email = 3;
 
 enum PhoneType {
 MOBILE = 0;
 HOME = 1;
 WORK = 2;
 }
 
 message PhoneNumber {
 required string number = 1;
 optional PhoneType type = 2 [default = HOME];
 }
 
 repeated PhoneNumber phone = 4;
 }
 
 运行命令 '/home/kaiyi/proto/bin/protoc'  --java_out=src testProto.proto   使用(  本类可用,builder 可改,开用但 list 删除要使用比较郁闷的方法删除!) package unit;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
 import com.google.protobuf.InvalidProtocolBufferException;
 import com.proto.TestProto;
 import com.proto.TestProto.Person;
 import com.proto.TestProto.Person.PhoneNumber;
 
 public class Main {
 public static void main(String[] args) throws InvalidProtocolBufferException {
 //空创建
 Person.Builder builder = Person.newBuilder();
 builder.setName("liukaiyi");
 builder.setId(1);
 
 builder.setEmail("email");
 
 PhoneNumber.Builder pBuilder1 = PhoneNumber.newBuilder();
 pBuilder1.setNumber("1");
 pBuilder1.setType(TestProto.Person.PhoneType.MOBILE);
 
 
 PhoneNumber.Builder pBuilder2 = PhoneNumber.newBuilder();
 pBuilder2.setNumber("2");
 pBuilder2.setType(TestProto.Person.PhoneType.HOME);
 
 
 
 builder.addPhone(pBuilder1);
 builder.addPhone(pBuilder2);
 
 //此处为存储到数据库 或 传输!
 byte[] data = builder.build().toByteArray() ;
 for(byte tb : data )
 System.out.print( (char)tb );
 
 
 //组建
 Person person = Person.parseFrom(data);
 Person.Builder builder2 = Person.newBuilder(person);
 builder2.setEmail("test");
 
 PhoneNumber.Builder pBuilder3 = PhoneNumber.newBuilder();
 pBuilder3.setNumber("3");
 pBuilder3.setType(TestProto.Person.PhoneType.HOME);
 builder2.addPhone(pBuilder3);
 
 //这 我最不明白的地方 , list 这 只能 使用 这种方法才可以删除 list ????
 List list = new ArrayList(builder2.getPhoneList());
 List<PhoneNumber> ltmp =  builder2.getPhoneList() ;
 for(int i=0;i<list.size();i++ ){
 if(ltmp.get(i).getNumber().equals("2"))
 list.remove( ltmp.get(i) ) ;
 }
 builder2.clearPhone().addAllPhone(list);
 builder2.clearEmail();
 
 System.out.println(list.size());
 System.out.println();
 byte[] data2 = builder2.build().toByteArray() ;
 for(byte tb : data2 )
 System.out.print( (char)tb );
 
 
 
 
 }
 }
 
 
			
			
		
		
		
				
				<?
				xml version="1.0" encoding="utf8" 
				?>
				
						<%
				@ page language
				=
				"
				java
				"
				 contentType
				=
				"
				text/html; charset=utf8
				"
				 pageEncoding
				=
				"
				utf8
				"
				%>
 <%
				@taglib uri
				=
				"
				/WEB-INF/struts-tags.tld
				"
				 prefix
				=
				"
				s
				"
				%>
 <%
				@taglib uri
				=
				"
				/WEB-INF/ljw.tld
				"
				 prefix
				=
				"
				ljw
				"
				%>
 
 
 <%
				@page import
				=
				"
				com.ljw.bean.CorrectionWrong
				"
				%>
 <%
				@page import
				=
				"
				com.ljw.bean.CorrectionWrong.State
				"
				%>
 <%
				@page import
				=
				"
				com.opensymphony.xwork2.util.ValueStack
				"
				%>
				<
				html 
				xmlns
				="http://www.w3.org/1999/xhtml"
				>
 <
				head
				>
 <
				meta 
				http-equiv
				="Content-Type"
				 content
				="text/html; charset=utf8"
				 
				/>
 <
				title
				>
				Insert title here
				</
				title
				>
 <
				script 
				type
				="text/javascript"
				 src
				="../js/prototype.js"
				></
				script
				>
 <
				script 
				type
				="text/javascript"
				 src
				="../js/jsMsg.jsp"
				></
				script
				>
 <
				script 
				type
				="text/javascript"
				 src
				="../js/comm.js"
				></
				script
				>
 <
				SCRIPT 
				language
				=JavaScript 
				src
				="../js/supertable/dialog.js"
				 type
				=Text/JavaScript
				></
				SCRIPT
				>
 </
				head
				>
 <
				body
				>
 <
				div 
				id
				="communityDiv"
				>
 <
				s:set 
				name
				=""
				></
				s:set
				>
 <
				s:iterator 
				id
				="d"
				 value
				="%{pageList.objectList}"
				>
 用户名字:
				<
				s:property 
				value
				="#d.userInfo.userName"
				/><
				br
				>
 url:
				<
				s:property 
				value
				="#d.url"
				/><
				br
				>
 状态:
				<
				s:property 
				value
				="#d.ecwState.value"
				/><
				br
				>
 纠错:
				<
				s:property 
				value
				="#d.cwArticle"
				/></
				br
				>
 编辑输入:
				<
				textarea 
				rows
				="10"
				 cols
				="50"
				 id
				='<s:property 
				value
				="#d.id"
				/>
				' >
				<
				s:property 
				value
				="#d.boardmasterDesc"
				/></
				textarea
				>
 <
				input 
				type
				="button"
				 onclick
				="getUpdate('<s:property value="
				#d.id"
				/>
				')"/>
 <
				hr
				/>
 </
				s:iterator
				>
 <
				br
				/>
 <
				ljw:pages 
				value
				="%{pageList.pages}"
				 javaScript
				="loadCommunityListUrl"
				/>
 </
				div
				>
 </
				body
				>
 <
				script 
				type
				="text/javascript"
				>
 function
				 loadCommunityListUrl(url) {
 $('communityDiv').innerHTML 
				=
				 pageLoadingCenter;
 var
				 urls 
				=
				 getActionName(url);
 var
				 pars 
				=
				 getActionPars(url);
 var
				 myAjax 
				=
				 
				new
				 Ajax.Updater(
				"
				communityDiv
				"
				, urls, {method: 'post', parameters: pars});
 }
 var
				 request 
				=
				 
				false
				;
 try
				 {
 request 
				=
				 
				new
				 XMLHttpRequest();
 } 
				catch
				 (trymicrosoft) {
 try
				 {
 request 
				=
				 
				new
				 ActiveXObject(
				"
				Msxml2.XMLHTTP
				"
				);
 } 
				catch
				 (othermicrosoft) {
 try
				 {
 request 
				=
				 
				new
				 ActiveXObject(
				"
				Microsoft.XMLHTTP
				"
				);
 } 
				catch
				 (failed) {
 request 
				=
				 
				false
				;
 }
 }
 }
 if
				 (
				!
				request)
 alert(
				"
				Error initializing XMLHttpRequest!
				"
				);
 
 var
				 _robj 
				=
				 
				null
				 ;
 function
				 getUpdate(ki) {
 _robj 
				
						=
						 document.getElementById(ki) ;
 var
						 urls 
						=
						'cwmain.
						do
						';
 var
						 pars 
						=
						 'c
						=
						ajaxUpdateByBoardMaster
						&
						cwId
						=
						'
						+
						ki
						+
						'
						&
						boardMasterDesc
						=
						'
						+
						_robj.value ;
 request.open(
						"
						POST
						"
						, urls, 
						true
						);
 request.setRequestHeader(
						"
						Cache-Control
						"
						,
						"
						no-cache
						"
						);
 request.setRequestHeader(
						"
						content-type
						"
						,
						"
						application/x-www-form-urlencoded
						"
						);
 request.send(pars);
 request.onreadystatechange 
						=
				
				
						 updatePage;
 }
 
 
 
 
 function
				 updatePage() {
 if
				 (request.readyState 
				==
				 
				4
				) {
 if
				 (request.status 
				==
				 
				200
				 
				||
				 request.status
				==
				0
				 ) {
 alert(request.responseText);
 eval('
				var
				 ajaxData 
				=
				'
				+
				request.responseText);
 if
				( ajaxData.isUpdate ){
 alert( '更新成功!' );
 }
				else
				{
 alert( '更新不成功!' );
 }
 }
 }
 }
 
 
 
 </
				script
				>
 </
				html
				>
 
			
			
		
		
		
				
				<
				html
				>
				  <
				head
				><
				title
				>
				拖动效果函数演示 by Longbill.cn
				</
				title
				>
 <
				style
				>
 
 div
 {
 position 
				:
				 absolute
				;
 background-color 
				:
				 #c3d9ff
				;
 margin 
				:
				 0px
				;
 padding 
				:
				 5px
				;
 border 
				:
				 0px
				;
 width 
				:
				 100px
				;
 height
				:
				100px
				;
 }
 </
				style
				>
 
 </
				head
				>
 <
				body
				>
 
 
 <
				script
				>
 function
				 drag(o,s)
 {
 if
				 (
				typeof
				 o 
				==
				 
				"
				string
				"
				) o 
				=
				 document.getElementById(o);
 o.orig_x 
				=
				 parseInt(o.style.left) 
				-
				 document.body.scrollLeft;
 o.orig_y 
				=
				 parseInt(o.style.top) 
				-
				 document.body.scrollTop;
 o.orig_index 
				=
				 o.style.zIndex;
 
 o.onmousedown 
				=
				 
				function
				(a)
 {
 this
				.style.cursor 
				=
				 
				"
				move
				"
				;
 this
				.style.zIndex 
				=
				 
				10000
				;
 var
				 d
				=
				document;
 if
				(
				!
				a)a
				=
				window.event;
 var
				 x 
				=
				 a.clientX
				+
				d.body.scrollLeft
				-
				o.offsetLeft;
 var
				 y 
				=
				 a.clientY
				+
				d.body.scrollTop
				-
				o.offsetTop;
 //
				author: www.longbill.cn
 d.ondragstart 
				=
				 
				"
				return false;
				"
 d.onselectstart 
				=
				 
				"
				return false;
				"
 d.onselect 
				=
				 
				"
				document.selection.empty();
				"
 
 if
				(o.setCapture)
 o.setCapture();
 else
				 
				if
				(window.captureEvents)
 window.captureEvents(Event.MOUSEMOVE
				|
				Event.MOUSEUP);
 
 d.onmousemove 
				=
				 
				function
				(a)
 {
 if
				(
				!
				a)a
				=
				window.event;
 o.style.left 
				=
				 a.clientX
				+
				document.body.scrollLeft
				-
				x;
 o.style.top 
				=
				 a.clientY
				+
				document.body.scrollTop
				-
				y;
 o.orig_x 
				=
				 parseInt(o.style.left) 
				-
				 document.body.scrollLeft;
 o.orig_y 
				=
				 parseInt(o.style.top) 
				-
				 document.body.scrollTop;
 }
 
 d.onmouseup 
				=
				 
				function
				()
 {
 if
				(o.releaseCapture)
 o.releaseCapture();
 else
				 
				if
				(window.captureEvents)
 window.captureEvents(Event.MOUSEMOVE
				|
				Event.MOUSEUP);
 d.onmousemove 
				=
				 
				null
				;
 d.onmouseup 
				=
				 
				null
				;
 d.ondragstart 
				=
				 
				null
				;
 d.onselectstart 
				=
				 
				null
				;
 d.onselect 
				=
				 
				null
				;
 o.style.cursor 
				=
				 
				"
				normal
				"
				;
 o.style.zIndex 
				=
				 o.orig_index;
 }
 }
 
 if
				 (s)
 {
 var
				 orig_scroll 
				=
				 window.onscroll
				?
				window.onscroll:
				function
				 (){};
 window.onscroll 
				=
				 
				function
				 ()
 {
 orig_scroll();
 o.style.left 
				=
				 o.orig_x 
				+
				 document.body.scrollLeft;
 o.style.top 
				=
				 o.orig_y 
				+
				 document.body.scrollTop;
 }
 }
 }
 </
				script
				>
 
 <
				div 
				id
				="div1"
				 style
				="left:10px;top:10px;"
				>
				div1:我可以被拖动
				</
				div
				>
 <
				div 
				id
				="div2"
				 style
				="left:120px;top:10px;background-color : #f3d9ff"
				>
				div2:来拖我呀
				</
				div
				>
 <
				div 
				id
				="div3"
				 style
				="left:230px;top:10px;background-color : #c3ffff"
				>
				div3:我随便你拖
				</
				div
				>
 <
				div 
				id
				="div4"
				 style
				="left:10px;top:120px;background-color : #c3d944"
				>
				div4:我可以随窗口滑动,把我拖到最下面,然后滚动网页看看
				</
				div
				>
 <
				div 
				id
				="div5"
				 style
				="left:120px;top:120px;background-color : #f3d944"
				>
				作者: Longbill
 <
				a 
				href
				=http://www.longbill.cn 
				target
				=_blank
				>
				www.longbill.cn
				</
				a
				>
 </
				div
				>
 <
				div 
				id
				="div6"
				 style
				="left:230px;top:120px;background-color : #e3f944;width:200px;"
				>
				参数说明:
 
 drag(obj [,scroll]);
 
 obj:对象的id或对象本身;
 
 scroll(可选):对象是否随窗口拖动而滑动,默认为否
 
 鼠标右键查看源代码
 </
				div
				>
 
 
 <
				script
				>
 drag(
				"
				div1
				"
				);
 drag(
				"
				div2
				"
				);
 drag(
				"
				div3
				"
				);
 drag(
				"
				div4
				"
				,
				1
				);
 drag(
				"
				div5
				"
				,
				1
				);
 drag(
				"
				div6
				"
				,
				1
				);
 
 
 </
				script
				>
 
 </
				body
				>
 
 |