JAVA奥林匹克
——记录年轮(想点,说点,做点,留下点儿……)

导航

<2010年3月>
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910

统计
  • 随笔 - 56
  • 文章 - 1
  • 评论 - 7
  • 跟踪 - 6

公告
  • 布告不告!

文章分类

档案

随笔分类

相册

小站

登录
    帐号
    密码
    记住我:
     
 

2007年11月21日

为了理想不断学习,也要和大家分享经验,就从今天做起。

为了自我的证明,为了一颗不平凡的心。

2006年2月6日

转自PCOnline论坛:

----------------------------------------------------------------------------

我发现提出电池与充电的朋友很多,所以特写此文章与大家交流。
不论是数码相机,还是收音机,随身听,电池是所有设备的动力,电池性能的好坏决定了设备的使用性能。电池的结构不同,规格不同,容量的差别很大,就是相同规格的电池,由于型号不同,生产厂家不同,容量也不一样。拿我们最常用的AA尺寸电池(5号电池)来说,早期的镍镉电池容量是500mAh,新式的镍镉电池容量是850mAh,而同样尺寸的镍氢电池,容量更大,在1100mAh~2100mAh之间。
电池的容量是以mAh来计算的,你可以理解为在多少mA(毫安)电流下放电1小时。例如,1000mAh就是指电池可以在1000mA电流下放电1小时这么大容量。这样,假如负载(用电器)的耗电为100mA,该电池就可以放电10小时,假如负载电流为200mA,该电池可以使用5小时,依此类推。
电池的原理是化学反应产生电能,两种金属材料在电解液的作用下产生电流,这我们在中学的物理课中都学到过。不同种类电池的端电压也不相同,干电池为1.5V,氧化银电池为1.55V,银汞电池为1.3V,镍镉电池和镍氢电池为1.2V,铅酸电池为2V,一次性锂电池为3V,二次锂电池为3.6V。用电器的供电电压不同,使用的电池种类与节数也不同。例如,早期的爱娃随身听使用口香糖型铅酸电池,工作电压设计在2V,新式的索尼随身听使用镍镉口香糖电池,端电压为1.2V,现代的数码相机多使用锂电池,工作电压高达7.6V,需要两节二次锂电池串联供电(虽然是单体,但在外壳内封装了两节二次锂电池),而多数现代收音机都设计能够使用干电池或镍镉、氢镍电池,由2~4节电池串联供电,供电电压可以在一定的范围内改变。
一次性的电池不能再充电,象干电池,碱性干电池,氧化银电池,银汞电池,一次锂电池等。它们的电量用尽以后就只能报废了。有许多人试图给这类电池充电,设计了各种充电器,写了大量的文章,我也一样,曾经为此做出了很大的努力,对各种电池做过上百次试验,结果收效甚微,充电以后,电池的容量连新的一半也达不到,再放电很快就又枯竭了!但是今天仍然有不少文章,提出这种带有欺骗性的理论与充电产品。
随着科技的发展,电池的技术也不断进步,虽然这种进步比起其他电器来显得过于缓慢。镍镉二次电池已经有很长的历史了,其品种规格比较齐全,但多数为圆筒形,大小不一,容量不同。这种电池的放电性能比干电池好,内阻比较低,允许大电流放电,但记忆性较强,正常寿命在400次到1000次之间。近几年大量开发的镍氢电池具有更大的容量,更低的内阻,更适合大电流放电,记忆特性比镍镉小多了,寿命多在1000次充放电,价格也不贵多少。所以,镍氢取代镍镉已经是必然趋势,目前已经很少能够看到镍镉电池有售了。二次锂电池是最新一代高级电池,它具有端电压高,容量最高,内阻特低,性能稳定,寿命长的特点(充放电1000次以上)。但是它的售价比较高,主要用在高级电器上,如笔记本电脑,手机,掌上电脑,数码相机等等。
电池的记忆特性是这样的,假如你经常让电池放电到还剩一半容量就给它充电,那么日久它的实际容量就会减小。没有记忆特性的电池可以随时为它补充电,它的容量也不会有任何变化。目前只有锂电池号称是没有记忆特性的电池,但是,实际上任何化学电池都具有一定的记忆特性,如果你经常在它还没有完全放电的情况下为它补充电,那么它的容量就会越来越小,寿命会大大缩短。经过多次试验,我发现锂电池也一样有记忆特性,只是相比镍镉电池轻了一些。我们在使用电池时,唯一正确的方法是把电池彻底耗空以后再给它充电,并且采用合理的充电方法为它充电,见下文。
二次电池的充满电端电压不同,镍镉与镍氢的标称电压是1.2V,充满电以后在1.3~1.5V之间,随着放电很快回落到1.2V,放空电以后端电压在1V!这一点很重要,绝对不能把单节电池的电压放到1V以下,否则有损于电池寿命。深度的过放电往往会一次性彻底损坏电池,使电池内部短路!因此,大多数高级电器都具备自动关机控制电路,在电池的端电压降到1V时自动关闭电源,并且不让你再开机,保护电池不被损坏。同理,二次锂电池的端电压为3.6V,充满电在4V左右,放完电在3V,也不应该让电池放到3V以下。
干电池,镍氢电池和锂电池的放电特性不同,干电池的内阻较大,如果负载较重,电池的端电压会下降较多,而镍氢和锂的内阻就小多了,在大电流放电状态,还能够保持较接近标称的端电压。早期的闪光灯都是按照干电池的这种特性而设计的,一但换上了镍氢电池,工作电流会太大,把电路给烧掉了,所以,我们应该注意阅读说明书,看某种电器是否允许使用充电池。另外,干电池的放电特性比较差,其端电压会随着放电的进程逐渐下落,比如,新电池电压为1.6V,放到1/10寿命变为1.49V,放到3/10寿命下降为1.4V,放到5/10寿命,在下降为1.3V,放到9/10寿命,端电压就变为1.15V了。整个过程的电压变化很大。而氢镍和锂的特性就好得多了,整个放电过程端电压始终平稳,直到快要放电到一次寿命的终结时,电压才迅速下降,很快降到1V,结束周期。
有很多朋友询问关于电池充电的问题,我想在这里尽量帮助大家解答。二次电池的充电是采用直流电给电池灌入电能,其原理就是所谓的化学逆反应。但是,放电的能量与充电的能量不会一至,也就是说,充电的能量应该比放电的能量大1.4倍!!!举个例子说,1000mAh的电池应该用1400mAh的电量为它充电一小时才能充满,这并不违背能量守恒定理,因为充电时有约40%的能量变为热量散发了。标准的充电方法是使用0.1倍容量数的电流给电池充14小时。比如,还是1000mAh的电池,我用100mA电流给它充14个小时。这种充电方法可以保证电池被充满,而且电池温升不会太大(感觉不出来),充好的电池容量充足,电池寿命也达到最长。但是,这种充电的时间太长了,在使用上很不方便,所以,新式的充电器都设计了快速充电的电路,采用较大的电流给电池充电,比如用700mA电流给1000mAh的电池充2小时,这样,使用起来快速方便,但充电时电池会很热,不仅充得不够饱满,而且电池的寿命也会受到较大的影响!(比如本来1000次的寿命变成了400次甚至更短)。现在更有1小时,几十分钟的快速充电器,对电池的寿命危害较大。所以,很多朋友以为快速充电器是好东西,大错而特错了!采用0.2~0.3倍容量数的电流给电池充电,效果还是较好的,与标准充电比较接近,时间却缩短了一半或以上。
电池充电的电流比较有讲究,如果采用稳定的直流电流给电池充电,电极的极化作用很强,很快使电极上覆盖一层化学物质,隔绝了其与电解液的接触,使充电效率下降,经过多次充电以后,电极越来越失效,最后电池被充死。有关技术人员在这方面也作过多次试验,采用半波整流的直流电给电池充电,电池的内耗比较大,产生的热量较大,也会影响充电的质量,缩短电池的寿命。比较好的充电波形是一定频率的方波,这种波形可以抑制极化现象,保持电池的活力,充满标称容量,达到标称寿命。但是,方波的占空比要有一个设计,使停充时间尽量短,避免充电的效率下降太多,时间延长。最理想的充电方式是在约10年前由美国的一家公司开发的,它采用9/10周期的恒流充电,1/10周期的停止充电,并在这个停止期间插入了一个电流很大的(2.5倍容量数),时间极短的(3ms)放电刺脉冲,这个脉冲把极化作用给彻底破坏了,使电极保持新鲜,充电容量充足,甚至能使旧电池恢复一些容量!
电池的充电控制有各种方法。第一种是端电压控制法,也就是说,当把电池的端电压充到一定数值时就自动切断电源,或转为涓流充电(一般用较大的电流快充,接近达到容量时转为小电流慢充,以改进充电效果,叫涓流)。这种方法不太科学,因为每种规格的电池充满电以后的端电压不尽相同,所以可能会造成过充或欠充。第二种是定时法,也就是达到定时值以后自动转换状态。如果你每次都将电池用到100%容量再给它充电,这种方法就可以充得很饱满,而且不会过充,在电路上也比较容易实现。第三种是热量检测法,如果充电电流设计得比较大,那么电池在充电的末期会开始发热,尤其是过了标准充电周期以后的发热会急剧增加,这时安装在电池边上的感温元件就会发出信号,控制电路转换状态。该法的缺点是,必须采用较大的充电电流才能产生明显的发热,否则控制不够灵敏,还会受到环境温度的影响。尤其是,充电发热过高,很伤电池寿命。在电池发热时,实际上就已经处于过充电状态了!还有一种比较先进的方法,负增量法。当电池充电到达满容量时,其端电压会由逐步增高忽然变为下降一个微小值,这是二次电池的特性,在大电流充电时,这各负增量就变得比较明显。采用专门设计的电路来捕捉这个负增量,转而控制充电器是一个非常高级的设计。其优点是不会造成电池过充或欠充,也不必讲究电池必须用完才能充电,而可以随时补充电。但是,其一,负增量仅在大电流充电时才比较明显,如我们所知,大电流不是理想的充电方式。其二,每种电池的负增量不同,对它的检测也不太稳定,如果检测不到,电池就会被过充,使之损坏或爆炸,因此这种充电器一般还被同时辅以热检测双重控制。其三,检测负增量必须针对单节电池,如果针对串联电池,由于达到负增量的时间不同,正/负增量会相互抵消,使检测失败。因此,必须把电池从用电器中取出,分别装入特殊设计的电池夹才能充电,给使用带来了不便。其四,负增量检测电路复杂,专门的芯片也比较少见,价格昂贵,使充电器的成本增加。目前只有极少数的高级充电器采用这种结构。
最后说说目前的充电器产品。非常遗憾,现在的产品充电器有50%以上都是不合格的(我的观点)!!!许多很高级的电器,象随身听,手机,它们所佩戴的充电器没有任何自动停止充电控制,更谈不上波形变换电路了!我研究过大量这样的充电器,内部多是一个变压器,一个电阻,加一个二极管,也就是我上面所说的半波整流充电,充电多少时间你自己掌握(对了,我忘记说明了,对于小电流充电,过充造成的损害远远比大电流充电过充的损害要轻),但谁能准确地记得充电时间呢?这样,过充欠充是家常便饭,正常充电的效果也不好。许多手机充电器看似电路复杂,实际上那都是开关电源变换电路,根本没有自动停充控制,效果也一样。设计比较理想的充电器往往都是市上单独出售的比较贵价的产品,都带有某种控制电路。为此,我历经多年设计与试验,最后成功的作品发表在电子制作杂志上,我自认为它的优点远远多余其他大多数产品。
很多朋友都问关于充电的问题,看了我的文章你就清楚了,充电时间的计算很简单,用万用表的直流电流档测一下充电电流,然后用电池的容量乘以1.4倍,再除这个电流就是充电时间。但是半波整流电流值的测算比较麻烦,不能用电表直接测量,需要用试波器,还得经过计算才行,但如果你的充电器是半波的,也没有停充控制,我劝你还是把它扔了吧,再买一个高级的产品,别把昂贵的电池(锂电池)给充坏了。

我写得太累了,现在该休息了,希望这篇文章对大家与所帮助,如果达到这个目的,我就感到由衷的欣慰了,谢谢您花时间看此文!再见!

BlackJack   19
40

2005年7月22日

半年多一来,一直碰到一个问题没有解决,就是当web应用和EJB分开部署,web再调用EJB时

web一直报错,而且是系统错误,找不到原因。

半年后,又再次碰到这个问题,正好现在有时间好好研究了一下。终于发现是当有DTO作为对象

传递给EJB时,报的错误。我的DTO已经 implements java.io.Serializable 了,可是服务器还是报错:

class invalid for deserialization;最后终于找到原因原来

web应用调用EJB时,web传递一个DTO给ejb作为参数,虽然web应用中的DTO实现了Serializable,

但服务器端部署了的ejb中的这个DTO的class还是以前未implements java.io.Serializable 的老版本;

修改重新部署后问题解决。
所以大家还是要注意序列化和反序列化的类要前后一致。

引用论坛的一个解释吧:

问题解决了:
  原来JAVA序列化机制的脆弱性造成的,使用JAVA序列化功能的朋友注意了。
对实现序列化的类,建立好以后,一旦对其进行修改,就会产生类的版本不同问题。此时只有使用"串行化版本统一标识"serialVersionUID来强制类使用原来旧的标识号,否则就和我上面程序的错误一样。



 

2005年7月18日

测试java、测试包中的java
一、要运行d:\lisheng\lishengC\testjava\com\paic中的类:
package com.paic;

public class  testPack{
 public static void main(String[] args){
  System.out.println("Hello World!");
 }
}

先,cd D:\lisheng\lishengC\testjava
编译的时候不能 :
D:\lisheng\lishengC\testjava>javac com.paic.testPack.java
error: cannot read: com.paic.testPack.java
1 error
只能进入到*.java文件所在的目录才能用javac编译:
D:\lisheng\lishengC\testjava\com\paic>javac testPack.java

运行testPack类,不可以在其它目录下运行,
只可以D:\lisheng\lishengC\testjava>java com.paic.testPack 运行。

二、运行包(*.jar)中的类:
首先当然是,设了jar的main-class然后java -jar XXX.jar
如果没有设,还可以:
比如有个发邮件的EJB:F:\99\archives\hrwb_mpc_ejb.jar
它里面有个发邮件的类MailHelper
要想运行这个jar中的类,必须把它写进classpath中,-classpath "F:\99\archives\hrwb_mpc_ejb.jar";
又因为发邮件还用到javax.mail.* ;在weblogic.jar 中有,所以还得加上;
-classpath "F:\99\archives\hrwb_mpc_ejb.jar;D:\bea\weblogic81\server\lib\weblogic.jar";
下面就可以运行hrwb_mpc_ejb.jar 中的MailHelper了:
D:\>d:\bea\jdk141_05\bin\java -classpath "F:\99\archives\hrwb_mpc_ejb.jar;D:\bea
\weblogic81\server\lib\weblogic.jar"  com.paic.hr.wb.mpc.dto.helper.MailHelper

同理,用-classpath 还可以测试运行*.jar中的其它类。

 

------------以下部分摘自博客Zhu Yinli 的随笔,我保留在此一份-------------------

将程序包装成可执行的Jar(Executable Jar),可以让使用者更方便执行程序,
但是当程序需要额外的Package时,就必须使用多个Jar,并且用特定的方式存取,如getResourceAsStream( )等等。
把需要用到的Package解压缩,再和自己的程序一起压缩成新的Executable Jar。
<target name=”jar”>
       <unzip src=”lib/jdom.jar” dest=”bin”/>
       <unzip src= "lib/commons-logging,jar" dest="bin"/>
       <jar destfile="build/test.jar" basedir="bin">
              <include name="**/**.**"/>
                      <manifest>
                             <attribute name="Main-Class" value="http.htmlparser"/>
                     </manifest>
       </jar>
</target>

 

 

前面的理解有些不正确:
首先要明白JMS和消息驱动Bean是两回事,
一个是java的消息系统,weblogic作为一个J2EE平台所以集成了JMS,所以她可以sendMessage,
一个是java消息驱动Bean,是EJB,是一种可以接收消息的EJB,因为Weblogic是EJB容器,所以她可以调用MDB。
现在相当于weblogic自己发消息,自己接收,
weblogic的JMS API向一个注册的queue中发消息,
weblogic的EJB容器中的MDB从它请求的queue中接收消息。
发的消息就是MailDTO,一个可以持久化的对象,(她也可以发送其它消息,文本,字节都行)
我们的MDB接收了MailDTO就从中取出信息来发送,其实发送这个动作是没有异步的,MDB是一收到消息就进行处理的(发送邮件)。public void onMessage(Message msg){}

______________________________________________
发件人:  ** 
发送时间: 2005年7月15日 14:32
收件人: ***

主题: 答复: ok

看来JMS只是一个能帮你异步去执行一些动作的一个东西而以,
你可以异步的执行任何动作,
可能主要是用来像其它系统发送消息,所以才叫消息服务吧。

_____________________________________________
发件人:  ** 
发送时间: 2005年7月15日 14:26
收件人: ***

主题: ok

我们看那个只是个sessionbean 它只是把MailDTO(mail的内容放到队列中)
JMS server到时候自动调用MailerMDBBean,执行sendmail来取出mailDTO来send

2005年7月13日

    星期天又一次路过华强北的献血车,在买完了音频线之后看着时间还早,
    终于鼓起勇气决定去奉献我的爱心.到了采血点,工作人员、医生都很热情,
    友好,而且环境也很干净舒服,所以以前的顾虑都打消了,本想第一次
    献200cc算了,还一次就献了400。我是B型血,采血的医生说O型最多。
    献完后当天没有什么不舒服的感觉,只是第二天比较累,又困,感觉比较
    虚弱,感觉差点都快被空调吹晕了。回去好好睡了一觉,然后第二天迟到
    两小时,呵呵,今天舒服多了。

2005年7月7日

今天才知道原来用javascript通过url给服务器传递中文时,他自动把url的中文参数给escape了,

要服务器要unescape才行,但是java又没有unescape函数,于是查了查,找到了下面这个函数:

public String unescape(String src) {
     StringBuffer tmp = new StringBuffer();
     tmp.ensureCapacity(src.length());
     int lastPos = 0, pos = 0;
     char ch;
     while (lastPos < src.length()) {
        pos = src.indexOf("%", lastPos);
        if (pos == lastPos) {
           if (src.charAt(pos + 1) == 'u') {
              ch = (char) Integer.parseInt(src.substring(pos + 2, pos + 6), 16);
              tmp.append(ch);
              lastPos = pos + 6;
           }
           else {
              ch = (char) Integer.parseInt(src.substring(pos + 1, pos + 3), 16);
              tmp.append(ch);
              lastPos = pos + 3;
           }
        }
        else {
           if (pos == -1) {
              tmp.append(src.substring(lastPos));
              lastPos = src.length();
           }
           else {
              tmp.append(src.substring(lastPos, pos));
              lastPos = pos;
           }
        }
     }
     return tmp.toString();
  }
其实这个函数的作用就是把以unicode字符显示的字符串还原成它本来的字符。

String s1="/u80DC/u5229";
String s2=unescape(s1);
则;s2="胜利"

2005年3月1日

        
       今天听朋友介绍,了解了POI, apache组织的一个开源项目,提供了对Microsoft excel,word 的纯java
解决方案,http://jakarta.apache.org/poi/  里面可以下载到开发包,还有例子程序,用起来还是很方便的!

下面是一个将Oracle数据库表导出为Excel的程序:

import java.io.FileOutputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;      //单元格
import org.apache.poi.hssf.usermodel.HSSFCellStyle; //单元格样式
import org.apache.poi.hssf.usermodel.HSSFDataFormat;//数据格式
import org.apache.poi.hssf.usermodel.HSSFFont;      //字体
import org.apache.poi.hssf.usermodel.HSSFHeader;    //头  
import org.apache.poi.hssf.usermodel.HSSFRow;       //行
import org.apache.poi.hssf.usermodel.HSSFSheet;     //一张记事簿
import org.apache.poi.hssf.usermodel.HSSFWorkbook;  //一个excel
import org.apache.poi.hssf.util.HSSFColor;          //颜色
import java.sql.*;


 

public class Test{
    
     public static void main(String[] args) throws  Exception
     {
       String filename = "dept.xls";
       String column_name="";
       PreparedStatement ps=null;  //预编译
       Connection conn=null;      //连接
       Statement smt=null;         //sql语句
       ResultSet rs = null,rs1=null;        //结果集合
       ResultSetMetaData md = null;         
      long rowCount =0l;               //总行数
        try{
      
        Class.forName("oracle.jdbc.driver.OracleDriver");
        }catch(Exception e){
         e.printStackTrace();
        }
        String url = "jdbc:oracle:thin:@172.18.2.114:1521:MIS";
        String userName = "scott";
        String password = "tiger";
        conn = DriverManager.getConnection (url, userName, password);
        smt = conn.createStatement();
       
        //取得总记录数
        String sql="select deptno,dname,loc from dept";
        String sqlqeury="select count(*) as total from (  "+sql+"  )";
        try{
             rs = smt.executeQuery(sqlqeury);
             if(rs.next()){
                 rowCount =rs.getLong("total");
                 System.out.print(rowCount) ; //记录总数
              }
          }catch(Exception e){
           System.out.print("aaa");
                 e.printStackTrace();
                 System.out.println(e.getMessage());
                 conn.close();   //异常后关闭连接
                 throw new Exception("获得记录总数失败");
           }
        
         //处理sql语句
         try{
              rs1 = smt.executeQuery(sql);
              md = rs1.getMetaData();
               System.out.print(md.getColumnCount());
          }catch(Exception e){
            System.out.print("bbb");
                e.printStackTrace();
                System.out.println(e.getMessage());
                conn.close();   //异常后关闭连接
                throw new Exception("传入的SQL无法处理");
         }
        
        
        //生成excel代码
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet("new sheet");
        HSSFRow row = null;
        HSSFCell cell=null;
        for(long i =0;i<=rowCount;i++){
           
            row = sheet.createRow((short)i);                     //创建一个行
            for(int j =0;j<md.getColumnCount();j++){
             
               cell = row.createCell((short)j);                  //创建单元格
               cell.setEncoding(HSSFCell.ENCODING_UTF_16);
               if(i==0){   
                  cell.setCellValue(md.getColumnName(j+1));     //设定单元格的值
               }else{
                  cell.setCellValue(rs1.getString(j+1));        //设定单元格的值
                }
             }
             rs1.next();
         }
        //写到excel中!
        FileOutputStream fileOut = new FileOutputStream(filename);
        wb.write(fileOut);          //向fileout文件写
        fileOut.close();            //关闭文件输出流
        conn.close();               //关闭正常连接  
   }
  
}

                                                     2004.12.22   
                                                     ladofwind@163.com

2005年2月22日

XML解析器可以读取、更新、创建、操作一个XML文档。


使用XML解析器

微软的XML解析器是和IE5.0+浏览器捆绑在一起的。

一旦你安装了IE5.0,那么就获得了XML解析器。这个浏览器除了被浏览器内部调用外,还可以在脚本中或者程序中调用。这个解析器的特点是支持与程序设计语言无关的编程模型,他支持以下技术:

  • JavaScript, VBScript, Perl, VB, Java, C++ 等等
  • W3C XML 1.0 和 XML DOM
  • DTD 和 XML文档验证

如果浏览器使用JavaScript作为脚本语言,那么利用下面的代码可以创建XML文档对象:

var xmlDoc=new ActiveXObject("Microsoft.XMLDOM")

如果浏览器使用VBScript作为脚本语言,那么利用下面的代码可以创建XML文档对象:

set xmlDoc=CreateObject("Microsoft.XMLDOM")

如果在ASP程序中使用VBScript脚本语言,那么就可以使用下面的代码形式:

set xmlDoc=Server.CreateObject("Microsoft.XMLDOM")


将XML文档载入解析器

使用脚本代码可以将XML文档载入解析器。

下面的代码可以将一个XML文档载入解析器:

<script type="text/javascript">
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("note.xml")
// ....... processing the document goes here
</script>

第二行代码创建Microsoft XML解析器的实例。

第三行代码关闭异步载入,确保XML解析器在把XML文档完全载入以前不会对XML文档进行解析。

第四行则告诉解析器需要载入的XML文档名字是note.xml


把纯XML文档由字符载入解析器

解析器可以从一个文本字符串中载入XML文本。

下面的代码演示了将文本字符串载入解析器:

<script type="text/javascript">
var text="<note>"
text=text+"<to>Tove</to><from>Jani</from>"
text=text+"<heading>Reminder</heading>"
text=text+"<body>Don't forget me this weekend!</body>"
text=text+"</note>"
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.loadXML(text)
// ....... processing the document goes here
</script>

注意这里载入字符串使用的是"loadXML()"方法)(而不是前面用过的"load()"方法), "loadXML()"是用于载入字符串,"load()"是用于载入XML文档。


如果使用IE5.0或者更高版本的浏览器,可以通过HTTP请求从服务器端获取XML数据。

浏览器请求

通过浏览器可以发送HTTP请求,从服务器端获取XML数据:

var objHTTP = new ActiveXObject("Microsoft.XMLHTTP")
objHTTP.Open('GET','httprequest.asp',false)
objHTTP.Send()

下面的代码是在浏览器中显示从服务器端的得到的返回数据:

document.all['A1'].innerText= objHTTP.status
document.all['A2'].innerText= objHTTP.statusText
document.all['A3'].innerText= objHTTP.responseText

与服务器的交互

通过HTTP请求就可以做到与服务器进行“交互”。

使用XML与服务器进行交互

我们在服务器端“捏造”了下面的ASP代码进行交互操作:

<%
response.ContentType="text/xml"
txt="<answer><text>12 Years</text></answer>"
response.write(txt)
%>

因此,无论你提问什么,回答永远是12年。在现实生活中,不得不去写大量的代码去分析问题并且响应出正确的答案。

XMLHTTP对象及其方法
------------------
MSXML中提供了Microsoft.XMLHTTP对象,能够完成从数据包到Request对象的转换以及发送任务。
创建XMLHTTP对象的语句如下:
Set objXML = CreateObject("Msxml2.XMLHTTP") 或
Set objXML = CreateObject(“Microsoft.XMLHTTP”)
' Or, for version 3.0 of XMLHTTP, use:
' Set xml = Server.CreateObject("MSXML2.ServerXMLHTTP")
对象创建后调用Open方法对Request对象进行初始化,语法格式为:
poster.open http-method, url, async, userID, password
Open方法中包含了5个参数,前三个是必要的,后两个是可选的(在服务器需要进行身份验证时提供)。参数的含义如下所示: 
http-method: HTTP的通信方式,比如GET或是 POST
url: 接收XML数据的服务器的URL地址。通常在URL中要指明 ASP或CGI程序
async: 一个布尔标识,说明请求是否为异步的。如果是异步通信方式(true),客户机就不等待服务器的响应;如果是同步方式(false),客户机就要等到服务器返回消息后才去执行其他操作
userID 用户ID,用于服务器身份验证
password 用户密码,用于服务器身份验证
XMLHTTP对象的Send方法
用Open方法对Request对象进行初始化后,调用Send方法发送XML数据:
poster.send XML-data
Send方法的参数类型是Variant,可以是字符串、DOM树或任意数据流。发送数据的方式分为同步和异步两种。在异步方式下,数据包一旦发送完毕,就结束Send进程,客户机执行其他的操作;而在同步方式下,客户机要等到服务器返回确认消息后才结束Send进程。
XMLHTTP对象中的readyState属性能够反映出服务器在处理请求时的进展状况。客户机的程序可以根据这个状态信息设置相应的事件处理方法。属性值及其含义如下表所示:
值 说明
0 Response对象已经创建,但XML文档上载过程尚未结束
1 XML文档已经装载完毕
2 XML文档已经装载完毕,正在处理中
3 部分XML文档已经解析
4 文档已经解析完毕,客户端可以接受返回消息
客户机处理响应信息
客户机接收到返回消息后,进行简单的处理,基本上就完成了C/S之间的一个交互周期。客户机接收响应是通过XMLHTTP对象的属性实现的:
● responseTxt:将返回消息作为文本字符串;
● responseXML:将返回消息视为XML文档,在服务器响应消息中含有XML数据时使用;
● responseStream:将返回消息视为Stream对象。
综述,客户端创建的XMLHTTP对象,在把请求(request),send到服务器端后,服务器返回的response返回到了XMLHTTP对象的以上三个属性中,所以从以上的三个属性中就可以取得服务器返回的结果了.
 

下面的xml文件是动态生成的最后用xmlHTTP传送出去,这是一个在客户端JavaScript脚本里的内容,当然你也可以写在服务器,但是要相应的改一些东西:(仅供大家参考,了解它的用法)
var xmlDoc=new ActiveXObject("MSXML2.DOMDocument");
flag=xmlDoc.loadXML("");

  newNode =xmlDoc.createElement("编码")
  MarkNode=xmlDoc.documentElement.appendChild(newNode);
  newNode =xmlDoc.createElement("StartMark")
  newNode.text=StartMark;
  MarkNode.appendChild(newNode)
  newNode =xmlDoc.createElement("EndMark")
  newNode.text=EndMark;
  MarkNode.appendChild(newNode)
 
  newNode =xmlDoc.createElement("日期")
  DateNode=xmlDoc.documentElement.appendChild(newNode);
  newNode =xmlDoc.createElement("StartDate");
  newNode.text=StartDate;
  DateNode.appendChild(newNode)
  newNode =xmlDoc.createElement("EndDate")
  newNode.text=EndDate;
  DateNode.appendChild(newNode);
 
  newNode =xmlDoc.createElement("数量")
  SLNode =xmlDoc.documentElement.appendChild(newNode);
  newNode =xmlDoc.createElement("StartSL")
  newNode.text=StartShuL
  SLNode.appendChild(newNode)
  newNode =xmlDoc.createElement("EndSL");
  newNode.text=EndShuL
  SLNode.appendChild(newNode);
 
  newNode =xmlDoc.createElement("单价")
  DJNode =xmlDoc.documentElement.appendChild(newNode)
  newNode =xmlDoc.createElement("StartDJ")
  newNode.text=StartDanJ;
  DJNode.appendChild(newNode);
  newNode =xmlDoc.createElement("EndDJ")
  newNode.text=EndDanJ;
  DJNode.appendChild(newNode);
 
  newNode =xmlDoc.createElement("金额")
  JENode =xmlDoc.documentElement.appendChild(newNode)
  newNode =xmlDoc.createElement("StartJE")
  newNode.text=StartJinE
  JENode.appendChild(newNode)
  newNode =xmlDoc.createElement("EndJE")
  newNode.text=EndJinE
  JENode.appendChild(newNode)
 
  newNode =xmlDoc.createElement("仓库代码")
  newNode.text=CK;
  xmlDoc.documentElement.appendChild(newNode)
 
  newNode =xmlDoc.createElement("票号")
  newNode.text=RKPH;
  xmlDoc.documentElement.appendChild(newNode)
 
  newNode =xmlDoc.createElement("单位代码")
  newNode.text=CorpName;
  xmlDoc.documentElement.appendChild(newNode)
 
  newNode =xmlDoc.createElement("BiaoShi")
  newNode.text=Biaoshi
  xmlDoc.documentElement.appendChild(newNode)
 
  newNode =xmlDoc.createElement("FindCate")
  newNode.text=FindCate
  xmlDoc.documentElement.appendChild(newNode)
 
  var xh =new ActiveXObject("MSXML2.XMLHTTP")
  xh.open("POST","Find.asp",false)
  xh.setRequestHeader("Content-Type","text/xml")
  xh.setRequestHeader("Content-Type","gb2312")
  xh.send(xmlDoc);
我的每一个newNode的text值是一个变量,也就是我客户端form 中input的值,

2005年2月16日

开工第一天,拜年、收红包……

大家都洋溢着节日的气氛,我虽然不善表露,但心里还是感觉到了喜庆和欢乐。

新的一年大家又有新的任务,增添了新的压力,也要付出新的努力;我祝自己,祝全家,祝所有勤勤恳恳,真诚的人们新的一年也取得新的收获,幸福平安,更要注意身体健康哦。

过完年,又一次离开了家,在家的这七八天真是一晃而过,陪父母的话都还没有说够就又要离开了,和朋友们也没有如何玩的爽,主要是朋友到现在这个年纪都到不齐了,忙的忙加班,不忙的还要陪老婆,像以前一起同床共枕、游戏人间的日子一去不复返了;梦想着有那么一天,大家带着老婆孩子,还能在一起无所计较的玩,那是多爽啊!人活着,为了生活,是很累;当我们在现实中学会现实,我们不得不又回到办公室来。我想要快乐的工作,想要快乐的生活。对家乡,对父母,对朋友还是有说不完的想念。

我真想对他们说一句,我会回来的。

 

请不要发表可能给我们带来伤害的政治言论,谢谢配合