﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-软件艺术思考者-随笔分类-Client teachnolgy research</title><link>http://www.blogjava.net/zhanglijun33/category/17808.html</link><description>混沌，彷徨，立志，蓄势...</description><language>zh-cn</language><lastBuildDate>Fri, 07 Mar 2008 23:10:04 GMT</lastBuildDate><pubDate>Fri, 07 Mar 2008 23:10:04 GMT</pubDate><ttl>60</ttl><item><title>CSS/JS/HTML技巧</title><link>http://www.blogjava.net/zhanglijun33/archive/2007/09/18/js_css.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Tue, 18 Sep 2007 07:14:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2007/09/18/js_css.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/146167.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2007/09/18/js_css.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/146167.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/146167.html</trackback:ping><description><![CDATA[textarea宽度固定，自动增高,input高度固定，自动增宽<br />
<p>input高度固定，自动增宽&lt;br&gt;<br />
&lt;input&nbsp; type="text"&nbsp; style="width:60;overflow-x:visible;overflow-y:visible;"&gt;</p>
<p>&lt;br&gt;<br />
textarea宽度固定，自动增高&lt;br&gt;</p>
<p>&lt;textarea&nbsp; type="text"&nbsp; style="width:260;overflow-x:visible;overflow-y:visible;"&gt;&lt;/textarea&gt;<br />
2.验证是不是为汉字或者字母或者数字(正规字符)</p>
<font style="background-color: #9fe6aa">var exp1="^([0-9A-Za-z]|[\u4e00-\u9fa5])+$";<br />
&nbsp;&nbsp;&nbsp;&nbsp; var corName=document.getElementById("displayName");<br />
&nbsp;&nbsp;&nbsp;&nbsp; if(corName.value==""||!corName.value.match(exp1)){<br />
&nbsp;&nbsp;&nbsp;&nbsp; document.getElementById("displayNameInfo").innerHTML="&lt;font color='red' &gt;显示名不能为空且只能为字母和汉字组成&lt;/font&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp; corName.focus();<br />
&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }</font>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/146167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2007-09-18 15:14 <a href="http://www.blogjava.net/zhanglijun33/archive/2007/09/18/js_css.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>flex actionScript 学习</title><link>http://www.blogjava.net/zhanglijun33/archive/2007/09/03/clientTech.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Mon, 03 Sep 2007 06:10:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2007/09/03/clientTech.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/142291.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2007/09/03/clientTech.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/142291.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/142291.html</trackback:ping><description><![CDATA[<p><a href="http://blog.csdn.net/mozilla/archive/2007/08/23/1756761.aspx">http://blog.csdn.net/mozilla/archive/2007/08/23/1756761.aspx</a><br />
</p>
<p><a href="http://examples.adobe.com/flex2/inproduct/sdk/explorer/explorer.html">http://examples.adobe.com/flex2/inproduct/sdk/explorer/explorer.html</a><br />
</p>
<p><a href="http://www2.flash8.net/teach/6200.htm">http://www2.flash8.net/teach/6200.htm</a><br />
</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/142291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2007-09-03 14:10 <a href="http://www.blogjava.net/zhanglijun33/archive/2007/09/03/clientTech.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hta研究--1</title><link>http://www.blogjava.net/zhanglijun33/archive/2007/07/10/hta1.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Tue, 10 Jul 2007 01:13:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2007/07/10/hta1.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/129207.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2007/07/10/hta1.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/129207.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/129207.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 让网页界面变成普通应用程序界面。这一点，微软又走在了世界前面&nbsp;&nbsp;<a href='http://www.blogjava.net/zhanglijun33/archive/2007/07/10/hta1.html'>阅读全文</a><img src ="http://www.blogjava.net/zhanglijun33/aggbug/129207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2007-07-10 09:13 <a href="http://www.blogjava.net/zhanglijun33/archive/2007/07/10/hta1.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>msagent经典用法</title><link>http://www.blogjava.net/zhanglijun33/archive/2006/12/19/agentProgramming.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Tue, 19 Dec 2006 08:13:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2006/12/19/agentProgramming.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/88830.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2006/12/19/agentProgramming.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/88830.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/88830.html</trackback:ping><description><![CDATA[
		<div id="mmct">
				<center>msagent经典用法</center>
		</div>
		<div id="mmc">
				<p>序大本营战士<br />atyzy(笑笑)</p>
				<p>---- Microsoft Agent是微软公司于1997年9月发布的一项代理软件开发技术，而后被集成到Internet Explorer 4.0 Plus及更高版本中，目前版本为2.0，支持简体中文。作为一种软件代理工具，Agent以其强大的交互功能、鲜明的人性特点、优美的操作界面和简便统一的编程方法，对由菜单、按钮、提示框等组成的传统人机交互方式产生了很大影响，在多媒体创作、Web应用、教育软件、软件帮助系统和辅助工具制作等方面，具有广阔的应用前景。 </p>
				<p>一、 Microsoft Agent技术简介 </p>
				<p>---- Agent一词的中文意思是“代理”，故名思意，这类代理软件的主要作用是提供一种易于理解和使用的操作界面，接受用户的指令、代替用户完成某些复杂繁琐的工作、或为用户提供帮助。科学研究表明：从人机工程的角度考虑，赋予电脑或程序更多人性化色彩，如支持语音合成输出信息、语音识别输入指令、智能提示、动画等，能够充分提高人机交互的有效性和易用性。 </p>
				<p>---- 我们知道，在Office 97帮助系统中有一种叫作Office助手的代理软件，其中幽默风趣的动画人物，如“大眼夹”，能够根据用户的操作步骤“智能化”地提出一些建议或帮助信息。与Office助手相比，Agent功能更加丰富强大，表现在： </p>
				<p>
						<br />Office助手沿用传统的不透明矩形窗口，窗口后面的背景被完全挡住；Agent动画人物本身是一个“AlwaysOnTop”窗口，只有人物身体部分挡住背景，其余部分透明。 </p>
				<p>Office助手只允许Office 97的各个组件调用，Agent动画人物可由任何Windows程序调用； </p>
				<p>Agent支持文字气球和输入提示条，在输出语音的同时把文字输出至一个卡通式文字气球中。如果电脑系统中安装有Agent语音识别引擎，当用户按住输入键，如Scroll Lock键，在Agent人物下方出现一个输入命令窗口，表示它正在“聆听”用户的语音命令。 </p>
				<p>Agent提供Genie、Merlin、Bobby和Peedy等动画人物，不仅具有优美诙谐的动作，而且可以通过声卡、麦克风与用户交谈。 </p>
				<p>
						<br />二、 Microsoft Agent安装方法 </p>
				<p>---- Agent是一种ActiveX控件，其服务器程序（C:\WINDOWS\MSAGENT\Agentsvr.exe）运行在Win95/98/NT操作平台上，为其它调用Agent的客户程序提供服务。客户程序可以是利用VB、C++、Delphi、VFP、PB等开发的应用软件，也可以是HTML文件中的Visual Script、Java Script脚本语言代码。 </p>
				<p>
						<br />安装Agent核心组件Msagent.exe。 </p>
				<p>安装Lernout &amp; Hauspie TruVoice Text-to-Speech Engine（完成从文字合成语音的工作，目前版本只支持英语）Cgram.exe。 </p>
				<p>安装Microsoft Command and Control Speech Engine（提供语音识别功能，目前版本只支持英语）Actcnc.exe。 </p>
				<p>Agent动画人物人物数据文件。Agent支持单结构角色文件（.acs，角色数据与动画数据存于同一个文件），也支持分离结构角色文件（.acf，角色数据存于.acf中，动画数据存于.aca中）。基于本地硬盘和网络的应用程序可采用.acs文件，基于Web页面的HTML文件在浏览器中访问时会自动调用，习惯上多使用.acs文件。 </p>
				<p>
						<br />---- 上述文件可从 下载。 </p>
				<p>三、 Microsoft Agent编程要点 </p>
				<p>---- 1、 在Delphi中添加Agent控件 </p>
				<p>---- 在Delphi IDE中选择菜单Component，Import ActiveX Control——在Import ActiveX下的列表框中选择Microsoft Agent Control 2.0（Version 2.0），点击按钮Install——在Install对话框中点击按钮OK——在Confirm对话框中点击按钮Yes——在对话框中点击按钮OK。至此，Agent控件被添加到Delphi组件板ActiveX页上。 </p>
				<p>---- 2、 在Delphi中调用Agent控件 </p>
				<p>---- ⑴、在Delphi IDE 中新建Project1（包含Form1），在Form1上放置Agent1（Name属性为MyAgent）、Button1。 </p>
				<p>---- ⑵、定义变量。 </p>
				<p>
						<br />Var Peedy: IagentCtlCharacterEx; Request1,Request2: IagentCtlRequest; <br />---- ⑶Agent主要属性、方法、事件。 </p>
				<p>---- ①Characters属性与Load、Unload方法：初始化Agent，加载动画数据，卸载动画人物 </p>
				<p>---- Request1 := MyAgent.Characters.Load( Peedy, C:\Windows\System\Peedy.acs ); <br />---- Peedy := MyAgent.Characters.Character( Peedy ); <br />---- MyAgent.Characters.Unload(Peedy); </p>
				<p>---- ②Show与Hide方法：显示、隐藏Agent动画人物。参数Fast表示动画人物显示、隐藏的速度。Fast为0表示Agent飞入、飞出，Fast为1表示Agent直接出现、消失，没有动画过程。 </p>
				<p>---- Peedy.Show(0); <br />---- Peedy.Hide(1); </p>
				<p>---- ③StopAll、Stop方法：停止所有动作。 <br />---- Peedy.StopAll(); <br />---- Peedy.Stop(Request); </p>
				<p>---- ④Connected属性：Agent是否与Microsoft Agent服务器连接。 <br />---- MyAgent.Connected := True; </p>
				<p>---- ⑤Get_Height、Get_Width、Set_Height、Set_Width方法：获得、设置Agent动画人物的高度、宽度。 </p>
				<p>AgentHight := Peedy.Get_Height; AgentWidth := Peedy.Get_Width; Peedy.Set_Height( <br />round(AgentHeight / 2 )); Peedy.Set_Width( round( AgentWidth / 2 )); <br />---- ⑥MoveTo方法：参数x，y表示Agent动画人物移动到的坐标，参数Speed表示移动的速度。 </p>
				<p>---- Peedy.MoveTo( (Screen.Width-Peedy.Get_Width) Div 2, (Screen.Height-Peedy.Get_Height) Div 2, 2 ); </p>
				<p>---- ⑦Interrupt方法：中断指定角色的动画。在几十种动画动作中，有一类后缀名为“ing” 的动作比较特殊，如“processing”、“searching”、“reading”、“writing”，一旦执行就必须通过调用另外一个动画人物的Interrupt方法才能中断 。角色不能中断自身的动作，否则会导致异常。 </p>
				<p> Request1 := <br />Robby.Play(reading); Peedy.Interrupt(Request1); <br />---- ⑧Wait方法：在多个不同动画人物之间协调动画动作，如等待sRobby的当前动作执行完毕后，Peedy做另外一个动作。 </p>
				<p>Request1 := Robby.Play(read); Peedy.Wait(Request1); Peedy.Play(search); <br />---- ⑨Play方法：执行指定的动画动作，参数Animation为一常量，表示动画类型。Agent提供了几十种预定义动作，开发软件时只需直接调用这些常量即可。下面简要介绍其中常用的一些常量仅供编程参考。 </p>
				<p>---- 动作类型 中文含意 动作类型 中文含意 动作类型 中文含意 </p>
				<p> Acknowledge 承认 <br />LookDown 向下看 Sad 悲伤 Alert 警告 LookDownBlink 向下看眨眼 Search 寻找 <br />Announce 声明 LookUp 向上看 StartListening 开始聆听 Blink 眨眼 LookUpBlink <br />向下看眨眼 StopListening 停止聆听 Confused 迷惑 LookLeft 向左看 Suggest <br />建议 Congratulate 祝贺 LookLeftBlink 向左看眨眼 Surprised 吃惊 Decline 拒绝 <br />LookRight 向右看 Think 思考 DontRecognize 不承认 LookRightBlink 向右看眨眼 <br />Wave 挥动 Explain 解释 MoveDown 向下移动 Write 书写 GestureDown 向下姿势 <br />MoveUp 向上移动 Processing 计算…… GestureUp 向上姿势 MoveRight 向右移动 <br />Reading 阅读…… GestureLeft 向左姿势 MoveLeft 向左移动 Searching 寻找…… <br />GestureRight 向右姿势 Pleased 高兴 Writing 书写…… GetAttention 获得注意 <br />Read 阅读 Greet 问候 RestPose 恢复初始状态 Request := peedy.Play(search); <br />---- ⑩Speak方法：Agent通过调用语音合成引擎，支持英语的语音合成输出功能，只需输入英文字符串，Agent就能通过声卡、音箱“说话”。Agent的当前版本尚不具备支持中文语音合成功能，所以只能以.wav文件的形式播放中文。使用时可以将想要说的中文句子预先录好，以.wav形式存储，在程序中调用即可。参数Text表示文字气球中显示的文字，参数url表示.wav文件的路径。 </p>
				<p>---- Peedy.speak(嗨，朋友们，你们好，现在由我为您提供帮助！,C:\新建文件夹\Help.wav); </p>
				<p>---- Peedy.Speak( Do you like my help? If so, Please send me an email! Thank you!, ); </p>
				<p>---- ⑾Commands.Add方法：在Button1Click事件中为Agent添加自定义语音识别命令，参数const Name表示语音命令的标识，参数Caption表示该命令在输入命令窗口中的显示标题，参数Voice表示该命令对应的语句。当用户通过麦克风向动画人物发出语音命令时，触发Agent的Command事件，因此我们可以另外编写一个过程完成语音识别功能。 </p>
				<p>procedure TForm1.Button1Click(Sender: TObject); begin Peedy.Commands.Add(Delphi,Run <br />Delphi,Delphi,True,True); Peedy.Commands.Add(Visual Basic, Run VB,VB,True,True); <br />Peedy.Show(0); Peedy.Speak(What can I do for you, sir?,); end; <br />---- ⑷、按F9运行程序。以上程序在Delphi3.0/4.0、Windows95/98/NT简体中文版环境下调试通过。 </p>
		</div>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/88830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2006-12-19 16:13 <a href="http://www.blogjava.net/zhanglijun33/archive/2006/12/19/agentProgramming.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JS集锦</title><link>http://www.blogjava.net/zhanglijun33/archive/2006/12/08/aboutJS2.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Fri, 08 Dec 2006 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2006/12/08/aboutJS2.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/86278.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2006/12/08/aboutJS2.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/86278.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/86278.html</trackback:ping><description><![CDATA[
		<p>1.一个日历插件。<br />&lt;script&gt;<br />/* Creation date: 2004-6-13 */<br />var myC_x,myC_y;<br />var myC_timeset=null,myC_timeset1=null;<br />var divObj=null;<br />var inputName;<br />function myCalendar() //构建对象<br />{<br />var myDate = new Date();<br />this.year = myDate.getFullYear();<br />this.month = myDate.getMonth()+1;<br />this.date = myDate.getDate();<br />this.format="yyyy-mm-dd";<br />this.style = myStyle(1);　<br />this.show = createCalendar;<br />this.input = createInput;<br />}<br />function myStyle(num) //设置样式<br />{<br />if(!num||isNaN(num)){alert('参数不对,采用默认样式！');num=1;}<br />　var style = new Array();<br />style[1]=".week{background-color:#DfDfff;font-size:12px;width:140px;}"<br />+".ds{width:140px;font-size:12px;cursor:hand}"<br />+".mover{border:1px solid black;background-color:#f4f4f4;}"<br />+".move1{border:1px solid #5d5d5d;background-color:#f4f4f4;color:#909eff;font-size:12px}"<br />+".tit{background-color:#909EFF;width:140px;font-size:12px;color:white;cursor:default}"<br />+".cs{position:absolute;border:1px solid #909eff;width:142px;left:0px;top:0px;z-index:9999;}"<br />+".shadow{position:absolute;left:0px;top:0px;font-family: Arial Black;font-size:50px;color:#d4d4d4;z-index:1;text-align:center;}";<br />document.write("&lt;style type='text/css'&gt;");<br />document.write(style[num]);<br />document.write("&lt;/style&gt;");<br />}<br />function createCalendar()<br />{<br />var week = new Array('日','一','二','三','四','五','六');<br />document.write("&lt;div class='cs' onselectstart='return false' oncontextmenu='return false' onmousedown='if(event.button==2)this.style.display=\"none\"' id='myC_div'&gt;&lt;div class='shadow'&gt;&lt;/div&gt;&lt;div style='position:absolute;left:0px;top:0px;z-index:1'&gt;");<br />//创建头部<br />document.write("&lt;table class='tit' id='myC_Top' onmousedown='myC_x=event.x-parentNode.parentNode.style.pixelLeft;myC_y=event.y-parentNode.parentNode.style.pixelTop;setCapture()' onmouseup='releaseCapture();' onmousemove='myCMove(this.parentElement.parentElement);'&gt;&lt;tr&gt;&lt;td width=10 onmouseover='this.style.color=\"black\"' onmouseout='this.style.color=\"\"' onclick='cutYear()' style='font-family: Webdings;cursor:hand;' title='减少年份'&gt;7&lt;/td&gt;&lt;td title='减少月份' onmouseover='this.style.color=\"black\"' onclick='cutMonth()' onmouseout='this.style.color=\"\"' width=10 style='font-family: Webdings;cursor:hand;'&gt;3&lt;/td&gt;&lt;td align=center onmouseover=this.className='move1'; onmouseout=this.className='';divHidden(myC.parentElement.nextSibling); onclick='createyear("+this.year+",this);divShow(myC.parentElement.nextSibling);'&gt;&lt;/td&gt;&lt;td align=center onclick='createmonth("+this.month+",this);divShow(myC.parentElement.nextSibling)' onmouseover=this.className='move1'; onmouseout=this.className='';divHidden(myC.parentElement.nextSibling);&gt;&lt;/td&gt;&lt;td width=10 onmouseover='this.style.color=\"black\"' onmouseout='this.style.color=\"\"' onclick='addMonth()' style='font-family: Webdings;cursor:hand;' title='增加月份'&gt;4&lt;/td&gt;&lt;td width=10 style='font-family: Webdings;cursor:hand;' onmouseover='this.style.color=\"black\"' onmouseout='this.style.color=\"\"' onclick='addYear()' title='增加年份'&gt;8&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;");<br />//创建星期条目<br />document.write("&lt;table class='week'&gt;&lt;tr&gt;");<br />for(i=0;i&lt;7;i++)<br />document.write("&lt;td align=center&gt;"+week[i]+"&lt;/td&gt;");<br />document.write("&lt;/tr&gt;&lt;/table&gt;");<br />//创建日期条目<br />document.write("&lt;table class='ds' id='myC' cellspacing=2 cellpadding=0&gt;");<br />for(i=0;i&lt;6;i++)<br />{<br />document.write("&lt;tr&gt;");<br />for(j=0;j&lt;7;j++)<br />document.write("&lt;td width=10% height=16 align=center onmouseover='mOver(this)' onmouseout='mOut(this)' onclick='if(this.innerText!=\"\")getValue(inputName,this.innerText);myC_div.style.display=\"none\"'&gt;&lt;/td&gt;");<br />document.write("&lt;/tr&gt;");<br />}<br />document.write("&lt;/table&gt;");<br />//建建水印<br />document.write("&lt;/div&gt;");<br />//创建选择图层<br />document.write("&lt;div style='position:absolute;left:0px;top:0px;z-index:3' onmouseover=divShow(this) onmouseout=divHidden(this)&gt;&lt;/div&gt;");<br />document.write("&lt;/div&gt;");<br />//显示日期<br />showDate(this.year,this.month);<br />myC_div.style.display='none';<br />}<br />function getValue(obj,value)<br />{<br />eval(obj).value=parseInt(myC_Top.cells[2].innerText)+"-"+parseInt(myC_Top.cells[3].innerText)+"-"+value;<br />}<br />function showDate(year,month)<br />{<br />var myDate = new Date(year,month-1,1);<br />var today = new Date();<br />var day = myDate.getDay();<br />var length = new Array(31,30,31,30,31,30,31,31,30,31,30,31);<br />length[1] = ((year%4==0)&amp;&amp;(year%100!=0)||(year%400==0))?29:28;<br />for(i=0;i&lt;myC.cells.length;i++)myC.cells[i].innerHTML = "";<br />for(i=0;i&lt;length[month-1];i++)<br />{<br />myC.cells[i+day].innerHTML = (i+1);<br />if(new Date(year,month-1,i+1).getDay()==6||new Date(year,month-1,i+1).getDay()==0){myC.cells[i+day].style.color='red';}<br />}<br />myC_Top.cells[2].innerText=year+"年";<br />myC_Top.cells[3].innerText=month+"月";<br />with(myC.parentNode.previousSibling.style)<br />{<br />pixelLeft=myC.offsetLeft;<br />pixelTop=myC.offsetTop;<br />height = myC.clientHeight;<br />width = myC.clientWidth;<br />}<br />myC.parentElement.parentElement.style.height=myC.parentElement.offsetHeight;<br />myC.parentElement.previousSibling.innerHTML=year;<br />}<br />//一些附加函数--------------------<br />//---------Begin-------------------<br />function mOver(obj){obj.className = 'mover';}<br />function mOut(obj){if(obj.className=='mover')obj.className = '';}<br />function addYear(){var year = parseInt(myC_Top.cells[2].innerText);var month = parseInt(myC_Top.cells[3].innerText); year++;showDate(year,month);}<br />function addMonth(){var year = parseInt(myC_Top.cells[2].innerText);var month = parseInt(myC_Top.cells[3].innerText);month++;if(month&gt;12){month=1;year++;}showDate(year,month);}<br />function cutYear(){var year = parseInt(myC_Top.cells[2].innerText);var month = parseInt(myC_Top.cells[3].innerText);year--;showDate(year,month);}<br />function cutMonth(){var year = parseInt(myC_Top.cells[2].innerText);var month = parseInt(myC_Top.cells[3].innerText);month--;if(month&lt;1){month=12;year--;}showDate(year,month);}<br />function divS(obj)<br />{<br />if(obj!=divObj)<br />{<br />obj.style.backgroundColor="#909eff";<br />obj.style.color='black';<br />}<br />if(divObj!=null)<br />{<br />divObj.style.backgroundColor='';<br />divObj.style.color='';<br />}<br />divObj = obj;<br />}<br />function divShow(obj)<br />{ if (myC_timeset!=null) clearTimeout(myC_timeset);<br />obj.style.display='block';<br />}<br />function divHidden(obj){myC_timeset=window.setTimeout(function(){obj.style.display='none'},500);}<br />function createyear(year,obj)//创建年份选择<br />{<br />var ystr;<br />var oDiv;<br />ystr="&lt;table class='move1' cellspacing=0 cellpadding=2 width="+obj.offsetWidth+"&gt;";<br />ystr+="&lt;tr&gt;&lt;td style='cursor:hand' onclick='createyear("+(year-20)+",myC_Top.cells[2])' align=center&gt;上翻&lt;/td&gt;&lt;/tr&gt;";<br />for(i=year-10;i&lt;year+10;i++)<br />if(year==i)<br />ystr+="&lt;tr style='background-color:#909eff'&gt;&lt;td style='color:black;height:16px;cursor:hand' align=center onclick='myC_Top.cells[2].innerText=this.innerText;showDate("+i+",parseInt(myC_Top.cells[3].innerText));myC.parentElement.nextSibling.innerHTML=\"\"'&gt;"+i+"年&lt;/td&gt;&lt;/tr&gt;";<br />else<br />ystr+="&lt;tr&gt;&lt;td align=center style='cursor:hand' onmouseover=divS(this) onclick='myC_Top.cells[2].innerText=this.innerText;showDate("+i+",parseInt(myC_Top.cells[3].innerText));myC.parentElement.nextSibling.innerHTML=\"\"'&gt;"+i+"年&lt;/td&gt;&lt;/tr&gt;";<br />ystr+="&lt;tr&gt;&lt;td style='cursor:hand' onclick='createyear("+(year+20)+",myC_Top.cells[2])' align=center&gt;下翻&lt;/td&gt;&lt;/tr&gt;";<br />ystr+="&lt;/table&gt;";<br />oDiv = myC.parentElement.nextSibling;<br />oDiv.innerHTML='';<br />oDiv.innerHTML = ystr;<br />showDiv(oDiv,obj.offsetTop+obj.offsetHeight,obj.offsetLeft);<br />}<br />function createmonth(month,obj)//创建月份选择<br />{<br />var mstr;<br />var oDiv;<br />mstr="&lt;table class='move1' cellspacing=0 cellpadding=2 width="+(obj.offsetWidth+5)+"&gt;";<br />for(i=1;i&lt;13;i++)<br />if (month==i)<br />mstr+="&lt;tr style='background-color:#909eff'&gt;&lt;td style='color:black;height:16px;cursor:hand' align=center onclick='myC_Top.cells[3].innerText=this.innerText;showDate(parseInt(myC_Top.cells[2].innerText),"+i+");myC.parentElement.nextSibling.innerHTML=\"\"'&gt;"+i+"月&lt;/td&gt;&lt;/tr&gt;";<br />else<br />mstr+="&lt;tr&gt;&lt;td align=center style='cursor:hand' onmouseover='divS(this)' onclick='myC_Top.cells[3].innerText=this.innerText;showDate(parseInt(myC_Top.cells[2].innerText),"+i+");myC.parentElement.nextSibling.innerHTML=\"\"'&gt;"+i+"月&lt;/td&gt;&lt;/tr&gt;";<br />mstr+="&lt;/table&gt;";<br />oDiv = myC.parentElement.nextSibling;<br />oDiv.innerHTML='';<br />oDiv.innerHTML = mstr;<br />showDiv(oDiv,obj.offsetTop+obj.offsetHeight,obj.offsetLeft);<br />}<br />function showDiv(obj,top,left)<br />{<br />obj.style.pixelTop=top;<br />obj.style.pixelLeft=left;<br />}<br />function myCMove(obj)<br />{<br />if(event.button==1)<br />{<br />var X = obj.clientLeft;<br />var Y = obj.clientTop;<br />obj.style.pixelLeft= X+(event.x-myC_x);<br />obj.style.pixelTop= Y+(event.y-myC_y);<br />window.status=myC_y;<br />}<br />}<br />function showDiv2(obj)<br />{<br />inputName=obj.name;<br />var e=obj;<br />var ot = obj.offsetTop;<br />var ol=obj.offsetLeft;<br />while(obj=obj.parentElement){ot+=obj.offsetTop;ol+=obj.offsetLeft;}<br />myC_div.style.pixelTop=ot+e.offsetHeight;<br />myC_div.style.pixelLeft=ol;<br />myC_div.style.display="block";<br />}<br />function createInput(name)<br />{myC_div.style.display='none';<br />document.write("&lt;input type='text' name='"+name+"' size=20 onfocus='showDiv2(this)'&gt;");<br />}<br />// --------------End ---------------------<br />&lt;/script&gt;<br />&lt;script&gt;<br />var myCalendar=new myCalendar;<br />myCalendar.year=2006;<br />myCalendar.show();<br />myCalendar.input("txt1");<br />&lt;/script&gt;<br />&lt;input type="text" name="test" onfocus="showDiv2(this)" readonly=true&gt;<br />2.无刷新排序简例<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;script&gt;<br />function order()<br />{<br />var it=event.srcElement;<br />var table=it;<br />var i,j,k;<br />var t1,t2;<br />if(it.tagName=="TH"){<br />    i=it.cellIndex;<br />    it.title=it.title=="asc"?"desc":"asc";<br />    while(table.tagName!="TABLE")table=table.parentElement;<br />    if(table.rows.length&lt;3)return true;<br />    for(j=1;j&lt;table.rows.length;j++){<br />        for(k=j+1;k&lt;table.rows.length;k++){<br />            if(it.title=="asc"?parseFloat(table.rows[k].cells[i].innerText)&lt;parseFloat(table.rows[j].cells[i].innerText):parseFloat(table.rows[k].cells[i].innerText)&gt;parseFloat(table.rows[j].cells[i].innerText))<br />            table.rows[j].swapNode(table.rows[k]);<br />        }<br />    }<br />}<br />}<br />&lt;/script&gt;<br />&lt;/head&gt;<br />&lt;body&gt;</p>
		<p>&lt;table border="1"&gt;<br />&lt;thead onclick="order()" style="cursor:hand;"&gt;<br />&lt;th&gt;Item 1&lt;/th&gt;&lt;th&gt;Item 2&lt;/th&gt;&lt;th&gt;Item 3&lt;/th&gt;&lt;th&gt;Item 4&lt;/th&gt;<br />&lt;/thead&gt;<br />&lt;tr&gt;&lt;td&gt;12.3&lt;/td&gt;&lt;td&gt;423&lt;/td&gt;&lt;td&gt;86.83&lt;/td&gt;&lt;td&gt;1.213&lt;/td&gt;&lt;/tr&gt;<br />&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;434&lt;/td&gt;&lt;td&gt;5.334&lt;/td&gt;&lt;td&gt;.234&lt;/td&gt;&lt;/tr&gt;<br />&lt;tr&gt;&lt;td&gt;33&lt;/td&gt;&lt;td&gt;43&lt;/td&gt;&lt;td&gt;5.223&lt;/td&gt;&lt;td&gt;8.73&lt;/td&gt;&lt;/tr&gt;<br />&lt;tr&gt;&lt;td&gt;21.3&lt;/td&gt;&lt;td&gt;234&lt;/td&gt;&lt;td&gt;52.34&lt;/td&gt;&lt;td&gt;.666&lt;/td&gt;&lt;/tr&gt;<br />&lt;tr&gt;&lt;td&gt;33.4&lt;/td&gt;&lt;td&gt;59&lt;/td&gt;&lt;td&gt;67.2&lt;/td&gt;&lt;td&gt;.426&lt;/td&gt;&lt;/tr&gt;<br />&lt;/table&gt;</p>
		<p>&lt;/body&gt;<br />&lt;/html&gt;</p>
		<p> </p>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/86278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2006-12-08 11:49 <a href="http://www.blogjava.net/zhanglijun33/archive/2006/12/08/aboutJS2.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Javascript-文件操作</title><link>http://www.blogjava.net/zhanglijun33/archive/2006/12/01/JSWriteRead.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Fri, 01 Dec 2006 02:29:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2006/12/01/JSWriteRead.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/84760.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2006/12/01/JSWriteRead.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/84760.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/84760.html</trackback:ping><description><![CDATA[
		<strong>Javascript----文件操作</strong>
		<br />一、功能实现核心：FileSystemObject 对象 <br />    要在javascript中实现文件操作功能，主要就是依靠FileSystemobject对象。<br />二、FileSystemObject编程 <br />使用FileSystemObject 对象进行编程很简单，一般要经过如下的步骤： 创建FileSystemObject对象、应用相关方法、访问对象相关属性 。 <br />（一）创建FileSystemObject对象 <br />创建FileSystemObject对象的代码只要1行： <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />上述代码执行后，fso就成为一个FileSystemObject对象实例。 <br />（二）应用相关方法 <br />创建对象实例后，就可以使用对象的相关方法了。比如，使用CreateTextFile方法创建一个文本文件： <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />var f1 = fso.createtextfile("c:\\\\myjstest.txt",true"); <br />（三）访问对象相关属性 <br />要访问对象的相关属性，首先要建立指向对象的句柄，这就要通过get系列方法实现：GetDrive负责获取驱动器信息，GetFolder负责获取文件夹信息，GetFile负责获取文件信息。比如，指向下面的代码后，f1就成为指向文件c:\\test.txt的句柄： <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />var f1 = fso.GetFile("c:\\\\myjstest.txt"); <br />然后，使用f1访问对象的相关属性。比如： <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />var f1 = fso.GetFile("c:\\\\myjstest.txt"); <br />alert("File last modified: " + f1.DateLastModified); <br />执行上面最后一句后，将显示c:\\myjstest.txt的最后修改日期属性值。 <br />但有一点请注意：对于使用create方法建立的对象，就不必再使用get方法获取对象句柄了，这时直接使用create方法建立的句柄名称就可以： <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />var f1 = fso.createtextfile("c:\\\\myjstest.txt",true"); <br />alert("File last modified: " + f1.DateLastModified); <br />三、操作驱动器（Drives） <br />使用FileSystemObject对象来编程操作驱动器（Drives）和文件夹（Folders）很容易，这就象在Windows文件浏览器中对文件进行交互操作一样，比如：拷贝、移动文件夹，获取文件夹的属性。 <br />（一）Drives对象属性 <br />Drive对象负责收集系统中的物理或逻辑驱动器资源内容，它具有如下属性： <br />l TotalSize：以字节（byte）为单位计算的驱动器大小。 <br />l AvailableSpace或FreeSpace：以字节（byte）为单位计算的驱动器可用空间。 <br />l DriveLetter：驱动器字母。 <br />l DriveType：驱动器类型，取值为：removable（移动介质）、fixed（固定介质）、network（网络资源）、CD-ROM或者RAM盘。 <br />l SerialNumber：驱动器的系列码。 <br />l FileSystem：所在驱动器的文件系统类型，取值为FAT、FAT32和NTFS。 <br />l IsReady：驱动器是否可用。 <br />l ShareName：共享名称。 <br />l VolumeName：卷标名称。 <br />l Path和RootFolder：驱动器的路径或者根目录名称。 <br />（二）Drive对象操作例程 <br />下面的例程显示驱动器C的卷标、总容量和可用空间等信息： <br />var fso, drv, s =""; <br />fso = new ActiveXObject("Scripting.FileSystemObject"); <br />drv = fso.GetDrive(fso.GetDriveName("c:\\\\")); <br />s += "Drive C:" + " - "; <br />s += drv.VolumeName + "\\n"; <br />s += "Total Space: " + drv.TotalSize / 1024; <br />s += " Kb" + "\\n"; <br />s += "Free Space: " + drv.FreeSpace / 1024; <br />s += " Kb" + "\\n"; <br />alert(s); <br />四、操作文件夹（Folders） <br />涉及到文件夹的操作包括创建、移动、删除以及获取相关属性。 <br />Folder对象操作例程 :<br />下面的例程将练习获取父文件夹名称、创建文件夹、删除文件夹、判断是否为根目录等操作： <br />var fso, fldr, s = ""; <br />// 创建FileSystemObject对象实例 <br />fso = new ActiveXObject("Scripting.FileSystemObject"); <br />// 获取Drive 对象 <br />fldr = fso.GetFolder("c:\\\\"); <br />// 显示父目录名称 <br />alert("Parent folder name is: " + fldr + "\\n"); <br />// 显示所在drive名称 <br />alert("Contained on drive " + fldr.Drive + "\\n"); <br />// 判断是否为根目录 <br />if (fldr.IsRootFolder) <br />alert("This is the root folder."); <br />else <br />alert("This folder isn\'t a root folder."); <br />alert("\\n\\n"); <br />// 创建新文件夹 <br />fso.CreateFolder ("C:\\\\Bogus"); <br />alert("Created folder C:\\\\Bogus" + "\\n"); <br />// 显示文件夹基础名称，不包含路径名 <br />alert("Basename = " + fso.GetBaseName("c:\\\\bogus") + "\\n"); <br />// 删除创建的文件夹 <br />fso.DeleteFolder ("C:\\\\Bogus"); <br />alert("Deleted folder C:\\\\Bogus" + "\\n"); <br />五、操作文件（Files） <br />对文件进行的操作要比以上介绍的驱动器（Drive）和文件夹（Folder）操作复杂些，基本上分为以下两个类别：对文件的创建、拷贝、移动、删除操作和对文件内容的创建、添加、删除和读取操作。下面分别详细介绍。 <br />（一）创建文件 <br />一共有3种方法可用于创建一个空文本文件，这种文件有时候也叫做文本流（text stream）。 <br />第一种是使用CreateTextFile方法。代码如下： <br />var fso, f1; <br />fso = new ActiveXObject("Scripting.FileSystemObject"); <br />f1 = fso.CreateTextFile("c:\\\\testfile.txt", true); <br />第二种是使用OpenTextFile方法，并添加上ForWriting属性，ForWriting的值为2。代码如下： <br />var fso, ts; <br />var ForWriting= 2; <br />fso = new ActiveXObject("Scripting.FileSystemObject"); <br />ts = fso.OpenTextFile("c:\\\\test.txt", ForWriting, true); <br />第三种是使用OpenAsTextStream方法，同样要设置好ForWriting属性。代码如下： <br />var fso, f1, ts; <br />var ForWriting = 2; <br />fso = new ActiveXObject("Scripting.FileSystemObject"); <br />fso.CreateTextFile ("c:\\\\test1.txt"); <br />f1 = fso.GetFile("c:\\\\test1.txt"); <br />ts = f1.OpenAsTextStream(ForWriting, true); <br />（二）添加数据到文件 <br />当文件被创建后，一般要按照“打开文件－&gt;填写数据－&gt;关闭文件”的步骤实现添加数据到文件的目的。 <br />打开文件可使用FileSystemObject对象的OpenTextFile方法，或者使用File对象的OpenAsTextStream方法。 <br />填写数据要使用到TextStream对象的Write、WriteLine或者WriteBlankLines方法。在同是实现写入数据的功能下，这3者的区别在于：Write方法不在写入数据末尾添加新换行符，WriteLine方法要在最后添加一个新换行符，而WriteBlankLines则增加一个或者多个空行。 <br />关闭文件可使用TextStream对象的Close方法。 <br />（三）创建文件及添加数据例程 <br />下面的代码将创建文件、添加数据、关闭文件几个步骤结合起来进行应用： <br />var fso, tf; <br />fso = new ActiveXObject("Scripting.FileSystemObject"); <br />// 创建新文件 <br />tf = fso.CreateTextFile("c:\\\\testfile.txt", true); <br />// 填写数据，并增加换行符 <br />tf.WriteLine("Testing 1, 2, 3.") ; <br />// 增加3个空行 <br />tf.WriteBlankLines(3) ; <br />// 填写一行，不带换行符 <br />tf.Write ("This is a test."); <br />// 关闭文件 <br />tf.Close(); <br />（四）读取文件内容 <br />从文本文件中读取数据要使用TextStream对象的Read、ReadLine或ReadAll 方法。Read方法用于读取文件中指定数量的字符；ReadLine方法读取一整行，但不包括换行符；ReadAll方法则读取文本文件的整个内容。读取的内容存放于字符串变量中，用于显示、分析。在使用Read或ReadLine方法读取文件内容时，如果要跳过一些部分，就要用到Skip或SkipLine方法。 <br />下面的代码演示打开文件、填写数据，然后读取数据： <br />var fso, f1, ts, s; <br />var ForReading = 1; <br />fso = new ActiveXObject("Scripting.FileSystemObject"); <br />// 创建文件 <br />f1 = fso.CreateTextFile("c:\\\\testfile.txt", true); <br />// 填写一行数据 <br />f1.WriteLine("Hello World"); <br />f1.WriteBlankLines(1); <br />// 关闭文件 <br />f1.Close(); <br />// 打开文件 <br />ts = fso.OpenTextFile("c:\\\\testfile.txt", ForReading); <br />// 读取文件一行内容到字符串 <br />s = ts.ReadLine(); <br />// 显示字符串信息 <br />alert("File contents = \'" + s + "\'"); <br />// 关闭文件 <br />ts.Close(); <br />（五）移动、拷贝和删除文件 <br />对于以上三种文件操作，javascript各有两种对应的方法：File.Move 或 FileSystemObject.MoveFile用于移动文件；File.Copy 或 FileSystemObject.CopyFile用于拷贝文件；File.Delete 或 FileSystemObject.DeleteFile用于删除文件。 <br />下面的代码演示在驱动器C的根目录下创建一个文本文件，填写一些内容，然后将文件移动到\\tmp目录下，再在目录\\temp下面建立一个文件拷贝，最后删除这两个目录的文件： <br />var fso, f1, f2, s; <br />fso = new ActiveXObject("Scripting.FileSystemObject"); <br />f1 = fso.CreateTextFile("c:\\\\testfile.txt", true); <br />// 写一行 <br />f1.Write("This is a test."); <br />// 关闭文件 <br />f1.Close(); <br />// 获取C:\\根目录下的文件句柄 <br />f2 = fso.GetFile("c:\\\\testfile.txt"); <br />// 移动文件到\\tmp目录下 <br />f2.Move ("c:\\\\tmp\\\\testfile.txt"); <br />// 拷贝文件到\\temp目录下 <br />f2.Copy ("c:\\\\temp\\\\testfile.txt"); <br />// 获取文件句柄 <br />f2 = fso.GetFile("c:\\\\tmp\\\\testfile.txt"); <br />f3 = fso.GetFile("c:\\\\temp\\\\testfile.txt"); <br />// 删除文件 <br />f2.Delete(); <br />f3.Delete(); <br />六、结 语 <br />通过以上对FileSystemObject的各种对象、属性和方法的介绍和示例，相信你已经对如何使用javascript语言在页面中操作驱动器、文件和文件夹有了清晰的认识。但是上述提及的例程都非常简单，要全面、灵活地掌握javascript文件操作技术，还需要大量的实践练习。而且还有一点提醒大家，由于涉及到在浏览器中进行文件读写这样的高级操作，对于默认的浏览器安全级别而言，在代码运行前都会有一个信息提示，这点请在实际环境中提示访问者注意。<br />&lt;<img src ="http://www.blogjava.net/zhanglijun33/aggbug/84760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2006-12-01 10:29 <a href="http://www.blogjava.net/zhanglijun33/archive/2006/12/01/JSWriteRead.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ajax study (1)</title><link>http://www.blogjava.net/zhanglijun33/archive/2006/11/28/ajax1.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Tue, 28 Nov 2006 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2006/11/28/ajax1.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/84053.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2006/11/28/ajax1.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/84053.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/84053.html</trackback:ping><description><![CDATA[
		<p>树青兄写的一个ajax类。<br />var http_request = false;<br />function send_request(method,url,formName,responseType,callback) {<br /> http_request = false;<br /> var content =""<br /> if(forName != null)content = getFormAsString(formName);<br />  <br /> if(window.XMLHttpRequest) { <br />  http_request = new XMLHttpRequest();<br />  if (http_request.overrideMimeType) {<br />   http_request.overrideMimeType("text/xml");<br />  }<br /> }<br /> else if (window.ActiveXObject) { <br />  try {<br />   http_request = new ActiveXObject("Msxml2.XMLHTTP");<br />  } catch (e) {<br />   try {<br />    http_request = new ActiveXObject("Microsoft.XMLHTTP");<br />   } catch (e) {}<br />  }<br /> }<br /> if (!http_request) { <br />  window.alert("不能创建XMLHttpRequest对象实例.");<br />  return false;<br /> }<br /> if(responseType.toLowerCase()=="text") {<br />  http_request.onreadystatechange = callback;<br /> }<br /> else if(responseType.toLowerCase()=="xml") {<br />  http_request.onreadystatechange = callback;<br /> }<br /> else {<br />  window.alert("响应类别参数错误。");<br />  return false;<br /> }<br /> if(method.toLowerCase()=="get") {<br />  http_request.open(method, url, true);<br /> }<br /> else if(method.toLowerCase()=="post") {<br />  http_request.open(method, url, true);<br />  http_request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");  <br /> }<br /> else {<br />  window.alert("http请求类别参数错误。");<br />  return false;<br /> }   <br /> if(window.ActiveXObject) http_request.setRequestHeader("If-Modified-Since", "0"); <br /> http_request.send(content);<br />}</p>
		<p>function getFormAsString(formName){</p>
		<p>returnString ="";</p>
		<p>formElements=document.forms[formName].elements;</p>
		<p>for(var i=formElements.length-1;i&gt;=0; --i ){</p>
		<p>returnString+="&amp;" </p>
		<p>+escape(formElements[i].name)+"=" </p>
		<p>+escape(formElements[i].value);</p>
		<p>}</p>
		<p>}</p>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/84053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2006-11-28 15:03 <a href="http://www.blogjava.net/zhanglijun33/archive/2006/11/28/ajax1.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR: Easy AJAX for JAVA</title><link>http://www.blogjava.net/zhanglijun33/archive/2006/09/21/AJAXWITHDWR.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Thu, 21 Sep 2006 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2006/09/21/AJAXWITHDWR.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/71155.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2006/09/21/AJAXWITHDWR.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/71155.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/71155.html</trackback:ping><description><![CDATA[
		<p>DWR is a Java open source library which allows you to write Ajax web sites.</p>
		<p>It allows code in a browser to use Java functions running on a web server just as if it was in the browser.</p>
		<p>DWR consists of two main parts:</p>
		<ul>
				<li>A Java Servlet running on the server that processes requests and sends responses back to the browser. 
</li>
				<li>JavaScript running in the browser that sends requests and can dynamically update the webpage. </li>
		</ul>
		<p>DWR works by dynamically generating Javascript based on Java classes. The code does some Ajax magic to make it feel like the execution is happening on the browser, but in reality the server is executing the code and DWR is marshalling the data back and forwards.</p>
		<p>This method of remoting functions from Java to JavaScript gives DWR users a feel much like conventional RPC mechanisms like RMI or SOAP, with the benefit that it runs over the web without requiring web-browser plug-ins.</p>
		<p>Java is fundamentally synchronous where Ajax is asynchronous. So when you call a remote method, you provide DWR with a callback function to be called when the data has been returned from the network.</p>
		<p>
				<img alt="interaction diagram" src="http://getahead.ltd.uk/sitefiles/getahead/howitworks.png" align="right" />The diagram shows how DWR can alter the contents of a selection list as a result of some Javascript event like onclick.</p>
		<p>DWR dynamically generates an AjaxService class in Javascript to match some server-side code. This is called by the eventHandler. DWR then handles all the remoting details, including converting all the parameters and return values between Javascript and Java. It then executes the supplied callback function (populateList) in the example below which uses a DWR utility function to alter the web page.</p>
		<p>DWR helps you in producing highly interactive web-sites by providing some Javascript libraries to help with DHTML and by giving you a set of examples to copy from.</p>
		<p>For details on how to get started with DWR see the <a href="http://getahead.ltd.uk/dwr/getstarted">getting started guide</a> and <a href="http://getahead.ltd.uk/dwr/download">download instructions</a>.<br />//---------------------------以下是中文介绍-0--------------------------------------------------------------<br /></p>
		<div class="postTitle">
				<a id="viewpost1_TitleUrl" href="/mlh123caoer/articles/53716.html">
						<font color="#000000">dwr学习</font>
				</a>
		</div>
		<div class="postText">这段时间较闲,研究了一番dwr.发现dwr实现的AJAX有些地方确实很是先进.比如动态生成javascript代码;隐藏的http协议;javascript于java代码交互的是javascript对象(或字符串)等. <br />以下是我临时译的一些东西.本来想全译,发现dwr实在是简单,就随便写了.英文居差,现一把. <br /><br />1、DWR: Easy AJAX for JAVA <br /><br />作为一个java open source library,DWR可以帮助开发人员完成应用AJAX技术的web程序。它可以让浏览器上的javascript方法调用运行在web服务器上java方法。 <br /><br />DWR主要由两部门组成。javascript与web服务器通信并更新web页；运行在web服务器的Servlet处理请求并把响应发回浏览器。 <br /><br />DWR 采用新颖的方法实现了AJAX(本来也没有确切的定义)，在java代码基础上动态的生成javascript代码。web开发者可以直接调用这些 javascript代码，然而真正的代码是运行在web服务器上的java code。出与安全考虑，开发者必须配置哪些java class暴露给DWR.(dwr.xml) <br /><br />这种从(java到javascript)调用机制给用户一种感觉，好象常规的RPC机制，或RMI or SOAP.但是它运行在web上，不需要任何浏览器插件。 <br /><br />DWR 不认为浏览器和web服务器之间协议重要，把系统界面放在首位。最大挑战是java method call的同步特征与ajax异步特性之间的矛盾。在异步模型里，结果只有在方法结束后才有效。DWR解决了这个问题，把回调函数当成参数传给方法，处理完成后，自动调用回调方法。 <br /><br />这个图表显示了，通过javascript事件，DWR能改变select的内容，当然这些内容由 java代码返回。 javascript函数Data.getOptions(populateList)由DWR动态生成，这个函数会调用java class Data类的方法。DWR处理如何远程调用，包括转换所有的参数和返回的结果（javascript\java）。java方法执行完后，执行回调方法 populateList。在整个过程中我们就想在用本地的方法一样。 <br /><br />2、Getting Started <br /><br />废话少说，试试就ok了。 <br />web.xml <br /><br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt; <br />&lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"&gt; <br /><br />&lt;web-app id="dwr"&gt; <br />&lt;servlet&gt; <br />&lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br />&lt;servlet-class&gt;uk.ltd.getahead.dwr.DWRServlet&lt;/servlet-class&gt; <br />&lt;/servlet&gt; <br />&lt;servlet-mapping&gt; <br />&lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br />&lt;url-pattern&gt;/dwr/*&lt;/url-pattern&gt; <br />&lt;/servlet-mapping&gt; <br />&lt;/web-app&gt; <br /><br />dwr.xml 与web.xml同目录 <br />&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br />&lt;!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd"&gt; <br />&lt;dwr&gt; <br />&lt;allow&gt; <br />&lt;create creator="new" javascript="JDate"&gt; <br />&lt;param name="class" value="java.util.Date"/&gt; <br />&lt;/create&gt; <br />&lt;/allow&gt; <br />&lt;/dwr&gt; <br /><br />index.html <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;DWR - Test Home&lt;/title&gt; <br />&lt;script type='text/javascript' src='dwr/interface/JDate.js'&gt;&lt;/script&gt; <br />&lt;script type='text/javascript' src='dwr/engine.js'&gt;&lt;/script&gt; <br />&lt;script&gt; <br />function init(){ <br />JDate.getYear(load); <br />} <br />function load(data){ <br />alert(data+1900+'年') <br />} <br />&lt;/script&gt; <br />&lt;/head&gt; <br />&lt;body onload="init()"&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br /><br />dwr.jar 下载放lib下 <br /><br />完了，什么，够了，就这些。访问ok! <br />3、Examples <br /><a href="http://www.aboutmyhealth.org/" target="_blank"><font color="#366900">http://www.aboutmyhealth.org/</font></a> 这不是Google Suggest吗!ok. <br />4、源码浅析 <br />dwr的设计很象webwork2的设计,隐藏http协议,扩展性，兼容性及强。 <br /><br />通过研究uk.ltd.getahead.dwr.DWRServlet这个servlet来研究下dwr到底是如何工作滴。 <br /><br /><table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"><tbody><tr><td><span class="genmed"><b>java代码: </b></span></td></tr><tr><td class="code"><div style="FONT-FAMILY: 'Courier New',Courier,monospace"><br />web.<span style="COLOR: rgb(0,0,0)">xml</span>配置 <br />&lt;servlet&gt; <br />    &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br />    &lt;servlet-<span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">class</span>&gt;uk.<span style="COLOR: rgb(0,0,0)">ltd</span>.<span style="COLOR: rgb(0,0,0)">getahead</span>.<span style="COLOR: rgb(0,0,0)">dwr</span>.<span style="COLOR: rgb(0,0,0)">DWRServlet</span>&lt;/servlet-<span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">class</span>&gt; <br />  &lt;/servlet&gt; <br />  &lt;servlet-mapping&gt; <br />    &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br />    &lt;url-pattern&gt;/dwr<span style="COLOR: rgb(102,102,255)">/*&lt;/url-pattern&gt; <br />&lt;/servlet-mapping&gt;</span></div><br /></td></tr></tbody></table><span class="postbody"><br />这样所有的/dwr/*所有请求都由这个servlet来处理，它到底处理了些什么能。我们还以上面最简单的例子来看。 <br />1、 web服务器启动，DWRServlet init()方法调用，init主要做了以下工作。 <br />设置日志级别、实例化DWR用到的单例类（这些类在jvm中只有一个实例对象）、读去配置文件（包括dwr.jar包中的dwr.xml,WEB-INF/dwr.xml. config*.xml）。 <br />2、请求处理 <br />DWRServlet.doGet, doPost方法都调用processor.handle(req, resp)方法处理。Processor对象在init()方法中已经初始化了。 <br /></span><table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"><tbody><tr><td><span class="genmed"><b>java代码: </b></span></td></tr><tr><td class="code"><div style="FONT-FAMILY: 'Courier New',Courier,monospace"><br /><span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">public</span><span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">void</span> handle<span style="COLOR: rgb(0,0,0)">(</span>HttpServletRequest req, HttpServletResponse resp<span style="COLOR: rgb(0,0,0)">)</span><br />        <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">throws</span><span style="COLOR: rgb(170,170,221)" ?="">IOException</span><br />    <span style="COLOR: rgb(0,0,0)">{</span><br />        <span style="COLOR: rgb(170,170,221)" ?="">String</span> pathinfo = req.<span style="COLOR: rgb(0,0,0)">getPathInfo</span><span style="COLOR: rgb(0,0,0)">(</span><span style="COLOR: rgb(0,0,0)">)</span>; <br />        <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">if</span><span style="COLOR: rgb(0,0,0)">(</span>pathinfo == <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">null</span> || pathinfo.<span style="COLOR: rgb(0,0,0)">length</span><span style="COLOR: rgb(0,0,0)">(</span><span style="COLOR: rgb(0,0,0)">)</span> == <span style="COLOR: rgb(0,0,0)" ?="">0</span> || pathinfo.<span style="COLOR: rgb(0,0,0)">equals</span><span style="COLOR: rgb(0,0,0)">(</span>"/"<span style="COLOR: rgb(0,0,0)">)</span><span style="COLOR: rgb(0,0,0)">)</span><br />        <span style="COLOR: rgb(0,0,0)">{</span><br />            resp.<span style="COLOR: rgb(0,0,0)">sendRedirect</span><span style="COLOR: rgb(0,0,0)">(</span>req.<span style="COLOR: rgb(0,0,0)">getContextPath</span><span style="COLOR: rgb(0,0,0)">(</span><span style="COLOR: rgb(0,0,0)">)</span> + req.<span style="COLOR: rgb(0,0,0)">getServletPath</span><span style="COLOR: rgb(0,0,0)">(</span><span style="COLOR: rgb(0,0,0)">)</span> + <span style="COLOR: rgb(0,0,255)">'/'</span> + "index.<span style="COLOR: rgb(0,0,0)">html</span>"<span style="COLOR: rgb(0,0,0)">)</span>; <br />        <span style="COLOR: rgb(0,0,0)">}</span><span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">else</span><br />        <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">if</span><span style="COLOR: rgb(0,0,0)">(</span>pathinfo != <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">null</span> &amp;&amp; pathinfo.<span style="COLOR: rgb(0,0,0)">equalsIgnoreCase</span><span style="COLOR: rgb(0,0,0)">(</span>"/index.<span style="COLOR: rgb(0,0,0)">html</span>"<span style="COLOR: rgb(0,0,0)">)</span><span style="COLOR: rgb(0,0,0)">)</span><br />        <span style="COLOR: rgb(0,0,0)">{</span><br />            doIndex<span style="COLOR: rgb(0,0,0)">(</span>req, resp<span style="COLOR: rgb(0,0,0)">)</span>; <br />        <span style="COLOR: rgb(0,0,0)">}</span><span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">else</span><br />        <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">if</span><span style="COLOR: rgb(0,0,0)">(</span>pathinfo != <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">null</span> &amp;&amp; pathinfo.<span style="COLOR: rgb(0,0,0)">startsWith</span><span style="COLOR: rgb(0,0,0)">(</span>"/test/"<span style="COLOR: rgb(0,0,0)">)</span><span style="COLOR: rgb(0,0,0)">)</span><br />        <span style="COLOR: rgb(0,0,0)">{</span><br />            doTest<span style="COLOR: rgb(0,0,0)">(</span>req, resp<span style="COLOR: rgb(0,0,0)">)</span>; <br />        <span style="COLOR: rgb(0,0,0)">}</span><span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">else</span><br />        <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">if</span><span style="COLOR: rgb(0,0,0)">(</span>pathinfo != <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">null</span> &amp;&amp; pathinfo.<span style="COLOR: rgb(0,0,0)">equalsIgnoreCase</span><span style="COLOR: rgb(0,0,0)">(</span>"/engine.<span style="COLOR: rgb(0,0,0)">js</span>"<span style="COLOR: rgb(0,0,0)">)</span><span style="COLOR: rgb(0,0,0)">)</span><br />        <span style="COLOR: rgb(0,0,0)">{</span><br />            doFile<span style="COLOR: rgb(0,0,0)">(</span>resp, "engine.<span style="COLOR: rgb(0,0,0)">js</span>", "text/javascript"<span style="COLOR: rgb(0,0,0)">)</span>; <br />        <span style="COLOR: rgb(0,0,0)">}</span><span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">else</span><br />        <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">if</span><span style="COLOR: rgb(0,0,0)">(</span>pathinfo != <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">null</span> &amp;&amp; pathinfo.<span style="COLOR: rgb(0,0,0)">equalsIgnoreCase</span><span style="COLOR: rgb(0,0,0)">(</span>"/util.<span style="COLOR: rgb(0,0,0)">js</span>"<span style="COLOR: rgb(0,0,0)">)</span><span style="COLOR: rgb(0,0,0)">)</span><br />        <span style="COLOR: rgb(0,0,0)">{</span><br />            doFile<span style="COLOR: rgb(0,0,0)">(</span>resp, "util.<span style="COLOR: rgb(0,0,0)">js</span>", "text/javascript"<span style="COLOR: rgb(0,0,0)">)</span>; <br />        <span style="COLOR: rgb(0,0,0)">}</span><span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">else</span><br />        <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">if</span><span style="COLOR: rgb(0,0,0)">(</span>pathinfo != <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">null</span> &amp;&amp; pathinfo.<span style="COLOR: rgb(0,0,0)">equalsIgnoreCase</span><span style="COLOR: rgb(0,0,0)">(</span>"/deprecated.<span style="COLOR: rgb(0,0,0)">js</span>"<span style="COLOR: rgb(0,0,0)">)</span><span style="COLOR: rgb(0,0,0)">)</span><br />        <span style="COLOR: rgb(0,0,0)">{</span><br />            doFile<span style="COLOR: rgb(0,0,0)">(</span>resp, "deprecated.<span style="COLOR: rgb(0,0,0)">js</span>", "text/javascript"<span style="COLOR: rgb(0,0,0)">)</span>; <br />        <span style="COLOR: rgb(0,0,0)">}</span><span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">else</span><br />        <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">if</span><span style="COLOR: rgb(0,0,0)">(</span>pathinfo != <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">null</span> &amp;&amp; pathinfo.<span style="COLOR: rgb(0,0,0)">startsWith</span><span style="COLOR: rgb(0,0,0)">(</span>"/<span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">interface</span>/"<span style="COLOR: rgb(0,0,0)">)</span><span style="COLOR: rgb(0,0,0)">)</span><br />        <span style="COLOR: rgb(0,0,0)">{</span><br />            doInterface<span style="COLOR: rgb(0,0,0)">(</span>req, resp<span style="COLOR: rgb(0,0,0)">)</span>; <br />        <span style="COLOR: rgb(0,0,0)">}</span><span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">else</span><br />        <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">if</span><span style="COLOR: rgb(0,0,0)">(</span>pathinfo != <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">null</span> &amp;&amp; pathinfo.<span style="COLOR: rgb(0,0,0)">startsWith</span><span style="COLOR: rgb(0,0,0)">(</span>"/exec"<span style="COLOR: rgb(0,0,0)">)</span><span style="COLOR: rgb(0,0,0)">)</span><br />        <span style="COLOR: rgb(0,0,0)">{</span><br />            doExec<span style="COLOR: rgb(0,0,0)">(</span>req, resp<span style="COLOR: rgb(0,0,0)">)</span>; <br />        <span style="COLOR: rgb(0,0,0)">}</span><span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">else</span><br />        <span style="COLOR: rgb(0,0,0)">{</span><br />            log.<span style="COLOR: rgb(0,0,0)">warn</span><span style="COLOR: rgb(0,0,0)">(</span>"Page not found. <span style="COLOR: rgb(0,0,0)">In</span> debug/test mode <span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">try</span> viewing /<span style="COLOR: rgb(0,0,0)">[</span>WEB-APP<span style="COLOR: rgb(0,0,0)">]</span>/dwr/"<span style="COLOR: rgb(0,0,0)">)</span>; <br />            resp.<span style="COLOR: rgb(0,0,0)">sendError</span><span style="COLOR: rgb(0,0,0)">(</span><span style="COLOR: rgb(0,0,0)" ?="">404</span><span style="COLOR: rgb(0,0,0)">)</span>; <br />        <span style="COLOR: rgb(0,0,0)">}</span><br />    <span style="COLOR: rgb(0,0,0)">}</span></div><br /></td></tr></tbody></table><span class="postbody"><br />哦。这些恍然大悟。dwr/*处理的请求也就这几种。 <br />（1）dwr/index.html，dwr/test/这种只能在debug模式下使用，调试用。 <br />dwr/engine.js，dwr/util.js，dwr/deprecated.js当这个请求到达，从dwr.jar包中读取文件流，响应回去。（重复请求有缓存） <br />（2）当dwr/interface/这种请求到来，（例如我们在index.html中的 &lt;script type='text/javascript' src='dwr/interface/JDate.js'&gt;&lt;/script&gt;）DWR做一件伟大的事。把我们在WEB- INF/dwr.xml中的 <br />&lt;create creator="new" javascript="JDate"&gt; <br />&lt;param name="class" value="java.util.Date"/&gt; <br />&lt;/create&gt; <br />java.util.Date转化为javascript函数。 <br /><a href="http://localhost:port/simpledwr/dwr/interface/JDate.js%E7%9C%8B%E7%9C%8B%E5%90%A7%E3%80%82" target="_blank"><font color="#366900">http://localhost:port/simpledwr/dwr/interface/JDate.js看看吧。</font></a><br />细节也比较简单，通过java反射，把方法都写成javascript特定的方法。（我觉得这些转换可以放到缓存里，下次调用没必要再生成一遍，不知道作者为什么没这样做）。 <br />（3）dwr/exec <br />javascript调用方法时发送这种请求，可能是XMLHttpRequest或IFrame发送。 <br />当然，javascript调用的方法签名与java代码一致，包括参数，还有javascript的回调方法也传到了服务器端，在服务器端很容易实现。回调方法的java的执行结果 返回类似 &lt;script&gt;callMethod(结果)&lt;script&gt;的javascript字符串,在浏览器执行。哈，一切就这么简单，巧妙。 <br /><br />dwr的设计构思很是巧妙。 <br />第一、把java类转化为javascript类由dwr自动完成，只需简单的配置。 <br />第二、应用起来极其简单。开发者不要该服务器代码就可以集成。 <br />第三、容易测试。和webwork一样，隐藏的http协议。 <br />第四、及强扩展性。例如与spring集成，只需修改一点代码。 <br />第五、性能。就我与jason,等简单比较，dwr性能可能是最好的。 <br />第六、自动把java对象转化为javascript对象，并且及易扩展。</span><br /><br /></div>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/71155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2006-09-21 16:51 <a href="http://www.blogjava.net/zhanglijun33/archive/2006/09/21/AJAXWITHDWR.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Work Ajax with dwr for java</title><link>http://www.blogjava.net/zhanglijun33/archive/2006/09/19/ajaxforjava.html</link><dc:creator>智者无疆</dc:creator><author>智者无疆</author><pubDate>Tue, 19 Sep 2006 08:38:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglijun33/archive/2006/09/19/ajaxforjava.html</guid><wfw:comment>http://www.blogjava.net/zhanglijun33/comments/70560.html</wfw:comment><comments>http://www.blogjava.net/zhanglijun33/archive/2006/09/19/ajaxforjava.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglijun33/comments/commentRss/70560.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglijun33/services/trackbacks/70560.html</trackback:ping><description><![CDATA[
		<div class="posthead">
				<h2>
						<font size="4">
								<font color="#000080">作者:Cloves Carneiro;</font>
						</font>
						<a href="http://www.matrix.org.cn/user.shtml?username=simmone" target="_new">
								<font color="#000080" size="4">simmone </font>
						</a>
						<br />
						<font size="4">
								<font color="#000080">原文地址:</font>
						</font>
						<a href="http://www.javaworld.com/javaworld/jw-06-2005/jw-0620-dwr.html" target="_new">
								<font color="#000080" size="4">http://www.javaworld.com/javaworld/jw-06-2005/jw-0620-dwr.html </font>
						</a>
						<br />
						<font size="4">
								<font color="#000080">中文地址:</font>
						</font>
						<a href="http://www.matrix.org.cn/resource/article/43/43926_DWR_AJAX.html" target="_new">
								<font color="#000080" size="4">http://www.matrix.org.cn/resource/article/43/43926_DWR_AJAX.html </font>
						</a>
						<br />
						<font color="#000080">
								<font size="4">关键词： DWR AJAX<br /></font>
								<br />
								<br />
								<span style="FONT-SIZE: 16px">概述</span>
								<br />
								<br />
								<font size="3">这篇文章阐述了使用开源项目DWR(直接Web远程控制)和AJAX(异步JavaScript和XML)的概念来提高Web应用的可用性。作者一步步来展示DWR如何使得AJAX的应用既简单又快捷。（1600字;2005年6月20日） <br /><br />AJAX，或者说是异步JavaScript和XML，描述了一种使用混合了HTML(或XHTML)和层叠样式表作为表达信息,来创建交互式的Web应用的开发技术;文档对象模型（DOM），JavaScript,动态地显示和与表达信息进行交互;并且，XMLHttpRequest对象与Web服务器异步地交换和处理数据。<br /><br />因特网上许多例子展示了在一个HTML文件内部使用XMLHttpRequest与服务器端进行交互的必要的步骤。当手工地编写和维护XMLHttpRequest代码时，开发者必须处理许多潜在的问题，特别是类似于跨浏览器的DOM实现的兼容性这样的问题。这将会导致在编码和调试Javascript代码上面花费数不清的时间，这显然对开发者来说很不友好。<br /><br />DWR(直接Web远程控制)项目是在Apache许可下的一个开源的解决方案，它供给那些想要以一种简单的方式使用AJAX和XMLHttpRequest的开发者。它具有一套Javascript功能集，它们把从HTML页面调用应用服务器上的Java对象的方法简化了。它操控不同类型的参数，并同时保持了HTML代码的可读性。<br /><br />DWR不是对一个设计的插入，也不强迫对象使用任何种类的继承结构。它和servlet框架内的应用配合的很好。对缺少DHTML编程经验的开发者来说，DWR也提供了一个JavaScript库包含了经常使用的DHTML任务，如组装表，用item填充select下拉框，改变HTML元素的内容，如&lt;div&gt;和&lt;span&gt;<br />DWR网站是详尽的并且有大量的文档，这也是这篇文章的基础。一些例子用来展示DWR如何使用和用它的库可以完成什么样的工作。<br /><br />这篇文章让读者看到了一个使用了DWR的Web应用是如何一步步建立的。我会展示创建这个简单的示例应用的必要的细节，这个应用是可下载的并且可以在你的环境中布署来看看DWR如何工作。<br />注意：找到有关AJAX的信息并不困难;网页上有几篇文章和博客的条目涵盖了这个主题，每一个都试图指出和评论这个概念的不同的方面。在资源部分，你会找到一些有趣的指向示例和文章的链接，来学习AJAX的更多的内容。<br /><br /><span style="FONT-SIZE: 16px">示例应用</span><br />这篇文章使用的示例应用模拟了多伦多的一个公寓出租搜索引擎。用户可以在搜索前选择一组搜索标准。为了提高交互性，AJAX中以下两种情况下使用：<br />·应用通告用户配合他的选择会返回多少搜索结果。这个数字是实时更新的-使用AJAX-当用户选择的卧室和浴室的数量，或者价格范围变化时。当符合标准的搜索结果没有或太多时，用户就没有必要点击搜索按纽。<br />·数据库查询并取回结果是由AJAX完成的。当用户按下显示结果按钮时，数据库执行搜索。这样，应用看起来更具响应了，而整个页面不需要重载来显示结果。<br /><br /><span style="FONT-SIZE: 16px">数据库</span><br />我们使用的数据库是HSQL，它是一种占用资源很小的Java SQL数据库引擎，可以不需要安装和配置的与Web应用捆绑在一起。一个SQL文件被用来在Web应用的上下文启动时创建一个内存中的表并添加一些记录。<br /><br /><span style="FONT-SIZE: 16px">Java类</span><br />应用包含了两个主要的类叫Apartment和ApartmentDAO。Apartment.java类是一个有着属性和getter/setter方法的简单的Java类。ApartmentDAO.java是数据访问类，用来查询数据库并基于用户的搜索标准来返回信息。ApartmentDAO类的实现的直接了当的;它直接使用了Java数据库联接调用来得到公寓的总数和符合用户请求的可用公寓的列表。<br /><br /><span style="FONT-SIZE: 16px">DWR配置和使用</span><br />设置DWR的使用是简单的：将DWR的jar文件拷入Web应用的WEB-INF/lib目录中，在web.xml中增加一个servlet声明，并创建DWR的配置文件。DWR的分发中需要使用一个单独的jar文件。你必须将DWR servlet加到应用的WEB-INF/web.xml中布署描述段中去。<br /></font>
						</font>
				</h2>
		</div>
		<div class="postbody">
				<div class="postText">
						<pre class="overflow">
								<font color="#000080">    &lt;servlet&gt;<br />        &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt;<br />        &lt;display-name&gt;DWR Servlet&lt;/display-name&gt;<br />        &lt;description&gt;Direct Web Remoter Servlet&lt;/description&gt;<br />        &lt;servlet-class&gt;uk.ltd.getahead.dwr.DWRServlet&lt;/servlet-class&gt;<br />        &lt;init-param&gt;<br />            &lt;param-name&gt;debug&lt;/param-name&gt;<br />            &lt;param-value&gt;true&lt;/param-value&gt;<br />        &lt;/init-param&gt;<br />    &lt;/servlet&gt;<br /><br />    &lt;servlet-mapping&gt;<br />        &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt;<br />        &lt;url-pattern&gt;/dwr/*&lt;/url-pattern&gt;<br />    &lt;/servlet-mapping&gt;</font>
						</pre>
						<br />
						<br />
						<font color="#000080">一个可选的步骤是设置DWR为调试模式—象上面的例子那样—在servlet描述段中将debug参数设为true。当DWR在调试模式时，你可以从HTMl网页中看到所有的可访问的Java对象。包含了可用对象列表的网页会出现在/WEBAPP/dwr这个url上，它显示了对象的公共方法。所列方法可以从页面中调用，允许你，第一次，运行服务器上的对象的方法。下图显示了调试页的样子:<br /><br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2005_11_07_000336_lrylCwRMxo.jpg" onload="javascript:imgLoad(this);" border="0" /><br />调试页<br /><br />现在你必须让DWR知道通过XMLHttpRequest对象，什么对象将会接收请求。这个任务由叫做dwr.xml的配置文件来完成。在配置文件中，定义了DWR允许你从网页中调用的对象。从设计上讲，DWR允许访问所有公布类的公共方法，但在我们的例子中，我们只允许访问几个方法。下面是我们示例的配置文件:<br /></font>
						<pre class="overflow">
								<font color="#000080">&lt;dwr&gt;<br />    &lt;allow&gt;<br />        &lt;convert converter="bean" match="dwr.sample.Apartment"/&gt;<br />        &lt;create creator="new" javascript="ApartmentDAO" class="dwr.sample.ApartmentDAO"&gt;<br />            &lt;include method="findApartments"/&gt;<br />            &lt;include method="countApartments"/&gt;<br />        &lt;/create&gt;<br />    &lt;/allow&gt;<br />&lt;/dwr&gt;</font>
						</pre>
						<br />
						<br />
						<font color="#000080">上面的文件实现了我们例子中的两个目标。首先，&lt;convert&gt;标记告诉DWR将dwr.sample.Apartment对象的类型转换为联合数组，因为，出于安全的原因，DWR默认的不会转换普通bean。第二，&lt;create&gt;标记让DWR暴露出dwr.sample.ApartmentDAO类给JavaScript调用;我们在页面中使用JavaScript文件被javascript属性定义。我们必须注意&lt;include&gt;标记，它指明了dwr.sample.ApartmentDAO类的哪些方法可用。<br /><br /><b><span style="FONT-SIZE: 16px">HTML/JSP代码</span></b><br />配置完成后，你就可以启动你的Web应用了，这时DWR会为从你的HTML或Java服务器端页面(JSP)上调用所需方法作好准备，并不需要你创建JavaScript文件。在search.jsp文件中， 我们必须增加由DWR提供的JavaScript接口，还有DWR引擎，加入以下三行到我们的代码中：<br /><br /></font>
						<pre class="overflow">
								<font color="#000080">  &lt;script src='dwr/interface/ApartmentDAO.js'&gt;&lt;/script&gt;<br />  &lt;script src='dwr/engine.js'&gt;&lt;/script&gt;<br />  &lt;script src='dwr/util.js'&gt;&lt;/script&gt;</font>
						</pre>
						<br />
						<br />
						<font color="#000080">我们注意到当用户改变搜索标准时，这是AJAX在示例程序中的首次应用;正如他所看到的，当标准改变时，可用的公寓数量被更新了。我创建了两个JavaScript函数：当某一个选择下拉框中的值变化时被调用。ApartmentDAO.countApartments()函数是最重要的部分。最有趣的是第一个参数, loadTotal()函数，它指明了当接收到服务端的返回时DWR将会调用的JavaScript方法。loadTotal于是被调用来在HTML页面的&lt;div&gt;中显示结果。下面是在这个交互场景中所使用到的JavaScript函数:<br /><br /></font>
						<pre class="overflow">
								<font color="#000080">function updateTotal() {<br />    $("resultTable").style.display = 'none';<br />    var bedrooms = document.getElementById("bedrooms").value;<br />    var bathrooms = document.getElementById("bathrooms").value;<br />    var price = document.getElementById("price").value;<br />    ApartmentDAO.countApartments(loadTotal, bedrooms, bathrooms, price);<br />}<br /><br />function loadTotal(data) {<br />    document.getElementById("totalRecords").innerHTML = data;<br />}</font>
						</pre>
						<br />
						<br />
						<font color="#000080">很明显，用户想看到符合他的搜索条件的公寓列表。那么，当用户对他的搜索标准感到满意，并且总数也是有效的话，他会按下显示结果的按纽，这将会调用updateResults() JavaScript方法：<br /><br /></font>
						<pre class="overflow">
								<font color="#000080">function updateResults() {<br />    <br />    DWRUtil.removeAllRows("apartmentsbody");<br />    var bedrooms = document.getElementById("bedrooms").value;<br />    var bathrooms = document.getElementById("bathrooms").value;<br />    var price = document.getElementById("price").value;<br />    ApartmentDAO.findApartments(fillTable, bedrooms, bathrooms, price);<br />    $("resultTable").style.display = '';<br />}<br /><br />function fillTable(apartment) {<br />    DWRUtil.addRows("apartmentsbody", apartment, [ getId, getAddress, getBedrooms, getBathrooms, getPrice ]);<br />}</font>
						</pre>
						<br />
						<br />
						<font color="#000080">updateResults()方法清空了存放搜索返回结果的表域，从用户界面上获取所需参数，并且将这些参数传给DWR创建的ApartmentDAO对象。然后数据库查询将被执行，fillTable()将会被调用，它解析了DWR返回的对象(apartment)，然后将其显示到页面中(apartmentsbody)。<br /><br /><b><span style="FONT-SIZE: 16px">安全因素</span></b><br />为了保持示例的简要，ApartmentDAO类尽可能的保持简单，但这样的一个类通常有一组设置方法来操作数据，如insert(), update()和delete()。DWR暴露了所有公共方法给所有的HTML页面调用。出于安全的原因，像这样暴露你的数据访问层是不明智的。开发者可以创建一个门面来集中所有JavaScript函数与底层业务组件之间的通信，这样就限制了过多暴露的功能。<br /><br /><b><span style="FONT-SIZE: 16px">结论</span></b><br />这篇文章仅仅让你在你的项目中使用由DWR支持的AJAX开了个头。DWR让你集中注意力在如何提高你的应用的交互模型上面，消除了编写和调试JavaScript代码的负担。使用AJAX最有趣的挑战是定义在哪里和如何提高可用性。DWR负责了操作Web页面与你的Java对象之间的通信，这样就帮助你完全集中注意力在如何让你的应用的用户界面更加友好，<br />我想感谢Mircea Oancea和Marcos Pereira,他们阅读了这篇文章并给予了非常有价值的返匮。<br /><br /><b>资源</b><br />·javaworld.com:</font>
						<a href="http://www.javaworld.com/" target="_new">
								<font color="#000080">javaworld.com </font>
						</a>
						<br />
						<font color="#000080">·Matrix-Java开发者社区:</font>
						<a href="http://www.matrix.org.cn/" target="_new">
								<font color="#000080">http://www.matrix.org.cn/ </font>
						</a>
						<br />
						<font color="#000080">·onjava.com:</font>
						<a href="http://www.onjava.com/" target="_new">
								<font color="#000080">onjava.com </font>
						</a>
						<br />
						<font color="#000080">·下载示例程序的全部源码:</font>
						<a href="http://www.javaworld.com/javaworld/jw-06-2005/dwr/jw-0620-dwr.war" target="_new">
								<font color="#000080">http://www.javaworld.com/javaworld/jw-06-2005/dwr/jw-0620-dwr.war </font>
						</a>
						<br />
						<font color="#000080">·DWR: http://www.getahead.ltd.uk/dwr/index.html<br />·HSQL:http://hsqldb.sourceforge.net/<br />·AJAX的定义:http://en.wikipedia.org/wiki/AJAX<br />· “AJAX:通向Web应用的新途径": Jesse James Garrett (Adaptive Path, 2005.2): http://www.adaptivepath.com/publications/essays/archives/000385.php<br />· “非常动态的Web界面” Drew McLellan (xml.com, 2005.2): http://www.xml.com/pub/a/2005/02/09/xml-http-request.html<br />·XMLHttpRequest &amp; AJAX 工作范例: http://www.fiftyfoureleven.com/resources/programming/xmlhttprequest/examples<br />· “可用的XMLHttpRequest实践” Thomas Baekdal (Baekdal.com, 2005.3): http://www.baekdal.com/articles/Usability/usable-XMLHttpRequest/<br />·"XMLHttpRequest使用导引" Thomas Baekdal (Baekdal.com,  2005.2):http://www.baekdal.com/articles/Usability/XMLHttpRequest-guidelines/<br />·AJAX实质:http://www.ajaxmatters.com/<br /><br />(看完后个人感觉：有了DWR就JAVA开发而言，完全可以与AJAX匹敌啦，省了在JS上对XMLHTTP以及对DOM的处理，不可以避免地在后台对应的IO处理；然后就DWR来说，它增加了对XML中对应的配置--在开源框架中似乎一直不曾停止过。还有对一些DWR自有用法如DWRUtil.addRows得参考其相关文档---当然这样的功能我们自己也可以用JS来解决，并且它显然很实用。)<br /></font>DWRUtil学习 <br /><br /><br /><br />这些功能函数在下面这个网址都有示例,这里只是把他们用中文解释,方便查找. <br /><a href="http://getahead.ltd.uk/dwr/browser/util" target="_new"><font color="#525252">http://getahead.ltd.uk/dwr/browser/util</font></a><br /><br />DWRUtil.getText(id) <br /><br />这个函数只能用于select <br /><br />getText(id) is similar to getValue(id), except that it is designed for &lt;select ... lists where you need to get the displayed text rather than the value of the current option. <br /><br />这个函数主要的作用是取到当前select的显示值即&lt;option value&gt;xxx&lt;/option&gt;中xxx的内容 <br /><br /><br />DWRUtil.getValue(id) 用来得到&lt;option value&gt;xxx&lt;/option&gt;等元素的value值 <br /><br />DWRUtil.getValue(id) is the read version of setValue(). This gets the values out of the HTML elements without you needing to worry about how a selection list differs from a div. <br /><br /><br /><br />这个函数能用于多个元素input type =textarea,text,Form button,formbutton,password(明文), <br />Fancy button等元素,主要可以屏蔽原来对select元素getValue操作带来的不便 <br /><br /><br />DWRUtil.getValues() <br /><br /><br />getValues() is similar to getValue() except that the input is a Javascript object that contains name/value pairs. The names are assumed to be the IDs of HTML elements, and the values are altered to reflect the contents of those IDs. This method does not return the object in question, it alters the value that you pass to it. <br />此函数主要是一次完成多个元素的getValue()操作,并将value的结果以js对象的形式封装起来返回,参数是一个js对象,其中包含了希望取到value的element id <br />e.g <br />{ div:null, textarea:null, select:null, text:null, password:null, formbutton:null, button:null} <br />详细参考<a href="http://getahead.ltd.uk/dwr/browser/util" target="_new"><font color="#525252">http://getahead.ltd.uk/dwr/browser/util</font></a>/getvalues查看效果 <br />DWRUtil.onReturn <br />When inputs are part of a form then the return key causes the form to be submitted. When you are using Ajax, this is generally not what you want. Usually it would be far better if some JavaScript was triggered.Unfortunately different browsers handle events in quite a different manner. So DWRUtil.onReturn patches over the differences. <br />在一个form表单中敲回车键将导致表单被递交,这往往不是我们希望看到的.但是很多浏览器对这个事件的处理是不统一的,这个函数就是为了消除这个不统一的 <br /><br />DWRUtil.onReturn(event, submitFunction) <br /><br /><br />DWRUtil.selectRange <br />Selecting a range of text in an input box <br />You need to select text in an input box for any "Google suggest" type functions, however the selection model changes a lot between different browsers. The DWRUtil function to help here is: DWRUtil.selectRange(ele, start, end). <br />在一个input元素中选择一个范围的字符串,可以查看 <br /><a href="http://getahead.ltd.uk/dwr/browser/util" target="_new"><font color="#525252">http://getahead.ltd.uk/dwr/browser/util</font></a>/selectrange操作 <br /><br />DWRUtil.setValue(id, value) <br /><br />DWRUtil.setValue(id, value) finds the element with the id specified in the first parameter and alters its contents to be the value in the second parameter. <br />This method works for almost all HTML elements including selects (where the option with a matching value and not text is selected), input elements (including textareas) divs and spans. <br />主要是为了设值,屏蔽了select元素设值的问题,对select也可以方便的setvalue <br /><br />DWRUtil.setValues() <br />Similar to setValue except that the input is a Javascript object that contains name/value pairs. The names are assumed to be the IDs of HTML elements, and the values, what we should set the contents of the elements. <br />与getValues对应,传入js对象,将对象中的value传给相应的element <br /><br />DWRUtil.toDescriptiveString(id,degree) <br />DWRUtil.toDescriptiveString is a better version of the toString() than the default. This function has a third parameter that declares the initial indent. This function should not be used from the outside world as it may well change in the future. <br />此函数主要用来调试,传入元素的id,调试的degree将显示DOM信息 <br />此函数有第三个参数,用于声明初始化,包含第三个参数的调用不应该为使用,因为这个函数将来会改变 <br />DWRUtil.useLoadingMessage <br />You must call this method after the page has loaded (i.e. not before the onload() event has fired) because it creates a hidden div to contain the loading message. <br />你必须在页面加载完成后(body onload事件)调用这个函数,因为它会创建一个div,来包含一些消息.类似gmail的message模式的东西.为了达到在页面加载完成后来操作, <br /><a href="http://getahead.ltd.uk/dwr/browser/util" target="_new"><font color="#525252">http://getahead.ltd.uk/dwr/browser/util</font></a>/useloadingmessage <br />提供了一些方法.例如 <br />&lt;script&gt;function init() { DWRUtil.useLoadingMessage();}if (window.addEventListener) { window.addEventListener("load", init, false);}else if (window.attachEvent) { window.attachEvent("onload", init);}else { window.onload = init;}&lt;/script&gt; <br />该参考页面给出了2个类似的文字图片实现. <br />DWRUtil.addOptions() 用返回的集合来填充select元素 <br />多种实现,详细参考<a href="http://getahead.ltd.uk/dwr/browser/lists" target="_new"><font color="#525252">http://getahead.ltd.uk/dwr/browser/lists</font></a><br /><br />DWRUtil.addRows() 返回的集合来填充table元素,或者tbody更为合适 <br /> </div>
		</div>
<img src ="http://www.blogjava.net/zhanglijun33/aggbug/70560.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglijun33/" target="_blank">智者无疆</a> 2006-09-19 16:38 <a href="http://www.blogjava.net/zhanglijun33/archive/2006/09/19/ajaxforjava.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>