为了理想不断学习,也要和大家分享经验,就从今天做起。
为了自我的证明,为了一颗不平凡的心。
转自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
半年多一来,一直碰到一个问题没有解决,就是当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来强制类使用原来旧的标识号,否则就和我上面程序的错误一样。
测试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
星期天又一次路过华强北的献血车,在买完了音频线之后看着时间还早,
终于鼓起勇气决定去奉献我的爱心.到了采血点,工作人员、医生都很热情,
友好,而且环境也很干净舒服,所以以前的顾虑都打消了,本想第一次
献200cc算了,还一次就献了400。我是B型血,采血的医生说O型最多。
献完后当天没有什么不舒服的感觉,只是第二天比较累,又困,感觉比较
虚弱,感觉差点都快被空调吹晕了。回去好好睡了一觉,然后第二天迟到
两小时,呵呵,今天舒服多了。
今天才知道原来用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="胜利"
今天听朋友介绍,了解了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
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的值,
开工第一天,拜年、收红包……
大家都洋溢着节日的气氛,我虽然不善表露,但心里还是感觉到了喜庆和欢乐。
新的一年大家又有新的任务,增添了新的压力,也要付出新的努力;我祝自己,祝全家,祝所有勤勤恳恳,真诚的人们新的一年也取得新的收获,幸福平安,更要注意身体健康哦。
过完年,又一次离开了家,在家的这七八天真是一晃而过,陪父母的话都还没有说够就又要离开了,和朋友们也没有如何玩的爽,主要是朋友到现在这个年纪都到不齐了,忙的忙加班,不忙的还要陪老婆,像以前一起同床共枕、游戏人间的日子一去不复返了;梦想着有那么一天,大家带着老婆孩子,还能在一起无所计较的玩,那是多爽啊!人活着,为了生活,是很累;当我们在现实中学会现实,我们不得不又回到办公室来。我想要快乐的工作,想要快乐的生活。对家乡,对父母,对朋友还是有说不完的想念。
我真想对他们说一句,我会回来的。