﻿<?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-computerboy-随笔分类-编程技术</title><link>http://www.blogjava.net/computerboy/category/6750.html</link><description>                 


                                                                        自由|免费|共享</description><language>zh-cn</language><lastBuildDate>Sat, 26 May 2007 12:29:55 GMT</lastBuildDate><pubDate>Sat, 26 May 2007 12:29:55 GMT</pubDate><ttl>60</ttl><item><title>一个文件复制的两种方法的实现</title><link>http://www.blogjava.net/computerboy/archive/2007/05/25/120020.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Fri, 25 May 2007 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2007/05/25/120020.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/120020.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2007/05/25/120020.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/120020.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/120020.html</trackback:ping><description><![CDATA[<p>一个文件的复制我们大概的思维是通过流来操作，不错。<br>本文也是这样操作的。<br>至于第一种方法是我们一般的操作方式，而第二种方法其实也是一个方式，我们不妨研究一下。<br>闲话少说。看程序。</p>
<p>这个程序我写的是两个方法，支持从命令行操作。<br>例一：<br>package org.stonecn.kernel;<br>import java.io.*;<br>public class FileCopy {<br>&nbsp;/** <br>&nbsp; * 测试程序<br>&nbsp; */<br>&nbsp;public static void main(String[] args){<br>&nbsp;&nbsp;if(args.length!=2)<br>&nbsp;&nbsp;&nbsp;System.err.println("Usage: java FileCopy&lt;source&gt;&lt;destination&gt;");<br>&nbsp;&nbsp;else{<br>&nbsp;&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;&nbsp;copy(args[0],args[1]);<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;catch(IOException e){<br>&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(e.getMessage());<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;public static void copy(String from_name,String to_name)throws IOException{<br>&nbsp;&nbsp;File from_file=new File(from_name);<br>&nbsp;&nbsp;File to_file=new File(to_name);<br>&nbsp;&nbsp;if(!from_file.exists())<br>&nbsp;&nbsp;&nbsp;abort("no such source file:"+from_name);<br>&nbsp;&nbsp;if(!from_file.isFile())<br>&nbsp;&nbsp;&nbsp;abort("can't copy directory:"+from_name);<br>&nbsp;&nbsp;if(!from_file.canRead())<br>&nbsp;&nbsp;&nbsp;abort("source file is unreadable:"+from_name);<br>&nbsp;&nbsp;/**<br>&nbsp;&nbsp; * 如果目标是一个目录，则使用源文件名作为目标文件名<br>&nbsp;&nbsp; */<br>&nbsp;&nbsp;if(to_file.isDirectory())<br>&nbsp;&nbsp;&nbsp;to_file=new File(to_file,from_file.getName());<br>&nbsp;&nbsp;/**<br>&nbsp;&nbsp; * 如果目标文件存在，则确保它是可写的,并且在覆盖之前先询问<br>&nbsp;&nbsp; * 如果目标文件不存在，则确保存在目录，而且是可写的。<br>&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 此处支持命令行，如果不用可以注视掉。&nbsp;&nbsp;&nbsp; sart&nbsp;&nbsp; <br>&nbsp;&nbsp;if(to_file.exists()){<br>&nbsp;&nbsp;&nbsp;abort("destination file is unwriteable:"+to_name);<br>&nbsp;&nbsp;&nbsp;//询问是否覆盖<br>&nbsp;&nbsp;&nbsp;System.out.print("Overwrite existing file:"+to_file.getName()+"?(Y/N):");<br>&nbsp;&nbsp;&nbsp;//得到用户响应<br>&nbsp;&nbsp;&nbsp;System.out.flush();<br>&nbsp;&nbsp;&nbsp;BufferedReader in=new BufferedReader(new InputStreamReader(System.in));<br>&nbsp;&nbsp;&nbsp;String response=in.readLine();<br>&nbsp;&nbsp;&nbsp;//检查响应，如果不是yes(未做确认),则终止复制<br>&nbsp;&nbsp;&nbsp;if(!response.equals("Y") &amp;&amp; !response.equals("y"))<br>&nbsp;&nbsp;&nbsp;&nbsp;abort("existing file was not overwritten.");<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;else{<br>&nbsp;&nbsp;&nbsp;/**如果文件不存在，检查是否存在目录且是否可写<br>&nbsp;&nbsp;&nbsp; * 如果getParent()返回null，则目录就是当前dir，<br>&nbsp;&nbsp;&nbsp; * 因此查找user.dir系统特性，以得出它是什么<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp;String parent=to_file.getParent();&nbsp; //目标目录<br>&nbsp;&nbsp;&nbsp;if(parent == null)<br>&nbsp;&nbsp;&nbsp;&nbsp;parent=System.getProperty("user.dir");<br>&nbsp;&nbsp;&nbsp;File dir=new File(parent);<br>&nbsp;&nbsp;&nbsp;if(!dir.exists())<br>&nbsp;&nbsp;&nbsp;&nbsp;abort("destination directory doesn't exist:"+parent);<br>&nbsp;&nbsp;&nbsp;if(dir.isFile())<br>&nbsp;&nbsp;&nbsp;&nbsp;abort("destination is not a directory:"+parent);<br>&nbsp;&nbsp;&nbsp;if(!dir.canWrite())<br>&nbsp;&nbsp;&nbsp;&nbsp;abort("destination directory is unwriteable:"+parent);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //到此结束&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end&nbsp; <br>&nbsp;&nbsp;/**<br>&nbsp;&nbsp; * 如果走到这了，则一切正常。<br>&nbsp;&nbsp; * 因此可以复制文件，一次复制一个字节缓冲区<br>&nbsp;&nbsp; */<br>&nbsp;&nbsp;FileInputStream from=null;&nbsp;&nbsp; //从源读取的流<br>&nbsp;&nbsp;FileOutputStream to=null;&nbsp;&nbsp;&nbsp; //写至目标的流<br>&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;from=new FileInputStream(from_file); //创建输入流<br>&nbsp;&nbsp;&nbsp;to=new FileOutputStream(to_file);&nbsp;&nbsp;&nbsp; //创建输出流<br>&nbsp;&nbsp;&nbsp;byte[] buffer=new byte[4096];<br>&nbsp;&nbsp;&nbsp;int bytes_read;<br>&nbsp;&nbsp;&nbsp;/**<br>&nbsp;&nbsp;&nbsp; * 将一块字节读入缓冲区，然后将其写出<br>&nbsp;&nbsp;&nbsp; * 如果循环，知道达到文件结束(read()返回-1)<br>&nbsp;&nbsp;&nbsp; * 注意，在此while循环中结合了赋值和比较<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp;while((bytes_read=from.read(buffer))!=-1)&nbsp; //读，直到EOF<br>&nbsp;&nbsp;&nbsp;&nbsp;to.write(buffer,0,bytes_read);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //写<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;finally{<br>&nbsp;&nbsp;&nbsp;if(from!=null)<br>&nbsp;&nbsp;&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;catch(IOException e){<br>&nbsp;&nbsp;&nbsp;&nbsp;;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;if(to!=null)<br>&nbsp;&nbsp;&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;catch(IOException e){;}<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;/**<br>&nbsp; * 这是抛出异常的一个便利方法<br>&nbsp; */<br>&nbsp;private static void abort(String msg)throws IOException{<br>&nbsp;&nbsp;throw new IOException("FileCopy:"+msg);<br>&nbsp;}</p>
<p>}</p>
<p><br>这个程序的好处是一个安全的。因为有一个静态的copy方法。其他程序也可以使用此方法来复制文件</p>
<p>&nbsp;</p>
<p>我们来看第二个例子</p>
<p>例二：<br>package org.stonecn.kernel;<br>import java.io.*;<br>import java.nio.channels.*;</p>
<p>&nbsp;public class FileCopy2{<br>&nbsp;&nbsp;public static void main(String[] args){<br>&nbsp;&nbsp;&nbsp;FileInputStream fin=null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //两个文件的流<br>&nbsp;&nbsp;&nbsp;FileOutputStream fout=null;&nbsp;&nbsp;&nbsp;&nbsp; //这些流要在finally块中关闭<br>&nbsp;&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;&nbsp;//打开输入文件的一个流，并从中得到一个通道<br>&nbsp;&nbsp;&nbsp;&nbsp;fin=new FileInputStream(args[0]);<br>&nbsp;&nbsp;&nbsp;&nbsp;FileChannel in=fin.getChannel();<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;//下面得到输出通道<br>&nbsp;&nbsp;&nbsp;&nbsp;WritableByteChannel out;<br>&nbsp;&nbsp;&nbsp;&nbsp;//如果有第二个文件名<br>&nbsp;&nbsp;&nbsp;&nbsp;if(args.length&gt;1){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fout=new FileOutputStream(args[1]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out=fout.getChannel();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;else{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//没有目标文件名<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out=Channels.newChannel(System.out);&nbsp;&nbsp; //包装stdout流<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;//查询输入文件的大小<br>&nbsp;&nbsp;&nbsp;&nbsp;long numbytes=in.size();<br>&nbsp;&nbsp;&nbsp;&nbsp;/**<br>&nbsp;&nbsp;&nbsp;&nbsp; *采用批量传输的方式将所有字节从一个通道传输到另一个通道<br>&nbsp;&nbsp;&nbsp;&nbsp; *这是fileChannel通道的一个特殊特性<br>&nbsp;&nbsp;&nbsp;&nbsp; *参见FileChannel.transferForm()<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp;&nbsp; in.transferTo(0,numbytes,out);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;catch(IOException e){<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e);<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;finally{<br>&nbsp;&nbsp;&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fin!=null)&nbsp; fin.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fout!=null)&nbsp; fout.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;catch(IOException e){<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p><br>而这个程序将其第一个参数中指定的文件复制到第二个参数所指定的文件中。<br>如果没有第二个参数则复制到标准输出。</p>
<p>同样的方式，两种实现，这就是我们所说的结果一样，而过程也是千变万化。<br>例二所涉及的包是我以前所没有接触到的。<br>欢迎朋友们来指正。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/computerboy/aggbug/120020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/computerboy/" target="_blank">Computerboy</a> 2007-05-25 16:17 <a href="http://www.blogjava.net/computerboy/archive/2007/05/25/120020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE的13种核心技术简介</title><link>http://www.blogjava.net/computerboy/archive/2007/02/02/97450.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Fri, 02 Feb 2007 03:53:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2007/02/02/97450.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/97450.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2007/02/02/97450.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/97450.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/97450.html</trackback:ping><description><![CDATA[
		<h5>本文系转载：出处:IT专家网社区</h5>
		<h5>在本文中将解释支撑J2EE的13种核心技术：JDBC,JNDI,EJBs,RMI,JSP,Javaservlets,XML,JMS,JavaIDL,JTS,JTA,JavaMail和JAF，同时还将描述在何时、何处需要使用这些技术。</h5>
		<div class="guanggao">
				<span id="contentAdv">
				</span>
		</div>
		<p>　　Java最初是在浏览器和客户端机器中粉墨登场的。当时，很多人质疑它是否适合做服务器端的开发。现在，随着对Java2平台企业版(J2EE)第三方支持的增多，Java被广泛接纳为开发企业级服务器端解决方案的首选平台之一。</p>
		<p>　　J2EE平台由一整套服务(Services)、应用程序接口(APIs)和协议构成，它对开发基于Web的多层应用提供了功能支持。在本文中将解释支撑J2EE的13种核心技术：JDBC,JNDI,EJBs,RMI,JSP,Javaservlets,XML,JMS,JavaIDL, JTS,JTA,JavaMail和JAF，同时还将描述在何时、何处需要使用这些技术。当然，我还要介绍这些不同的技术之间是如何交互的。此外，为了让您更好地感受J2EE的真实应用，将在WebLogic应用服务器,来自BEA Systems公司的一种广为应用的产品环境下来介绍这些技术。不论对于WebLogic应用服务器和J2EE的新手，还是那些想了解J2EE能带来什么好处的项目管理者和系统分析员，相信本文一定很有参考价值。</p>
		<p>　　<strong>宏观印象:分布式结构和J2EE</strong></p>
		<p>　　过去，二层化应用--通常被称为client/server应用--是大家谈论的最多的。在很多情况下，服务器提供的惟一服务就是数据库服务。在这种解决方案中，客户端程序负责数据访问、实现业务逻辑、用合适的样式显示结果、弹出预设的用户界面、接受用户输入等。client/server结构通常在第一次部署的时候比较容易，但难于升级或改进，而且经常基于某种专有的协议，通常是某种数据库协议。它使得重用业务逻辑和界面逻辑非常困难。更重要的是，在Web时代，二层化应用通常不能体现出很好的伸缩性，因而很难适应Internet的要求。</p>
		<p>　　Sun设计J2EE的部分起因就是想解决二层化结构的缺陷。于是，J2EE定义了一套标准来简化N层企业级应用的开发。它定义了一套标准化的组件，并为这些组件提供了完整的服务。J2EE还自动为应用程序处理了很多实现细节，如安全、多线程等。</p>
		<p>　　用J2EE开发N层应用包括将二层化结构中的不同层面切分成许多层。一个N层化应用A能够为以下的每种服务提供一个分开的层：</p>
		<ul>
				<li>　　<strong>显示：</strong>在一个典型的Web应用中，客户端机器上运行的浏览器负责实现用户界面。</li>
				<li>　　<strong>动态生成显示:</strong>尽管浏览器可以完成某些动态内容显示，但为了兼容不同的浏览器，这些动态生成工作应该放在Web服务器端进行，使用JSP、Servlets，或者XML(可扩展标记语言)和(可扩展样式表语言)。</li>
				<li>　　<strong>业务逻辑：</strong>业务逻辑适合用SessionEJBs(后面将介绍)来实现。</li>
				<li>　　<strong>数据访问：</strong>数据访问适合用EntityEJBs(后面将介绍)和JDBC来实现。</li>
				<li>　　<strong>后台系统集成:</strong>同后台系统的集成可能需要用到许多不同的技术，至于何种最佳需要根据后台系统的特征而定。</li>
				<li>　　<strong>您可能开始诧异：</strong>为什么有这么多的层?事实上，多层方式可以使企业级应用具有很强的伸缩性，它允许每层专注于特定的角色。例如，让Web服务器负责提供页面，应用服务器处理应用逻辑，而数据库服务器提供数据库服务。</li>
		</ul>
		<p>　　由于J2EE建立在Java2平台标准版(J2SE)的基础上，所以具备了J2SE的所有优点和功能。包括“编写一次，到处可用”的可移植性、通过JDBC访问数据库、同原有企业资源进行交互的CORBA技术，以及一个经过验证的安全模型。在这些基础上，J2EE又增加了对EJB(企业级 Java组件)、Javaservlets、Java服务器页面(JSPs)和XML技术的支持。</p>
		<p>　　<strong>分布式结构与WebLogic应用服务器</strong></p>
		<p>　　J2EE提供了一个框架--一套标准API--用于开发分布式结构的应用，这个框架的实际实现留给了第三方厂商。部分厂商只是专注于整个 J2EE架构中的的特定组件，例如Apache的Tomcat提供了对JSP和servlets的支持，BEA系统公司则通过其WebLogic应用服务器产品为整个J2EE规范提供了一个较为完整的实现。<br /></p>
		<p>WebLogic服务器已使建立和部署伸缩性较好的分布式应用的过程大为简化。WebLogic和J2EE代你处理了大量常规的编程任务，包括提供事务服务、安全领域、可靠的消息、名字和目录服务、数据库访问和连接池、线程池、负载平衡和容错处理等。</p>
		<p>　　通过以一种标准、易用的方式提供这些公共服务，象WebLogic服务器这样的产品造就了具有更好伸缩性和可维护性的应用系统，使其为大量的用户提供了增长的可用性。</p>
		<p>　　<strong>J2EE技术</strong></p>
		<p>　　在接下来的部分里，我们将描述构成J2EE的各种技术，并且了解WebLogic服务器是如何在一个分布式应用中对它们进行支持的。最常用的J2EE技术应该是JDBC、JNDI、EJB、JSP和servlets，对这些我们将作更仔细的考察。</p>
		<p>　　<strong>Java Database Connectivity(JDBC)</strong></p>
		<p>　　JDBCAPI以一种统一的方式来对各种各样的数据库进行存取。和ODBC一样，JDBC为开发人员隐藏了不同数据库的不同特性。另外，由于JDBC建立在Java的基础上,因此还提供了数据库存取的平台独立性。</p>
		<p>　　JDBC定义了4种不同的驱动程序，现分述如下：</p>
		<ul>
				<li>　　类型1:JDBC-ODBCBridge</li>
		</ul>
		<p>　　在JDBC出现的初期，JDBC-ODBC桥显然是非常有实用意义的，通过JDBC-ODBC桥，开发人员可以使用JDBC来存取ODBC数据源。不足的是，他需要在客户端安装ODBC驱动程序，换句话说，必须安装MicrosoftWindows的某个版本。使用这一类型你需要牺牲JDBC的平台独立性。另外，ODBC驱动程序还需要具有客户端的控制权限。</p>
		<ul>
				<li>　　类型2:JDBC-nativedriverbridge</li>
		</ul>
		<p>　　JDBC本地驱动程序桥提供了一种JDBC接口，它建立在本地数据库驱动程序的顶层，而不需要使用ODBC。JDBC驱动程序将对数据库的API从标准的JDBC调用转换为本地调用。使用此类型需要牺牲JDBC的平台独立性，还要求在客户端安装一些本地代码。</p>
		<ul>
				<li>　　类型3:JDBC-networkbridge</li>
		</ul>
		<p>　　JDBC网络桥驱动程序不再需要客户端数据库驱动程序。它使用网络上的中间服务器来存取数据库。这种应用使得以下技术的实现有了可能，这些技术包括负载均衡、连接缓冲池和数据缓存等。由于第3种类型往往只需要相对更少的下载时间，具有平台独立性，而且不需要在客户端安装并取得控制权，所以很适合于Internet上的应用。</p>
		<ul>
				<li>　　类型4:PureJavadriver</li>
		</ul>
		<p>　　第4种类型通过使用一个纯Java数据库驱动程序来执行数据库的直接访问。此类型实际上在客户端实现了2层结构。要在N-层结构中应用，一个更好的做法是编写一个EJB，让它包含存取代码并提供一个对客户端具有数据库独立性的服务。</p>
		<p>　　WebLogic服务器为一些通常的数据库提供了JDBC驱动程序，包括Oracle,Sybase,MicrosoftSQLServer以及Informix。它也带有一种JDBC驱动程序用于Cloudscape，这是一种纯Java的DBMS，WebLogic服务器中带有该数据库的评估版本。<br /><br /></p>
		<p>以下让我们看一个JDBC实例：在这个例子中我们假定你已经在Cloudscape中建立了一个PhoneBook数据库，并且包含一个表，名为 CONTACT_TABLE，它带有2个字段：NAME和PHONE。开始的时候先装载CloudscapeJDBCdriver，并请求 drivermanager得到一个对PhoneBookCloudscape数据库的连接。通过这一连接，我们可以构造一个Statement对象并用它来执行一个简单的SQL查询。最后，用循环来遍历结果集的所有数据，并用标准输出将NAME和PHONE字段的内容进行输出。</p>
		<p>
		</p>
		<p>
		</p>
		<table style="BORDER-RIGHT: rgb(204,204,204) 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: rgb(204,204,204) 1px dotted; BORDER-LEFT: rgb(204,204,204) 1px dotted; BORDER-BOTTOM: rgb(204,204,204) 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
				<tbody>
						<tr>
								<td bgcolor="#f3f3f3">
										<font face="Verdana">import java.sql.*;<br />public class JDBCExample...{　<br />public static void main( String args[] )　<br />...{<br />try...{　<br />Class.forName("COM.cloudscape.core.JDBCDriver");　<br />Connection conn = DriverManager.getConnection("jdbc:cloudscape:PhoneBook");　  Statement stmt = conn.createStatement();　<br />String sql = "SELECT name, phone FROM CONTACT_TABLE ORDER BYname";　<br />ResultSet resultSet = stmt.executeQuery( sql );　<br />String name;　<br />String phone;　<br />while ( resultSet.next() )　<br />...{<br />name = resultSet.getString(1).trim();<br />phone = resultSet.getString(2).trim();<br />System.out.println( name + ", " + phone );　<br />}catch ( Exception e )　<br />...{// Handle exception heree.printStackTrace();　<br />}<br />}　<br />}</font>
								</td>
						</tr>
				</tbody>
		</table>
		<p>　　OK。接着来看一看JDBC是如何在企业应用中的进行使用。</p>
		<p>　　JDBC在企业级应用中的应用。以上实例其实是很基本的，可能有些微不足道。它假定了一个2层结构。在一个多层的企业级应用中，更大的可能是在客户端和一个EJB进行通信，该EJB将建立数据库连接。为了实现和改进可伸缩性和系统性能， WebLogic服务器提供了对连接缓冲池connection pool的支持。</p>
		<p>　　Connection pool减少了建立和释放数据库连接的消耗。在系统启动以后即可建立这样的缓冲池，此后如故再有对数据库的请求，WebLogic服务器可以很简单地从缓冲池中取出数据。数据缓冲池可以在WebLogic服务器的 weblogic.properties 文件中进行定义。</p>
		<p>　　在企业级应用的另一个常见的数据库特性是事务处理。事务是一组申明statement，它们必须做为同一个statement来处理以保证数据完整性。缺省情况下JDBC使用 auto-commit 事务模式。这可以通过使用Connection类的setAutoCommit() 方法来实现。现在已经对JDBC有了一些认识，下面该转向JNDI了。</p>
		<p>　　<strong>Java Naming and Directory Interface (JNDI)</strong></p>
		<p>　　JNDI API被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业级的资源如DNS和LDAP，本地文件系统，后者在应用服务器中的对象。在JNDI 中，在目录结构中的每一个结点称为context。每一个JNDI名字都是相对于context的。这里没有绝对名字的概念存在。对一个应用来说，它可以通过使用 InitialContext 类来得到其第一个context:</p>
		<p>
		</p>
		<p>
		</p>
		<table style="BORDER-RIGHT: rgb(204,204,204) 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: rgb(204,204,204) 1px dotted; BORDER-LEFT: rgb(204,204,204) 1px dotted; BORDER-BOTTOM: rgb(204,204,204) 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
				<tbody>
						<tr>
								<td bgcolor="#f3f3f3">Context ctx = new InitialContext();</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>　应用可以通过这个初始化的context经有这个目录树来定位它所需要的资源或对象。例如，假设你在Weblogic服务器中展开了一个EJB并将home接口绑定到名字 myApp.myEJB ，那么该EJB的某个客户在取得一个初始化context以后，可以通过以下语句定位home接口：</p>
		<p>
		</p>
		<table style="BORDER-RIGHT: rgb(204,204,204) 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: rgb(204,204,204) 1px dotted; BORDER-LEFT: rgb(204,204,204) 1px dotted; BORDER-BOTTOM: rgb(204,204,204) 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
				<tbody>
						<tr>
								<td bgcolor="#f3f3f3">MyEJBHome home = ctx.lookup( "myApp.myEJB" );</td>
						</tr>
				</tbody>
		</table>
		<p>　　在这个例子中，一旦你有了对被请求对象的参考，EJB的home接口就可以在它上面调用方法。我们将在下面的"Enterprise Java Beans"章节中做更多的介绍。</p>
		<p>　　以上关于JNDI的讨论只是冰山之一角而已。如果要更进一步地在context中查找对象，JNDI也提供了一些方法来进行以下操作：将一个对象插入或绑定到context。这在你展开一个EJB的时候是很有效的。从context中移去对象。列出context中的所有对象。创建或删除子一级的context。接下来，要开始关注EJB了。</p>
		<p>　　<strong>Enterprise Java Beans (EJB)</strong></p>
		<p>　　J2EE技术之所以赢得某体广泛重视的原因之一就是EJB。它们提供了一个框架来开发和实施分布式商务逻辑，由此很显著地简化了具有可伸缩性和高度复杂的企业级应用的开发。EJB规范定义了EJB组件在何时如何与它们的容器进行交互作用。容器负责提供公用的服务，例如目录服务、事务管理、安全性、资源缓冲池以及容错性。</p>
		<p>　　EJB规范定义了三种基本的bean类型:</p>
		<ul>
				<li>　　<strong>Stateless session beans:</strong> 提供某种单一的服务，不维持任何状态，在服务器故障发生时无法继续存在，生命期相对较短。例如，一个stateless sessionbean可能被用于执行温度转换计算。</li>
				<li>　　<strong>Stateful session bean:</strong> T提供了与客户端的会话交互，可以存储状态从而代表一个客户。典型例子是购物车。Stateful session bean在服务器故障时无法继续生存，生命气相对较短。每一个实例只用于一个单个的线程。</li>
				<li>　　<strong>Entity beans:</strong> 提供了一致性数据的表示-- 通常存放在数据库中 -- 在服务器故障发生后能继续存在。多用户情况下可以使用EJB来表示相同的数据。entity EJB的一个典型例子是客户的帐号信息。</li>
		</ul>
		<p>　　尽管有以上的区别，所有的EJB还是有许多的共同之处。它们都处理homeinterface。它定义了一个客户端是如何创建与消亡EJB的。可以在bean中对定义了客户端方法的远程接口进行调用;bean类则执行了主要的商务逻辑。描述EJB的开发已经超出了本文的范围。但是，如果一个 EJB已经被开发了或者从第三方进行了购买，它就必须在应用服务器中进行发布。WebLogic Server 5.1带有一个EJB Deployer Tool来协助处理EJB的发布。当你使用EJB Deployer Tool的时候，你要定义客户端所用的JNDI名字来定位EJB。Deployer Tool将生成wrapper类来处理和容器的通信以及在一个jar文件中把被请求的Java类绑定在一起。</p>
		<p>　　一旦EJB被发布，客户端就可以使用它的JNDI名字来定位EJB。首先，它必须得到一个到home接口的reference。然后，客户端可以使用该接口，调用一个create() 方法来得到服务器上运行的某个bean实例的句柄;最后，客户端可以使用该句柄在bean中调用方法。了解 EJB后，让我们再来看JSP。<br /></p>
		<p>　<strong>JavaServer Pages (JSPs)</strong></p>
		<p>　　可能已经有许多人已经熟悉Microsoft的Active Server Pages(ASP)技术了。JSP和ASP相对应的，但更具有平台对立性。他们被设计用以帮助Web内容开发人员创建动态网页，并且只需要相对较少的代码。 即使Web设计师不懂得如何编程也可以使用JSP，因为JSP应用是很方便的。 JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端所请求以后对这些Java代码进行处理，然后将生成的HTML页面返回给客户端的浏览器。</p>
		<p>　　下面来看一个JSP的简单实例。它只显示了服务器的当前日期和时间。虽然，对语法的具体解释已经超出了本文的范围，但我们还是可以很直观地看到，Java代码被放在 符号的中间，而Java的表达式则放在符号之间。</p>
		<p>
		</p>
		<p>
		</p>
		<table style="BORDER-RIGHT: rgb(204,204,204) 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: rgb(204,204,204) 1px dotted; BORDER-LEFT: rgb(204,204,204) 1px dotted; BORDER-BOTTOM: rgb(204,204,204) 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
				<tbody>
						<tr>
								<td bgcolor="#f3f3f3">
										<font face="Verdana">＜H1＞Date JSP sample＜/H1＞<br />＜H2＞　<br />＜% response.setHeader("Refresh", 5); %＞　  The current date is ＜%= new Date() %＞.  ＜/H2＞</font>
								</td>
						</tr>
				</tbody>
		</table>
		<p>　　下面是: Java servlets</p>
		<p>　　<strong>Java Servlets</strong></p>
		<p>　　Servlet提供的功能大多与JSP类似，不过实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码，而 servlets全部由Java写成并且生成HTML。Servlet是一种小型的Java程序，它扩展了Web服务器的功能。作为一种服务器端的应用，当被请求时开始执行，这和CGI Perl脚本很相似。Servlets和CGI脚本的一个很大的区别是：每一个CGI在开始的时候都要求开始一个新的进程 -- 而servlets是在servlet引擎中以分离的线程来运行的。因此servlets在可伸缩性上提供了很好的改进。</p>
		<p>　　在开发servlets的时候，您常常需要扩展javax.servlet.http.HttpServlet类，并且override一些它的方法，其中包括：</p>
		<ul>
				<li>　　<strong>service():</strong> 作为dispatcher来实现命令-定义方法</li>
				<li>　　<strong>doGet():</strong> 处理客户端的HTTP GET请求。</li>
				<li>　　<strong>doPost():</strong> 进行HTTP POST操作</li>
		</ul>
		<p>　　其它的方法还包括处理不同类型的HTTP请求 -- 可以参考HttpServlet API文档。以上描述的是标准J2EE Servlet API的各种方法。WebLogic服务器提供了一个该API完整的实现途径。一旦你开发了一个servlet，你就可以在 weblogic.properties 中加以注册并由此可以在WebLogic服务器中对它进行配置。</p>
		<p>　　通过Java servlets,我们已经到达了J2EE主要技术的末尾了。但J2EE所提供的并不止于这些。下面的段落中我们将简要地看一下现存的一些技术，包括RMI,Java IDL和CORBA, JTA, 以及XML，等等。<br /><br /></p>
		<p>　<strong>Remote Method Invocation (RMI)</strong></p>
		<p>　　正如其名字所表示的那样，RMI协议是在远程对象上调用一些方法。它使用了连续序列方式在客户端和服务器端传递数据。RMI是一种被EJB使用的更下层的协议。</p>
		<p>　　<strong>Java IDL/CORBA</strong></p>
		<p>　　在Java IDL的支持下，开发人员可以将Java和CORBA集成在一起。 他们可以创建Java对象并使之可在CORBA ORB中展开, 或者他们还可以创建Java类并作为和其它ORB一起展开的CORBA对象的客户。后一种方法提供了另外一种途径，通过它Java可以被用于将你的新的应用和legacy系统相集成。</p>
		<p>　　<strong>Java Transaction Architecture (JTA)/Java Transaction Service (JTS)</strong></p>
		<p>　　JTA定义了一种标准的API，应用系统由此可以存取各种事务监控。JTS是CORBA OTS事务监控的基本的实现。JTS规定了事务管理器的实现方式。该事务管理器是在高层支持Java Transaction API (JTA)规范，并且在较底层实现OMG OTS specification的Java映像。JTS事务管理器为应用服务器、资源管理器、独立的应用以及通信资源管理器提供了事务服务。</p>
		<p>　　<strong>JavaMail and JavaBeans Activation Framework</strong></p>
		<p>　　JavaMail是用于存取邮件服务器的API，它提供了一套邮件服务器的抽象类。仅支持SMTP服务器，也支持IMAP服务器。 JavaMail利用JavaBeans Activation Framework (JAF)来处理MIME-编码的邮件附件。MIME的字节流可以被转换成Java对象，或者转换自Java对象。由此大多数应用都可以不需要直接使用 JAF。</p>
		<p>　　<strong>Java Messaging Service (JMS)</strong></p>
		<p>　　JMS是用于和面向消息的中间件相互通信的应用程序接口(API)。它既支持点对点的域，有支持发布/订阅 (publish/subscribe)类型的域，并且提供对下列类型的支持：经认可的消息传递,事务型消息的传递，一致性消息和具有持久性的订阅者支持。JMS还提供了另一种方式来对您的应用与legacy backend系统相集成。</p>
		<p>　　<strong>Extensible Markup Language (XML)</strong></p>
		<p>　　XML是一种可以用来定义其它标记语言的语言。它被用来在不同的商务过程中共享数据。XML的发展和Java是相互独立的，但是，它和Java 具有的相同目标正是平台独立性。通过将Java和XML的组合，您可以得到一个完美的具有平台独立性的解决方案。目前正有许多不同的公司在为Java和 XML的组合而努力。如果要了解更多的这方面的信息，可以访问Sun的Java-XML页面，或者IBM developerWorks的XML Zone。</p>
<img src ="http://www.blogjava.net/computerboy/aggbug/97450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/computerboy/" target="_blank">Computerboy</a> 2007-02-02 11:53 <a href="http://www.blogjava.net/computerboy/archive/2007/02/02/97450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java基础知识总结</title><link>http://www.blogjava.net/computerboy/archive/2007/02/02/97446.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Fri, 02 Feb 2007 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2007/02/02/97446.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/97446.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2007/02/02/97446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/97446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/97446.html</trackback:ping><description><![CDATA[
		<p>
				<strong>本文系转载：</strong>出处:IT专家网社区<br /><br /><strong>1、对象的初始化</strong></p>
		<ul>
				<li>　　(1)非静态对象的初始化</li>
		</ul>
		<p>　　在创建对象时，对象所在类的所有数据成员会首先进行初始化。</p>
		<ul>
				<ul>
						<li>　　基本类型：int型，初始化为0。</li>
						<li>　　如果为对象：这些对象会按顺序初始化。</li>
				</ul>
		</ul>
		<p>　　※在所有类成员初始化完成之后，才调用本类的构造方法创建对象。</p>
		<p>　　构造方法的作用就是初始化。</p>
		<ul>
				<li>　　(2)静态对象的初始化</li>
		</ul>
		<p>　　程序中主类的静态变量会在main方法执行前初始化。</p>
		<p>　　不仅第一次创建对象时，类中的所有静态变量都初始化，并且第一次访问某类(注意此时未创建此类对象)的静态对象时，所 有的静态变量也要按它们在类中的顺序初始化。</p>
		<p>　　<strong>2、继承时，对象的初始化过程</strong></p>
		<ul>
				<li>　　(1)主类的超类由高到低按顺序初始化静态成员，无论静态成员是否为private。</li>
				<li>　　(2)主类静态成员的初始化。</li>
				<li>　　(3)主类的超类由高到低进行默认构造方法的调用。注意，在调用每一个超类的默认构造方法前，先进行对此超类进行非静态对象的初始化。</li>
				<li>　　(4)主类非静态成员的初始化。</li>
				<li>　　(5)调用主类的构造方法。</li>
		</ul>
		<p>　　<strong>3、关于构造方法</strong></p>
		<ul>
				<li>　　(1)类可以没有构造方法，但如果有多个构造方法，就应该要有默认的构造方法，否则在继承此类时，需要在子类中显式调用父类的某一个非默认的构造方法了。</li>
				<li>　　(2)在一个构造方法中，只能调用一次其他的构造方法，并且调用构造方法的语句必须是第一条语句。</li>
		</ul>
		<p>　　<strong>4、有关public、private和protected</strong></p>
		<ul>
				<li>　　(1)无public修饰的类，可以被其他类访问的条件是：a.两个类在同一文件中，b.两个类在同一文件夹中，c.两个类在同一软件包中。</li>
				<li>　　(2)protected：继承类和同一软件包的类可访问。</li>
				<li>　　(3)如果构造方法为private，那么在其他类中不能创建该类的对象。</li>
		</ul>
		<p>　　<strong>5、抽象类</strong></p>
		<ul>
				<li>　　(1)抽象类不能创建对象。</li>
				<li>　　(2)如果一个类中一个方法为抽象方法，则这个类必须为abstract抽象类。</li>
				<li>　　(3)继承抽象类的类在类中必须实现抽象类中的抽象方法。</li>
				<li>　　(4)抽象类中可以有抽象方法，也可有非抽象方法。抽象方法不能为private。</li>
				<li>　　(5)间接继承抽象类的类可以不给出抽象方法的定义。</li>
		</ul>
		<p>　　<strong>6、final关键字</strong></p>
		<ul>
				<li>　　(1)一个对象是常量，不代表不能转变对象的成员，仍可以其成员进行操作。</li>
				<li>　　(2)常量在使用前必须赋值，但除了在声明的同时初始化外，就只能在构造方法中初始化。</li>
				<li>　　(3)final修饰的方法不能被重置(在子类中不能出现同名方法)。</li>
				<li>　　(4)如果声明一个类为final，则所有的方法均为final，无论其是否被final修饰，但数据成员可为final也可不是。</li>
		</ul>
		<p>
				<strong>7、接口interface(用implements来实现接口)</strong>
		</p>
		<ul>
				<li>　　(1)接口中的所有数据均为static和final即静态常量。尽管可以不用这两个关键字修饰，但必须给常量赋初值。</li>
				<li>　　(2)接口中的方法均为public，在实现接口类中，实现方法必须可public关键字。</li>
				<li>　　(3)如果使用public来修饰接口，则接口必须与文件名相同。</li>
		</ul>
		<p>　　<strong>8、多重继承</strong></p>
		<ul>
				<li>　　(1)一个类继承了一个类和接口，那么必须将类写在前面，接口写在后面，接口之间用逗号分隔。</li>
				<li>　　(2)接口之间可多重继承，注意使用关键字extends。</li>
				<li>　　(3)一个类虽只实现了一个接口，但不仅要实现这个接口的所有方法，还要实现这个接口继承的接口的方法，接口中的所有方法均须在类中实现。</li>
		</ul>
		<p>　　<strong>9、接口的嵌入</strong></p>
		<ul>
				<li>　　(1)接口嵌入类中，可以使用private修饰。此时，接口只能在所在的类中实现，其他类不能访问。</li>
				<li>　　(2)嵌入接口中的接口一定要为public。</li>
		</ul>
		<p>　　<strong>10、类的嵌入</strong></p>
		<ul>
				<li>　　(1)类可以嵌入另一个类中，但不能嵌入接口中。</li>
				<li>　　(2)在静态方法或其他方法中，不能直接创建内部类对象，需通过手段来取得。</li>
		</ul>
		<p>　　手段有两种：</p>
		<p>
		</p>
		<p>
		</p>
		<table style="BORDER-RIGHT: rgb(204,204,204) 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: rgb(204,204,204) 1px dotted; BORDER-LEFT: rgb(204,204,204) 1px dotted; BORDER-BOTTOM: rgb(204,204,204) 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
				<tbody>
						<tr>
								<td bgcolor="#f3f3f3">
										<font face="Verdana">class A ...{<br />class B ...{}<br />B getB() ...{<br />B b = new B();<br />return b;  }<br />}<br />static void m() ...{<br /> A a = new A();<br />A.B ab = a.getB(); // 或者是 A.B ab = a.new B();  <br />}  </font>
								</td>
						</tr>
				</tbody>
		</table>
		<p>　　(3)一个类继承了另一个类的内部类，因为超类是内部类，而内部类的构造方法不能自动被调用，这样就需要在子类的构造方法中明确的调用超类的构造方法。接上例： <img height="16" alt="" src="http://219.232.114.72/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><img height="16" alt="" src="http://219.232.114.72/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" />class C extends A.B ...{</p>
		<p>
		</p>
		<p>
		</p>
		<table style="BORDER-RIGHT: rgb(204,204,204) 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: rgb(204,204,204) 1px dotted; BORDER-LEFT: rgb(204,204,204) 1px dotted; BORDER-BOTTOM: rgb(204,204,204) 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
				<tbody>
						<tr>
								<td bgcolor="#f3f3f3">
										<font face="Verdana">class C extends A.B ...{<br /> C() ...{<br /> new A().super(); // 这一句就实现了对内部类构造方法的调用。  <br />}  }  </font>
								</td>
						</tr>
				</tbody>
		</table>
		<p>　　构造方法也可这样写： </p>
		<p>
		</p>
		<p>
		</p>
		<table style="BORDER-RIGHT: rgb(204,204,204) 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: rgb(204,204,204) 1px dotted; BORDER-LEFT: rgb(204,204,204) 1px dotted; BORDER-BOTTOM: rgb(204,204,204) 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
				<tbody>
						<tr>
								<td bgcolor="#f3f3f3">
										<font face="Verdana">C(A a) ...{<br />a.super();<br />} // 使用这个构造方法创建对象，要写成C c = new C(a); a是A的对象。</font>
								</td>
						</tr>
				</tbody>
		</table>
		<p>　　<strong>11、异常类</strong></p>
		<p>　　JAVA中除了RunTimeException类，其他异常均须捕获或抛出。</p>
<img src ="http://www.blogjava.net/computerboy/aggbug/97446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/computerboy/" target="_blank">Computerboy</a> 2007-02-02 11:45 <a href="http://www.blogjava.net/computerboy/archive/2007/02/02/97446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目开发前的准备工作－－－编写跨平台注意事项</title><link>http://www.blogjava.net/computerboy/archive/2007/01/19/94928.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Fri, 19 Jan 2007 06:16:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2007/01/19/94928.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/94928.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2007/01/19/94928.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/94928.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/94928.html</trackback:ping><description><![CDATA[最近由于公司要开发最近的web和wap网站。<br /><br />前提：windows系统开发，linux 系统运行。<br /><br />没有办法，我采用的几本是一些开发的东西，<br />配置是这样的，数据库：Mysql 服务器：Tomcat＋Apache。系统：linux<br /><br />上网找了一些资料，主要就是关于跨平台的一些细节：<br /><br />1 程序设计的信息编码要注意，一般要采用 ASCII码字符集，并不是所有的操作系统都支持Unicode码。<br />  后来研究一下，还是UTF-8。<br /><br />2 程序中不要硬性编码与平台相关的任何常量，比如行分隔符、文件分隔符、路径分隔符等。<br />在unix和mac 中是“/”，在windows里是“\”。<br />如要用这些常量，要使用  Java.util.properties 类的getProperty 方法。<br />如： Java.util.properties.getProperty("file.seParator")<br />可以获得文件分隔符，getProperty("line.seParator") 返回行分隔符。<br />                    getProperty("path.seParator") 返回路径分隔符<br /><br />3 编写跨平台网络程序时，不要使用 Java.net.InetAddress类的getHostName方法得到主机名，<br />因为不同的平台的主机名格式不同。最好使用 getAddress得到格式相同的IP地址。另外，<br />程序中的所有的主机都要换成IP地址。<br /><br />4 如写GUI程序，在使用AWT组件时不能硬性设置组件的大小和为止，而应该使用JAVA的布局管理器(Layout manager)<br />  来设置。<br /><br />5 不同的操作系统，不同的机器，系统支持的颜色和屏幕的大小和分辨率都不同，如何获得这些属性，<br />使用 Java.awt.systemcolor 类可以获得需要的颜色，如该类的 inactiveCaption 就是窗口边框<br />活动标题背景色   Menu是菜单背景色，使用Java.awt.Tookit 的 getScreenResolution可以以<br />“像素每英寸”为单位显示分辨率。<br />该类 getScreenSize 可以得到屏幕大小(英寸), LoadSystemcolors 可以列出所有的系统颜色。<br /><br />6 程序中使用任何一个方法时，要详细查看文档，确保，使用的方法不是文档已经申明为过时的方法，<br />也不是文档中未标明的隐含方法。<img src ="http://www.blogjava.net/computerboy/aggbug/94928.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/computerboy/" target="_blank">Computerboy</a> 2007-01-19 14:16 <a href="http://www.blogjava.net/computerboy/archive/2007/01/19/94928.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR 下的脚本分页</title><link>http://www.blogjava.net/computerboy/archive/2006/11/01/78458.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Wed, 01 Nov 2006 05:23:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2006/11/01/78458.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/78458.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2006/11/01/78458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/78458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/78458.html</trackback:ping><description><![CDATA[DWR 下的脚本分页<br /><br />好久没有上来写东西，最近在写关于DWR的项目，出现了一点问题，就是脚本分页，在网上找了许久，都没有找到<br />所以还是动手写一个吧<br />呵呵！懒人没有办法　＾_＾ !<br /><br />首先是HTML，静态页，我在这就随便写一个吧。就是为了实现功能而已！这个页面是为了实现从数据库读出来<br />用户的相关信息，然后实现修改！<br /><br /><br />－－－－－－－－－－stone HTML start  -----------<br />&lt;html&gt;<br />&lt;head&gt;<br />  &lt;script type="text/javascript" language="javascript" src="../dwr/interface/UserService.js"&gt;&lt;/script&gt;<br />  &lt;script type="text/javascript" language="javascript" src="../dwr/interface/CorpService.js"&gt;&lt;/script&gt;<br />  &lt;script type="text/javascript" language="javascript" src="../dwr/interface/CopyrightService.js"&gt;&lt;/script&gt;<br />  &lt;script type="text/javascript" language="javascript" src="../dwr/interface/SearchEngine.js"&gt;&lt;/script&gt;<br />  &lt;script type="text/javascript" language="javascript" src="../dwr/engine.js"&gt;&lt;/script&gt;<br />  &lt;script type="text/javascript" language="javascript" src="../dwr/util.js"&gt;&lt;/script&gt;<br />  &lt;script type="text/javascript" language="javascript" src="../dwr/interface/BackstageService.js"&gt;&lt;/script&gt;<br />  &lt;script type="text/javascript" language="javascript" src="../dwr/interface/Backstage.js"&gt;&lt;/script&gt;<br />  &lt;script type="text/javascript" language="javascript" src="../dwr/interface/UserDbManager.js"&gt;&lt;/script&gt;<br />  &lt;script type="text/javascript" language="javascript" src="../dwr/interface/User.js"&gt;&lt;/script&gt;<br />  &lt;script type="text/javascript" language="javascript" src="report.js"&gt;&lt;/script&gt;<br />&lt;/head&gt;<br />&lt;body onload="init()"&gt;<br />&lt;table width="100%" border="0" cellspacing="2"&gt;<br />  &lt;tr&gt;<br />    &lt;td valign="top"&gt;<br />      &lt;div style="width:100%"; margin-top:-5px;"&gt;<br />      &lt;table width="100%" align="center" cellpadding="0"  cellspacing="0" border="0" bgcolor="#C3D9FF" style="margin-bottom:5px;"&gt;<br />       &lt;tr&gt;<br />         &lt;td&gt;<br />          &lt;div style="width:100%"&gt;<br />          &lt;table&gt;<br />            &lt;tr&gt;<br />             &lt;td&gt;<br />              &lt;div id="content-div" style="height:260px;"&gt;&lt;b style="font-weight:bold;color:green;"&gt;此处为用户操作&lt;/b&gt;&lt;br/&gt;<br />               &lt;table  border="1" class="rowed"&gt;<br />               &lt;thead&gt;<br />                &lt;tr&gt;<br />                   &lt;th&gt;用户名称&lt;/th&gt;<br />                   &lt;th&gt;用户邮箱&lt;/th&gt;<br />                   &lt;th&gt;手机&lt;/th&gt;<br />                   &lt;th colspan="2"&gt;操作&lt;/th&gt;<br />                &lt;/tr&gt;<br />               &lt;/thead&gt;<br />               &lt;tbody id="peoplebody"&gt;<br />               &lt;/tbody&gt;<br />               &lt;/table&gt;<br />              &lt;/div&gt;<br />            &lt;/table&gt;<br />            &lt;/div&gt;<br />          &lt;/table&gt;<br />         &lt;/div&gt;<br />        &lt;/table&gt;<br />&lt;div id="--copyright" class="copyright"&gt;&lt;/div&gt;<br />           &lt;div id="edit-user-div"  style="position:absolute; width:260px; border:solid 1px red; background-color:tomato; display:none;"&gt;<br />           &lt;div id="edit-user-div-content" style="width:100%;"&gt;&lt;/div&gt;<br />          &lt;hr/&gt;<br />           &lt;button onclick="editUser()"&gt;修改&lt;/button&gt;<br />            &lt;button onclick="$('edit-user-div').style.display='none';"&gt;取消&lt;/button&gt;<br />          &lt;/div&gt;<br />   <br />&lt;/body&gt;<br />&lt;/html&gt;          <br />        <br /><br /><br />－－－－－－－－－－－－－－stone  HTML end  ---------------------------------------<br /><br /><br />那么就开始真正的脚本实现了。由于DWR是静态和脚本联合的东西。那么我们在脚本要实现一个动态的LIST查询<br /><br />－－－－－－－－－－－－－－stone Script start-----------------------------<br /><br />function init() {<br /><br />  username = false;<br />  email = false;<br />  cellphone = false;<br />  if ($('--copyright') != null) {<br />    CopyrightService.get(function(data) {<br />      $('--copyright').innerHTML = data;<br />    });<br />  }<br /><br /><br />  BackstageService.getAllUsers(function(userList) {<br />    _corps=userList;<br />    _pageData=userList;<br />    var ttt='';<br />    var count=0;<br />    _page=1;<br />    var s = '';<br />    for (var user in userList) {<br />       count++;<br />      if(count&gt;10){<br />        continue;<br />      }<br /><br />      var u = userList[user];<br />      s += '&lt;tr&gt;&lt;td&gt;' + u.username + '&lt;/td&gt;';<br />      s += '&lt;td&gt;' + u.email + '&lt;/td&gt;';<br />      s += '&lt;td&gt;' + u.cellphone + '&lt;/td&gt;';<br />      s += '&lt;td&gt; &amp;nbsp; &lt;input type="button"value="修改" onclick="showEditDiv(\'' + u.username + '\',\'' + u.email + '\',\'' + u.cellphone + '\');"/&gt; '<br />              + '&lt;/td&gt;';<br />      s += '&lt;td&gt;  &amp;nbsp; &lt;input type="button"value="删除" onclick="delUser(\'' + u.username + '\');"/&gt;'<br />              + '&lt;/td&gt;';<br /><br />    }<br />    _pageCount=count;<br />    if(count==0){<br />      ttt='没有找到记录';<br />    }<br />    else{<br />      var tmp='&lt;div style="width:99%;font-size:9pt;text-align:right;"&gt;';<br />      if(count&gt;10){<br />        tmp +='第&lt;b style="color:green;"&gt;1&lt;/b&gt;页 共&lt;b&gt;'+(Math.ceil(_pageCount/10))+'&lt;/b&gt;页';<br />        tmp +='&amp;nbsp;&amp;nbsp;&amp;nbsp;';<br />        tmp +='&lt;a href="#" style="color:black;" onClick="showPage(2)"&gt;下页&lt;/a&gt;';<br />        tmp +='&amp;nbsp;&amp;nbsp;&amp;nbsp;';<br />        tmp +='&lt;a href="#" style="color:black;" onClick="showPage('+(Math.ceil(_pageCount/10))+')"&gt;末页&lt;/a&gt;';<br /><br />      }<br />        tmp +='&lt;/div&gt;';<br />        tmp +='&lt;div style="width:99%; font-size:10pt; text-align:right;"&gt;&lt;br/&gt;共&lt;b style="color:green;"&gt;'+count+'&lt;/b&gt;条记录';<br />        tmp +='&lt;/div&gt;';<br />        ttt +=tmp;<br />    }<br /><br />    var tb = $('peoplebody');<br />    tb.innerHTML = s;<br />    $('content-div').innerHTML=ttt;<br />  });<br /><br /><br />}<br /><br /><br /><br /><br />------------------下面是分页显示的脚本--------------------<br />function showPage(page){<br />  $('content-div').innerHTML='&lt;span style="color:gray;font-size:9pt;"&gt;载入中...&lt;/span&gt;';<br />  _page=page;<br />  var ttt='';<br />  var count=0;<br />  var total=Math.ceil(_pageCount/10);<br />  for(var no in _pageData){<br />    count++;<br />    if(count&gt;10*page||count&lt;=(page-1)*10){<br />      continue;<br />    }<br />  }<br />  var tmp ='&lt;div style="width:99%; font-size:9pt; text-align:right;"&gt;';<br />  if(page&gt;1){<br />    tmp +='&lt;a href="#" style="color:black;" onClick="showPage(1)"&gt;首页&lt;/a&gt;';<br />    tmp +='&amp;nbsp;&amp;nbsp;&amp;nbsp;';<br />    tmp +='&lt;a href="#" style="color:black;" onClick="showPage('+(page-1)+')"&gt;上页&lt;/a&gt;';<br />    tmp +='&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;';<br />  }<br />    tmp +='第&lt;b style="color:green;"&gt;'+_page+'&lt;/b&gt;页 共&lt;b&gt;'+total+'&lt;/b&gt;页';<br />    if(page&lt;total){<br />      tmp +='&amp;nbsp;&amp;nbsp;&amp;nbsp;';<br />      tmp +='&lt;a href="#" style="color:black;" onClick="showPage('+(page+1)+')"&gt;下页&lt;/a&gt;';<br />      tmp +='&amp;nbsp;&amp;nbsp;&amp;nbsp;';<br />      tmp +='&lt;a href="#" style="color:black;" onClick="showPage('+total+')"&gt;末页&lt;/a&gt;';<br /><br />    }<br />      tmp +='&lt;/div&gt;';<br />      tmp +='&lt;div style="width:99%;font-size:10pt;text-align:right;"&gt;&lt;br/&gt;共&lt;b style="color:green;"&gt;'+count+'&lt;/b&gt;条记录';<br />      tmp +='&lt;/div&gt;';<br />      ttt +=tmp;<br />     $('content-div').innerHTML=ttt;<br /><br /><br />}<br /><br /><br />由于我的实现是一个脚本的分页，所以并没有在后台或者JAVA上实现。这个是存脚本实现的DWR分页<br />技术有限，希望大家给予指点！　　<br />By:stone<br /><br /><br /><br /><br /><br />-----------------------------stone  end  -------------<img src ="http://www.blogjava.net/computerboy/aggbug/78458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/computerboy/" target="_blank">Computerboy</a> 2006-11-01 13:23 <a href="http://www.blogjava.net/computerboy/archive/2006/11/01/78458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些常用的Java问答</title><link>http://www.blogjava.net/computerboy/archive/2006/09/20/70697.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Wed, 20 Sep 2006 01:51:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2006/09/20/70697.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/70697.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2006/09/20/70697.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/70697.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/70697.html</trackback:ping><description><![CDATA[本文系转载，出处不明。<br /><br />虽然很基础，但是我觉得有必要贴一下，呵呵。谁都有忘记的时候么！希望对新手或者找工作的朋友有帮助！以后找到了在继续更新！<br /><br /><br /><br />1. 问：在JAVA与JSP中要调用一个LINUX上的脚本程序,或WINDOWS上的脚本程序,该怎么写？<br />答：System.getRuntime().exec("bash &lt; aaa.sh");<br /><br />2. 问：java中用什么表示双引号<br />答："""<br /><br />3. 问：如何在JSP程序里另起一个线程？<br />答：<br />JSP本身就是独立线程运行而不象CGI都是独立进程.<br />一般:<br />Thread t = new Thread("你的对象");<br />t.start();就可以了.<br />要求你这个对象要实现runnable接口或继承thread.<br /><br />4. 问：jsp如何获得客户端的IP地址？<br />答：<br />request.getRemoteAddr()<br />看看各个webserver的API文档说明，一般都有自带的，resin和tomcat都有<br /><br />5. 问：程序终止与输出终止<br />答：<br />程序中止:return;<br />输出中止out.close();这一句相当于ASP的response.end<br /><br />6. 问：jsp中如何得到上页的URL？<br />答：request.getHeader("referer");<br /><br />7. 问：提交网页的网页过期功能是怎么做的？<br />答：response.setHader("Expires","0");<br /><br />8. 问：在JSP网页中如何知道自已打开的页面的名称<br />答：<br />request.getRequestURI() ;//文件名<br />request.getRequestURL() ;//全部ＵＲＬ<br /><br />9. 问：提交表单后验证没有通过，返回提交页面，如何使原提交页面中的数据保留？<br />答：javascript的go(-1)可以把上页的表单内容重新显示出来,但password域没有<br /><br />10. 问：如何取得http的头信息？<br />答：request.getHader(headerName);<br /><br />11. 问：&amp;&amp;和&amp;的区别？<br />答：<br />&amp;&amp;是短路的与操作，也就是当地一个条件是false的时候，第二个条件不用执行<br />&amp;相反，两个条件总是执行。<br /><br />12. 问：将*以正弦曲线的一个周期显示出来<br />答：<br />public void paint(Graphics g)<br />{<br />for(int i=0;i&lt;200;i++)<br />g.drawString("*",i,(int)(Math.sin(i)*20)+50);<br />}<br />}<br /><br />13. 问：浮点数相乘后结果不精确如100.0 * 0.6 结果等于 60.0004<br />答：<br />这不叫错误,float和double是这样实现的.如果要精确计算，java提供了一个strictfp,它的计算遵循IEEE 754标准.而普通的float和double是由地平台浮点格式或硬件提供的额外精度或表示范围。<br /><br />14. 问：如何获得当前用的cursors的位置？<br />答：<br />int row = rs.getRow()就是当前指针行数,还有isFrist();isBeforeFist();isLast();isAfterLast();可以测试是不是在方法名所说的位置<br /><br />15. 问：表单成功提交了，点后退显示网页过期<br />答：<br />在&lt;head&gt;&lt;/head&gt;里面加以下代码<br />&lt;META HTTP-EQUIV="Pragma" CONTENT="no-cache"&gt; <br />&lt;META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"&gt; <br />&lt;META HTTP-EQUIV="Expires" CONTENT="0"&gt; <br />或者在表单页中加上<br />&lt;% <br />response.setHeader("Pragma","no-cache"); <br />response.setHeader("Cache-Control","no-cache"); <br />response.setDateHeader("Expires",0); <br />%&gt;<br /><br />16. 问：接口的简单理解<br />答：接口为了规范,比如我在接口中定义了一个方法:<br />getData()<br />这是用来从不同的数据库中取数据的,就是JDBC的实现对于用户,我不要知道每种数据库是如何做的,但我知道如何它们要实现这个接口就一定有这个方法可以供我调用.这样SUN就把这个接口给各个数据库开发商,让他们自己实现. 但为什么不用继承而用接口哩,因为继承只能从一个你类继承,而接口可以实现多个,就是说我实现的子类有多个规定好的接口中的功能. 这只是简单的理解,等你深入理解抽象的时候就知道抽象到抽象类时为什么还要再抽象到接口.<br /><br />17. 问：怎样编写一个取消按钮（怎样返回上一个页面，象工具栏的后退按钮）？<br />答：<br />javascript把每次浏览过的location都压到了一个栈中,这个栈就是history,然后你如果要回到第几个页面它就做几次POP操作,把最后POP出来的那个LOCATION给你. 这就是JAVASCRIPT在实现history.go(-x)的原理.<br /><br />18. 问：什么是回调？<br />答：<br />简单说,回调用不是让你去监听谁做完了什么事,而是谁做完了什么事就报告给你. 这就是回调用的思想.例子太多了,AWT的事件,SWING事件模型都是这样有. 还有多线程中,如果要控制线程数,不能总是查询每个线程是否结束,要在每个线程结束时让线程自己告诉主线程我结束了,你可以开新的线程了.<br /><br />19. 问：简要介绍一下compareTo方法<br />答：<br />compareTo方法是Comparable 接口必需实现的方法,只要实现Comparable 就可以用Arrays.srot()排序就象实现Runnable接口的run就能Thread()一样.<br /><br />20. 问：如何可以从别的Web服务器检索页, 然后把检索到的网页的HTML代码储存在一个变量中返回过来<br />答：这是一个简单的WEB ROBOT实现,用URL类实现从网页中抓内容,然后自己写一个分析程序从中找出新的URL,不断递归下去就行了.<br /><br />21. 问：applet中如何获得键盘的输入<br />答：application的System.in是当前系统的标准输入,applet因为安全的原因不可能读取当前系统(客户端)的标准输入,只能从它的ROOT组件的事件中,比如键盘事件中取得键值.<br /><br />22. 问：怎样计算代码执行所花费的时间？<br />答：<br />代码开始取时间，结束后取时间，相减<br />long t1 = System.currentTimeMillis();<br />///////////////// your code<br />long t2 = System.currentTimeMillis() ;<br />long time = t2-t1;<br /><br />23. 问：如何获在程序中获得一个文件的ContentType？<br />答：<br />URL u = new URL("file:///aaa.txt");<br />URLConnection uc = u.openConnection();<br />String s = uc.getContentType();<br /><br />24. 问：连接池的使用是建立很多连接池，还是一个连接池里用多个连接？<br />答：<br />只有在对象源不同的情况下才会发生多个池化,如果你只连一结一个数据源,永远不要用多个连结池. 所以连结池的初始化一定要做成静态的,而且应该在构造对象之前,也就是只有在类LOAD的时候,别的时候不应该有任何生成新的连结池的时候。<br /><br />25. 问：JavaMail要怎么安装？<br />答：下载两个包，一个是javamail包，另一个是jaf包。下载完直接把这两个包不解压加到CLASSPATH。<br /><br />26. 问：怎样把地址栏里的地址锁定？<br />答：把你的服务器的可访问目录索引选项关闭就行了,任何服务器都有一个conf文件,里面都有这个选项。<br /><br />27. 问：在JAVA中怎么取得环境变量啊。比如： TEMP = C：TEMP ？<br />答：String sss = System.getProperty(key)<br /><br />28. 问：怎样实现四舍五入，保留小数点后两位小数？<br />答：<br />import java.text.*;<br />...<br />NumberFormat nf=NumberFormat.getNumberInstance();<br />nf.setMaximumFractionDigits(2);<br />nf.setMinimumFractionDigits(2);<br />nf.format(numb);<br /><br />29. 问：Applet和form如何通信？<br />答：<br />取得的参数传到param里面<br />&lt;% <br />String xxx = request.getParameter("xxx"); <br />%&gt; <br />&lt;applet&gt; <br />&lt;param value="&lt;%=xxx%&gt;"&gt; <br />&lt;/applet&gt;<br /><br /><br />30. 问：java-plug-in是什么？<br />答：Java Runtime Environment的插件。用来运行java程序。不需要什么特别的设置。等于你的机器里面有了jvm。<br /><br />31. 问：WEB上面怎么样连接上一个EXCEL表格？<br />答：<br />定义页面得contentType="application/vnd.ms-excel"，让页面以excel得形式打开。同样也可以以word得形式打开：application/msword。<br /><br />32. 问：怎样才能避免textarea字数限制？<br />答：是使用了FORM的默认方法的缘故,如果什么也不写默认是GET改用Post即可，在Form中定义mothod="post"。<br /><br />33. 问：为什么加了&lt;%@page contentType="text/html;charset=gb2312" %&gt;插入数据库的中文，依然是乱码？<br />答：<br />这要从环境看,能显示说明你的JSP引擎没有问题,但写入数据库时你的JDBC能不能处理中文,同一公司不同版本的JDBC都有支持中文和不支持中文的情况,RESIN自带的MYSQL JDBC就不支持,MM的就支持,还有你的数据库类型是否支持中文?CHAR的一般支持,但是否用binary存储双字节码<br /><br />34. 问：对于JFrame，hide()，show()与setVisibel()有什么区别吗？<br />答：<br />setVisible()从Component继承过来，而hide(),show()从Window里面继承过来。<br />Makes the Window visible. If the Window and/or its owner are not yet displa yable, both are made displayable. The Window will be validated prior to being made visible. If t he Window is already visible, this will bring the Window to the front. 区别在这。<br />36. 问：sendRedirect为什么不可以转到mms协议的地址的？response.sendRedirect("mms://missiah.adsldns.org:9394");<br />答：java平台目前实现的protocol中并没有mms,你可以取系统属性java.protocol.handler.pkgs看看它的值中有没有mms,所以如果要想重定向到mms://host这样和URL,只有生成客户端的JAVASCRIPT让它来重定向<br /><br />37. 问：JTable中怎样定义各个Columns和Width和怎样设置表格的内容靠做靠右或居中？<br />答：<br />TableColumn tc = table.getColumn("Name");//取得列名为"Name"的列Handle<br />int currentWidth = tc.getPreferredWidth(); //取得该列当前的宽度<br />tc.setPreferredWidth(200); //设置当前列宽<br />tc.setMaxWidth(200); //设置该列最大宽度<br />tc.setMinWidth(50); //设置该列最小宽度<br /><br />38. 问：批操作是否可用于select语句？<br />答：批操作其实是指成批理更新的操作,绝对不可能用于select操作。<br /><br />39. 问：为什么jsp路径太深文件名太长就无法读取文件？<br />答：path不能超过255长度,不然就找不到了.这是作业系统的事。<br /><br />40. 问：如何让页面不保留缓存？<br />答：<br />&lt;% <br />response.setHeader("Pragma","No-cache"); <br />response.setHeader("Cache-Control","no-cache"); <br />response.setDateHeader("Expires", 0); <br />%&gt;<br /><br />41. 问：我的applet code 中用到jbutton 时就出错是否由于ie不支持swing package 请问应怎么办？<br />答：JBUTTON是SWING基本包啊,只要把jdk/jre/lib/rt.jar放在classpath就行了.不要加载任何别的库。<br /><br />42. 问：不知道java是否支持midi格式，如果支持，应该怎么把wave格式转换成midi格式？<br />答：目前还不行,可以看一下JMF三个版中对MIDI的格式支持是read only,而WAVE是read/write,MIDI只能播放,不能生成。<br /><br />43. 问：在jsp里面防止用户直接输入url进去页面，应该怎么做呢？<br />答：<br />一是从web服务器控制,对某一目录的所有访问要通过验证.<br />二是在要访问的页面中加入控制.这个一般用session,也可以用请求状态码实现<br /><br />44. 问：<br />例如后台有一计算应用程序（此程序运算起来很慢，可持续几分钟到几小时，这不管，主要是能激活它），客户机讲任务提交后，服务器对任务进行检测无误后将向服务器后台程序发送信息，并将其激活。要求如下：<br />1）首先将后台程序激活，让它执行此任务（比如，前台将计算的C代码提交上后，后台程序程序能马上调用，并将其运行）<br />2）要在前台JSP页面中显示运行过程信息（由于运行时间长，希望让客户看到运行过程中产生的信息）如何完成？<br /><br />答：<br />活是可以的,运行一个shell让它去运行后台就行,但不可能取出运行信息,因为HTTP的超时限制不可能永远等你后台运行的,而且信息如果要动态实时推出来就得用SERVER PUSH技术。<br /><br />45. 问：数据库是datetime 型 ，插入当前时间到数据库？<br />答：<br />java.sql.Date sqlDate = new java.sql.Date();<br />PreparedStatement pstmt = conn.prepareStatement("insert into foo(time) values(?)");<br />pstmt.setDate(1,sqlDate);<br />pstmt.executeUpdate();<br /><br />46. 问：怎样去掉字符串前后的空格。<br />答：String.trim()<br /><br />47. 问：session怎样存取int类型的变量？<br />答：<br />session.setAttribute("int", i+"");<br />int i = Integer.parseInt(session.getAttribute("int"));<br /><br />48. 问：在javascript中如何使输出的float类型的数据保留两位小数。<br />答：Math.round(aaaaa*100)/100。<br /><br />49. 问：在bean种如何调用session<br />答：<br />你可把session对象作为一个参数传给bean<br />在BEAN中定义HttpServletRequest request;HttpSession session;<br />然后<br />session = request.getSession(false);<br />false为如果session为空,不建立新的session<br />将session作为参数传入.其实只要将request传入就可以<br /><br />50. 问：如何把txt或word文件按原格式显示在jsp页面或servlet上？<br />答：<br />其实一个非常简单的解决方法就是在服务器的MIME中指点定TEXT和WORD的解释方式,然后用JSP或SERVLET生成它就行了,客户端就会自动调用相应程序打开你的文档。<br />如果是希望按原格式的显示在页面上，而不是调用其他程序打开那么你可以试试用WEBDEV协议,可以说这是MS的一个亮点.它是在WEB方式下打开文档,和共享一样.完全符合的要求。<br /><br />51. 问：object的clone方法为什么不能直接调用？<br />答：<br />这个方法在object中是protected<br />为什么要把这个方法定义为protected,这是一个折中,它的目的是想知道你这个方法在Object里只是一个标记,而不是一个实现,比如<br /><br />public class Object<br />{<br /><br />.............<br />protected Object clone()<br />{}<br />}<br /><br />所以直接继承的clone()方法并不能做任何时,你要使用这个方法就要重载这个方法并放宽访问权限为public,或实现cloneable接口. 但它没法这样告诉你它没有真的实现,只好用protected 方法加以警示<br /><br />52. 问：一个页面中如何刷新另外一个页面？<br />答：<br />要求是这些面页必须有关联,一是它们都有一个共同的顶层帧,也就是说是一个帧内的分级页面,当然可以是任意级,帧内再分帧也可以,另一个可能是当前窗口弹出的窗口,如果没有联系,那就不可能用一个页面刷新另一个页面. 帧内只要一级一级引用就行了. 比如在左帧中一个页面中写top.right.location.reload();那么名为right的右帧中的页面就会刷新. 弹出的一样,用open时的名称刷新子窗口,子窗口用opener刷新主窗口<br /><br />53. 问：如何在jsp中怎么样向客户端写cookies？<br />答：<br />Cookie coo = new Cookie(name, value);<br />HttpServletResponse.addCookie(name);<br /><br />54. 问：为什么jTextField1.setText("aaabbb");jTextField2.setText("AAABBB"); 得到的字体宽度不一样？<br />答：就是说如果不是指定为等宽字体,每个字体的宽度都是不一样的.因此JAVA中用FontMetrics 类来取字符宽度。<br /><br />55. 问：String kk=application/octet-stream; name="G:/SMBCrack.exe";如何得到SMBCrack.exe？<br />答：<br />这应该是解析上传时候的二进制流得到的这一行里面格式是固定的，取到name="后面的字符串，然后把";去掉。然后取最后一个/后面的所有字符组成一个新字符串就行了。<br /><br />56. 问：如何传值并不刷新页面？<br />答：<br />弹出一个页面进行值的选择或者输入，ok后使用将值传给原窗口，使用javascript关闭打开的窗口即可：<br />window.close();opener.focus();<br /><br />57. 问：有一个字符串："EF0C114EA4"，如何变为a[0] = 0xEF a[1] = 0x0C a[2] = 0x11 a[3] = 0x4E a[4] = 0xA4？<br />答：<br />String str="EF0C114EA4F";<br />out.print(str+"&lt;br&gt;");<br />int l=str.length()/2+str.length()%2,j=0,k=0;<br />String[] a=new String[l];<br />for(int i=0;i&lt;l;i++){<br />if(str.length()-j==1)<br />k=str.length();<br />else<br />k=j+2;<br />a="0x"+str.substring(j,k);<br />out.print("a["+Integer.toString(i)+"]="+a+"&lt;br&gt;");<br />j+=2;<br />}<br /><br />58. 问：怎样将一个int转换成一个四字节的byte数组？<br />答：<br />int x = 1234567;<br />byte[] b = new byte[4];<br />for(int i=0;i&lt;b.length;i++)<br />{<br />b = (x &gt;&gt;( i*8)) &amp; 0xFF;<br />}<br /><br />59. 问：indexOf()的使用需要注意什么？<br />答：参数是指从第几位（1，2，3，...）开始搜索，而返回值是指搜索到的位置（0，1，2，3.......）注意是从零算起的。<br /><br />60. 问：在Java应用程序中如何动态的添加一个按钮？<br />答：<br />这里涉及一个组件重绘的问题,组件要先于panel被显示之处存在,如果一panel已经显示了,那么加在上面你能看到吗?但如果在同一个panel上, 先有button A,假如按下它加了butt on B,这时你如果使整个panel重给,那么A本身要重绘,它的事件监听就没有了,当然也就加不成B了,所以如果要先有另一个panel,当按A时把B加在这个panel上并重绘这个paenl,其实更好的方法是先把B加在panel中,同一个也行.把它setVisiable(flase),按A时设为 true。<br /><br />61. 问：book mybook=new book(bookid);book是servlet,出错。<br />答：<br />book是servlet,能book mybook=new book(bookid);<br />说明自己实现了servlet容器?不然,servlet能让你自己去调用? servlet如果调用其实和EJB连1%的区别都没有,它们都是自己继承或实现一些接口,在这些父类或接口中实现了如果和容器"打交道"的方法,然后容器调用这些方法来管理它,让它生成实例,池化,钝化,销毁,再生等.所以这样写是错误的。<br /><br />62. 问：给定一个字符串5*(5+9)/7怎样计算出结果？<br />答：<br />可有两种方法<br />1。用堆栈完成<br />2。最简单的方法，不用编程，如果有任何一个数据库的化，用select (5*(5+9)/7) from oneTable<br /><br />63. 问：如何实现递交表单内容的加密解密？<br />答：<br />如果你用IE目前只能用SSL协议,这一层不要你考虑,否则只你用你自己的工具加密传输,接收后再解密友,至于如何加解,如果要和公认的系统结合,就用通用的MD5,RAS等公开算法,如果你只是自己传自己解,你随便按你的想法把数据加上一些东西,取回来按规则减掉这些东西,我敢保证除你自己没有任何人能知道解密方法.<br /><br />64. 问：为什么Integer.parseInt("+1");会抛出NumberFormatException的异常？<br />答：因为"+"运行算在JAVA中被重载.系统无法确定你用的是算术加还是字符+。<br />这一点可以在JAVASCRIPT中更好地理解:<br />&lt;form name="t"&gt;&lt;input name=s value=1234&gt;&lt;/form&gt;<br />var a = document.t.s.value+1;<br />这时a = 12345,因为document.t.s.value作为字符串.但var a = document.t.s.value-1;<br />a 就是1233,因为系统知道-运算肯定是算术运行.所以把document.t.s.value转换成数字.<br /><br /><br />65. 问：hashCode() 有什么用为什么有时候需要覆盖Object里的hashcode()方法？<br />答：这就是这个对象的身份证啊,要不如何区分哪个对象。<br /><br />66. 问：怎样在tomcat中实现一个定时执行的东东？<br />答：<br />在应用程序启动时自动运行。servlet2.3中定义了ServletListener,监听Servlet Con text的启动或则关闭（可在配置文件中配置），启动时触发一个守护程序的运行(可以实现java.util.Timer或则 javax.swing.Timer).<br /><br />67. 问：程序可以输出自己吗？<br />答：孔德悖论这个非常有名的法则.就是说任何程序都不可能输出自己.<br /><br /><br />68. 问：能够把字符转化成ASCII码？比如将 A 转化成 65？<br />答：<br />int a='A';<br />out.println(a);<br /><br />69. 问：如何区分输入的文字中的全角与半角？<br />答：由于不能分辨出全角和半角字符的值有什么规律,只好把全角符号牧举出来了.<br /><br />70. 问：用户注册后的自动发信程序该怎么做？<br />答：<br />这种发信程序不考虑性能,因为不可能1秒就有一个人注册,我们说的考虑性能的发信程序是指上百万封信在队列里要不停发送的那种,象你这个随便怎么写一个程序都行,没有必要用JAVAMAIL.只要指定一个发信的服务器然后用cocket连它的25口就行了.自己用SOCKET连SMTP的25口发一封信就好象两个邻居之间送一样东西,直接递过去得了,用JAVAMAIL,消息机制就是你把这个东西从邮局寄给你的邻居了.<br /><img src ="http://www.blogjava.net/computerboy/aggbug/70697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/computerboy/" target="_blank">Computerboy</a> 2006-09-20 09:51 <a href="http://www.blogjava.net/computerboy/archive/2006/09/20/70697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>面向 Java 开发人员的 Ajax: 构建动态的 Java 应用程序</title><link>http://www.blogjava.net/computerboy/archive/2006/09/15/69986.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Fri, 15 Sep 2006 15:27:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2006/09/15/69986.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/69986.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2006/09/15/69986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/69986.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/69986.html</trackback:ping><description><![CDATA[本文系转载！<br /><br />面向 Java 开发人员的 Ajax: 构建动态的 Java 应用程序<br /><br /><br /><br />在 Web
应用程序开发中，页面重载循环是最大的一个使用障碍，对于 Java 开发人员来说也是一个严峻的挑战。Ajax（异步 JavaScript 和
XML）是一种编程技术，它允许为基于 Java 的 Web 应用程序把 Java 技术、XML 和 JavaScript
组合起来，从而打破页面重载的范式。<br />Ajax（即异步 JavaScript 和 XML）是一种 Web
应用程序开发的手段，它采用客户端脚本与 Web 服务器交换数据。所以，不必采用会中断交互的完整页面刷新，就可以动态地更新 Web 页面。使用
Ajax，可以创建更加丰富、更加动态的 Web 应用程序用户界面，其即时性与可用性甚至能够接近本机桌面应用程序。<br /><br />Ajax
不是一项技术，而更像是一个 模式 —— 一种识别和描述有用的设计技术的方式。Ajax 是新颖的，因为许多开发人员才刚刚开始知道它，但是所有实现
Ajax 应用程序的组件都已经存在若干年了。它目前受到重视是因为在 2004 和 2005 年出现了一些基于 Ajax 技术的非常棒的动态
Web UI，最著名的就是 Google 的 GMail 和 Maps 应用程序，以及照片共享站点
Flickr。这些用户界面具有足够的开创性，有些开发人员称之为“Web 2.0”，因此对 Ajax 应用程序的兴趣飞速上升。<br /><br />在这
个系列中，我将提供使用 Ajax 开发应用程序需要的全部工具 。在第一篇文章中，我将解释 Ajax 背后的概念，演示为基于 Java 的
Web 应用程序创建 Ajax 界面的基本步骤。我将使用代码示例演示让 Ajax 应用程序如此动态的服务器端 Java 代码和客户端
JavaScript。最后，我将指出 Ajax 方式的一些不足，以及在创建 Ajax 应用程序时应当考虑的一些更广的可用性和访问性问题。<br /><br />更好的购物车<br /><br />可
以用 Ajax 增强传统的 Web
应用程序，通过消除页面装入从而简化交互。为了演示这一点，我采用一个简单的购物车示例，在向里面添加项目时，它会动态更新。这项技术如果整合到在线商
店，那么用户可以持续地浏览和向购物车中添加项目，而不必在每次点击之后都等候完整的页面更新。虽然这篇文章中的有些代码特定于购物车示例，但是演示的技
术可以应用于任何 Ajax 应用程序。清单 1 显示了购物车示例使用的有关 HTML 代码，整篇文章中都会使用这个 HTML。<br /><br /><br />清单1. 购物车示例的有关片断<br /><br />&lt;!-- Table of products from store's catalog, one row per item --&gt;<br />&lt;th&gt;Name&lt;/th&gt; &lt;th&gt;Description&lt;/th&gt; &lt;th&gt;Price&lt;/th&gt; &lt;th&gt;&lt;/th&gt;<br />...<br />&lt;tr&gt;<br />  &lt;!-- Item details --&gt;<br />  &lt;td&gt;Hat&lt;/td&gt; &lt;td&gt;Stylish bowler hat&lt;/td&gt; &lt;td&gt;$19.99&lt;/td&gt;<br />  &lt;td&gt;<br />    &lt;!-- Click button to add item to cart via Ajax request --&gt;<br />    &lt;button onclick="addToCart('hat001')"&gt;Add to Cart&lt;/button&gt;<br />  &lt;/td&gt;<br />&lt;/tr&gt;<br />...<br /><br />&lt;!-- Representation of shopping cart, updated asynchronously --&gt;<br />&lt;ul id="cart-contents"&gt;<br /><br />  &lt;!-- List-items will be added here for each item in the cart --&gt;<br />  <br />&lt;/ul&gt;<br /><br />&lt;!-- Total cost of items in cart displayed inside span element --&gt;<br />Total cost: &lt;span id="total"&gt;$0.00&lt;/span&gt;<br /><br /><br /><br />Ajax 往返过程<br /><br />Ajax
交互开始于叫作 XMLHttpRequest 的 JavaScript 对象。顾名思义，它允许客户端脚本执行 HTTP 请求，并解析 XML
服务器响应。Ajax 往返过程的第一步是创建 XMLHttpRequest 的实例。在 XMLHttpRequest 对象上设置请求使用的
HTTP 方法（GET 或 POST）以及目标 URL。<br /><br />现在，您还记得 Ajax 的第一个 a
是代表异步（asynchronous） 吗？在发送 HTTP
请求时，不想让浏览器挂着等候服务器响应。相反，您想让浏览器继续对用户与页面的交互进行响应，并在服务器响应到达时再进行处理。为了实现这个要求，可以
在 XMLHttpRequest 上注册一个回调函数，然后异步地分派
XMLHttpRequest。然后控制就会返回浏览器，当服务器响应到达时，会调用回调函数。<br /><br />在 Java Web 服务器上，请求同其他 HttpServletRequest 一样到达。在解析了请求参数之后，servlet 调用必要的应用程序逻辑，把响应序列化成 XML，并把 XML 写入 HttpServletResponse。<br /><br />回到客户端时，现在调用注册在 XMLHttpRequest 上的回调函数，处理服务器返回的 XML 文档。最后，根据服务器返回的数据，用 JavaScript 操纵页面的 HTML DOM，把用户界面更新。图 1 是 Ajax 往返过程的顺序图。<br /><br /><br />图 1. Ajax 往返过程<br /><br /><br />现在您对 Ajax 往返过程有了一个高层面的认识。下面我将放大其中的每一步骤，进行更详细的观察。如果过程中迷了路，请回头看图 1 —— 由于 Ajax 方式的异步性质，所以顺序并非十分简单。<br /><br />分派 XMLHttpRequest<br /><br />我
将从 Ajax 序列的起点开始：创建和分派来自浏览器的 XMLHttpRequest。不幸的是，不同的浏览器创建 XMLHttpRequest
的方法各不相同。清单 2 的 JavaScript
函数消除了这些依赖于浏览器的技巧，它可以检测当前浏览器要使用的正确方式，并返回一个可以使用的
XMLHttpRequest。最好是把它当作辅助代码：只要把它拷贝到 JavaScript 库，并在需要 XMLHttpRequest
的时候使用它就可以了。<br /><br /><br />清单 2. 创建跨浏览器的 XMLHttpRequest<br /><br />/*<br /> * Returns a new XMLHttpRequest object, or false if this browser<br /> * doesn't support it<br /> */<br />function newXMLHttpRequest() {<br /><br />  var xmlreq = false;<br /><br />  if (window.XMLHttpRequest) {<br /><br />    // Create XMLHttpRequest object in non-Microsoft browsers<br />    xmlreq = new XMLHttpRequest();<br /><br />  } else if (window.ActiveXObject) {<br /><br />    // Create XMLHttpRequest via MS ActiveX<br />    try {<br />      // Try to create XMLHttpRequest in later versions<br />      // of Internet Explorer<br /><br />      xmlreq = new ActiveXObject("Msxml2.XMLHTTP");<br /><br />    } catch (e1) {<br /><br />      // Failed to create required ActiveXObject<br /><br />      try {<br />        // Try version supported by older versions<br />        // of Internet Explorer<br /><br />        xmlreq = new ActiveXObject("Microsoft.XMLHTTP");<br /><br />      } catch (e2) {<br /><br />        // Unable to create an XMLHttpRequest with ActiveX<br />      }<br />    }<br />  }<br /><br />  return xmlreq;<br />}<br /><br />  <br /><br /><br />稍后我将讨论处理那些不支持 XMLHttpRequest 的浏览器的技术。目前，示例假设清单 2 的 newXMLHttpRequest 函数总能返回 XMLHttpRequest 实例。<br /><br />返
回示例的购物车场景，我想要当用户在目录项目上点击 Add to Cart 时启动 Ajax 交互。名为 addToCart() 的
onclick 处理函数负责通过 Ajax 调用来更新购物车的状态（请参阅 清单 1）。正如清单 3 所示，addToCart()
需要做的第一件事是通过调用清单 2 的 newXMLHttpRequest() 函数得到 XMLHttpRequest
对象。接下来，它注册一个回调函数，用来接收服务器响应（我稍后再详细解释这一步；请参阅 清单 6）。<br /><br />因为请求会修改服务器上的状态，
所以我将用 HTTP POST 做这个工作。通过 POST 发送数据要求三个步骤。第一，需要打开与要通信的服务器资源的 POST 连接 ——
在这个示例中，服务器资源是一个映射到 URL cart.do 的 servlet。然后，我在 XMLHttpRequest
上设置一个头，指明请求的内容是表单 编码的数据。最后，我用表单编码的数据作为请求体发送请求。<br /><br />清单 3 把这些步骤放在了一起。<br /><br /><br />清单 3. 分派 Add to Cart XMLHttpRequest<br /><br />/*<br /> * Adds an item, identified by its product code, to the shopping cart<br /> * itemCode - product code of the item to add.<br /> */<br />function addToCart(itemCode) {<br /><br />  // Obtain an XMLHttpRequest instance<br />  var req = newXMLHttpRequest();<br /><br />  // Set the handler function to receive callback notifications<br />  // from the request object<br />  var handlerFunction = getReadyStateHandler(req, updateCart);<br />  req.onreadystatechange = handlerFunction;<br />  <br />  // Open an HTTP POST connection to the shopping cart servlet.<br />  // Third parameter specifies request is asynchronous.<br />  req.open("POST", "cart.do", true);<br /><br />  // Specify that the body of the request contains form data<br />  req.setRequestHeader("Content-Type", <br />                       "application/x-www-form-urlencoded");<br /><br />  // Send form encoded data stating that I want to add the <br />  // specified item to the cart.<br />  req.send("action=add&amp;item="+itemCode);<br />}<br /><br /><br /><br /><br />这就是建立 Ajax 往返过程的第一部分，即创建和分派来自客户机的 HTTP 请求。接下来是用来处理请求的 Java servlet 代码。<br /><br /><br />servlet 请求处理<br /><br />用
servlet 处理 XMLHttpRequest，与处理普通的浏览器 HTTP 请求一样。可以用
HttpServletRequest.getParameter() 得到在 POST 请求体中发送的表单编码数据。Ajax
请求被放进与来自应用程序的常规 Web 请求一样的 HttpSession
中。对于示例购物车场景来说，这很有用，因为这让我可以把购物车状态封装在 JavaBean 中，并在请求之间在会话中维持这个状态。<br /><br />清
单 4 是处理 Ajax 请求、更新购物车的简单 servlet 的一部分。Cart bean
是从用户会话中获得的，并根据请求参数更新它的状态。然后 Cart 被序列化成 XML，XML 又被写入
ServletResponse。重要的是把响应的内容类型设置为 application/xml，否则 XMLHttpRequest
不会把响应内容解析成 XML DOM。<br /><br /><br />清单 4. 处理 Ajax 请求的 servlet 代码<br /><br />public void doPost(HttpServletRequest req, HttpServletResponse res)<br />                        throws java.io.IOException {<br /><br />  Cart cart = getCartFromSession(req);<br /><br />  String action = req.getParameter("action");<br />  String item = req.getParameter("item");<br />  <br />  if ((action != null)&amp;&amp;(item != null)) {<br /><br />    // Add or remove items from the Cart<br />    if ("add".equals(action)) {<br />      cart.addItem(item);<br /><br />    } else if ("remove".equals(action)) {<br />      cart.removeItems(item);<br /><br />    }<br />  }<br /><br />  // Serialize the Cart's state to XML<br />  String cartXml = cart.toXml();<br /><br />  // Write XML to response.<br />  res.setContentType("application/xml");<br />  res.getWriter().write(cartXml);<br />}<br /><br /><br /><br /><br />清单 5 显示了 Cart.toXml() 方法生成的示例 XML。它很简单。请注意 cart 元素的 generated 属性，它是 System.currentTimeMillis() 生成的一个时间戳。<br /><br /><br />清单 5. Cart 对象的XML 序列化示例<br /><br />&lt;?xml version="1.0"?&gt;<br />&lt;cart generated="1123969988414" total="$171.95"&gt;<br />  &lt;item code="hat001"&gt;<br />    &lt;name&gt;Hat&lt;/name&gt;<br />    &lt;quantity&gt;2&lt;/quantity&gt;<br />  &lt;/item&gt;<br />  &lt;item code="cha001"&gt;<br />    &lt;name&gt;Chair&lt;/name&gt;<br />    &lt;quantity&gt;1&lt;/quantity&gt;<br />  &lt;/item&gt;<br />  &lt;item code="dog001"&gt;<br />    &lt;name&gt;Dog&lt;/name&gt;<br />    &lt;quantity&gt;1&lt;/quantity&gt;<br />  &lt;/item&gt;<br />&lt;/cart&gt;<br /><br /><br /><br /><br />如果查看应用程序源代码（可以从 下载 一节得到）中的 Cart.java，可以看到生成 XML 的方式只是把字符串添加在一起。虽然对这个示例来说足够了，但是对于从 Java 代码生成 XML 来说则是最差的方式。我将在这个系列的下一期中介绍一些更好的方式。<br /><br />现在您已经知道了 CartServlet 响应 XMLHttpRequest 的方式。下一件事就是返回客户端，查看如何用 XML 响应更新页面状态。<br /><br /><br />用 JavaScript 进行响应处理<br /><br />XMLHttpRequest
的 readyState 属性是一个数值，它指出请求生命周期的状态。它从 0（代表“未初始化”）变化到 4（代表“完成”）。每次
readyState 变化时，readystatechange 事件就触发，由 onreadystatechange
属性指定的事件处理函数就被调用。<br /><br />在 清单 3 中已经看到了如何调用 getReadyStateHandler()
函数创建事件处理函数。然后把这个事件处理函数分配给 onreadystatechange 属性。getReadyStateHandler()
利用了这样一个事实：函数是 JavaScript
中的一级对象。这意味着函数可以是其他函数的参数，也可以创建和返回其他函数。getReadyStateHandler()
的工作是返回一个函数，检查 XMLHttpRequest 是否已经完成，并把 XML 响应传递给调用者指定的事件处理函数。清单 6 是
getReadyStateHandler() 的代码。<br /><br /><br />清单 6. getReadyStateHandler() 函数<br /><br />/*<br /> * Returns a function that waits for the specified XMLHttpRequest<br /> * to complete, then passes its XML response to the given handler function.<br /> * req - The XMLHttpRequest whose state is changing<br /> * responseXmlHandler - Function to pass the XML response to<br /> */<br />function getReadyStateHandler(req, responseXmlHandler) {<br /><br />  // Return an anonymous function that listens to the <br />  // XMLHttpRequest instance<br />  return function () {<br /><br />    // If the request's status is "complete"<br />    if (req.readyState == 4) {<br />      <br />      // Check that a successful server response was received<br />      if (req.status == 200) {<br /><br />        // Pass the XML payload of the response to the <br />        // handler function<br />        responseXmlHandler(req.responseXML);<br /><br />      } else {<br /><br />        // An HTTP problem has occurred<br />        alert("HTTP error: "+req.status);<br />      }<br />    }<br />  }<br />}<br /><br /><br /><br />HTTP 状态码<br /><br />在
清单 6 中，检查 XMLHttpRequest 的 status 属性以查看请求是否成功完成。status 包含服务器响应的 HTTP
状态码。在执行简单的 GET 和 POST 请求时，可以假设任何大于 200 （OK）的码都是错误。如果服务器发送重定向响应（例如 301 或
302），浏览器会透明地进行重定向并从新的位置获取资源；XMLHttpRequest 看不到重定向状态码。而且，浏览器会自动添加
Cache-Control: no-cache 头到所有 XMLHttpRequest，这样客户代码永远也不用处理
304（未经修改）服务器响应。<br /><br /><br />关于 getReadyStateHandler()<br /><br />getReadyStateHandler()
是段相对复杂的代码，特别是如果您不习惯阅读 JavaScript 的话。但是通过把这个函数放在 JavaScript 库中，就可以处理
Ajax 服务器响应，而不必处理 XMLHttpRequest 的内部细节。重要的是要理解如何在自己的代码中使用
getReadyStateHandler()。<br /><br />在 清单 3 中看到了 getReadyStateHandler()
像这样被调用：handlerFunction = getReadyStateHandler(req,
updateCart)。在这个示例中，getReadyStateHandler() 返回的函数将检查在 req 变量中的
XMLHttpRequest 是否已经完成，然后用响应的 XML 调用名为 updateCart 的函数。<br /><br />提取购物车数据<br /><br />清
单 7 是 updateCart() 本身的代码。函数用 DOM 调用检查购物车的 XML 文档，然后更新 Web 页面（请参阅 清单
1），反映新的购物车内容。这里的重点是用来从 XML DOM 提取数据的调用。cart 元素的 generated 属性是在 Cart
序列化为 XML 时生成的一个时间戳，检查它可以保证新的购物车数据不会被旧的数据覆盖。Ajax
请求天生是异步的，所以这个检查可以处理服务器响应未按次序到达的情况。<br /><br /><br />清单 7. 更新页面，反映购物车的 XML 文档<br /><br />function updateCart(cartXML) {<br /><br /> // Get the root "cart" element from the document<br /> var cart = cartXML.getElementsByTagName("cart")[0];<br /><br /> // Check that a more recent cart document hasn't been processed<br /> // already<br /> var generated = cart.getAttribute("generated");<br /> if (generated &gt; lastCartUpdate) {<br />   lastCartUpdate = generated;<br /><br />   // Clear the HTML list used to display the cart contents<br />   var contents = document.getElementById("cart-contents");<br />   contents.innerHTML = "";<br /><br />   // Loop over the items in the cart<br />   var items = cart.getElementsByTagName("item");<br />   for (var I = 0 ; I &lt; items.length ; I++) {<br /><br />     var item = items[I];<br /><br />     // Extract the text nodes from the name and quantity elements<br />     var name = item.getElementsByTagName("name")[0]<br />                                               .firstChild.nodeValue;<br />                                               <br />     var quantity = item.getElementsByTagName("quantity")[0]<br />                                               .firstChild.nodeValue;<br /><br />     // Create and add a list item HTML element for this cart item<br />     var li = document.createElement("li");<br />     li.appendChild(document.createTextNode(name+" x "+quantity));<br />     contents.appendChild(li);<br />   }<br /> }<br /><br /> // Update the cart's total using the value from the cart document<br /> document.getElementById("total").innerHTML = <br />                                          cart.getAttribute("total");<br />}<br /><br /><br /><br /><br />到
此，整个 Ajax 往返过程完成了，但是您可能想让 Web 应用程序运行一下查看实际效果（请参阅
下载一节）。这个示例非常简单，有很多需要改进之处。例如，我包含了从购物车中清除项目的服务器端代码，但是无法从 UI
访问它。作为一个好的练习，请试着在应用程序现有的 JavaScript 代码之上构建出能够实现这个功能的代码。<br /><br />使用 Ajax 的挑战<br /><br />就像任何技术一样，使用 Ajax 也有许多出错的可能性。我目前在这里讨论的问题还缺乏容易的解决方案，但是会随着 Ajax 的成熟而改进。随着开发人员社区增加开发 Ajax 应用程序的经验，将会记录下最佳实践和指南。<br /><br />XMLHttpRequest 的可用性<br /><br />Ajax
开发人员面临的一个最大问题是：在没有 XMLHttpRequest 可用时该如何响应？虽然主要的现代浏览器都支持
XMLHttpRequest，但仍然有少数用户的浏览器不支持，或者浏览器的安全设置阻止使用 XMLHttpRequest。如果开发的 Web
应用程序要部署在企业内部网，那么可能拥有指定支持哪种浏览器的权力，从而可以认为 XMLHttpRequest 总能使用。但是，如果要部署在公共
Web 上，那么就必须当心，如果假设 XMLHttpRequest
可用，那么就可能会阻止那些使用旧的浏览器、残疾人专用浏览器和手持设备上的轻量级浏览器的用户使用您的应用程序。<br /><br />所以，您应当努力让应
用程序“平稳降级”，在没有 XMLHttpRequest 支持的浏览器中也能够工作。在购物车的示例中，把应用程序降级的最好方式可能是让 Add
to Cart 按钮执行一个常规的表单提交，刷新页面来反映购物车更新后的状态。Ajax 的行为应当在页面装入的时候就通过 JavaScript
添加到页面，只有在 XMLHttpRequest 可用时才把 JavaScript 事件处理函数附加到每个 Add to Cart
按钮。另一种方式是在用户登录时检测 XMLHttpRequest 是否可用，然后相应地提供应用程序的 Ajax 版本或基于表单的普通版本。<br /><br />可用性考虑<br /><br />关
于 Ajax 应用程序的某些可用性问题比较普遍。例如，让用户知道他们的输入已经注册了可能是重要的，因为沙漏光标和 spinning
浏览器的常用反馈机制“throbber”对 XMLHttpRequest 不适用。一种技术是用“Now updating...”类型的信息替换
Submit 按钮，这样用户在等候响应期间就不会反复单击按钮了。<br /><br />另一个问题是，用户可能没有注意到他们正在查看的页面的某一部分已经
更新了。可以使用不同的可视技术，把用户的眼球带到页面的更新区域，从而缓解这个问题。由 Ajax
更新页面造成的其他问题还包括：“破坏了”浏览器的后退按钮，地址栏中的 URL 也无法反映页面的整个状态，妨碍了设置书签。请参阅
参考资料一节，获得专门解决 Ajax 应用程序可用性问题的文章。<br /><br />服务器负载<br /><br />用 Ajax
实现代替普通的基于表单的 UI，会大大提高对服务器发出的请求数量。例如，一个普通的 Google Web
搜索对服务器只有一个请求，是在用户提交搜索表单时出现的。而 Google Suggest
试图自动完成搜索术语，它要在用户输入时向服务器发送多个请求。在开发 Ajax
应用程序时，要注意将要发送给服务器的请求数量以及由此造成的服务器负荷。降低服务器负载的办法是，在客户机上对请求进行缓冲并且缓存服务器响应（如果可
能的话）。还应该尝试将 Ajax Web 应用程序设计为在客户机上执行尽可能多的逻辑，而不必联络服务器。<br /><br />处理异步<br /><br />非
常重要的是，要理解无法保证 XMLHttpRequest
会按照分派它们的顺序完成。实际上，应当假设它们不会按顺序完成，并且在设计应用程序时把这一点记在心上。在购物车的示例中，使用最后更新的时间戳来确保
新的购物车数据不会被旧的数据覆盖（请参阅 清单
7）。这个非常基本的方式可以用于购物车场景，但是可能不适合其他场景。所以在设计时请考虑如何处理异步的服务器响应。<br /><br /><br />结束语<br /><br />现
在您对 Ajax 的基本原则应当有了很好的理解，对参与 Ajax 交互的客户端和服务器端组件也应当有了初步的知识。这些是基于 Java 的
Ajax Web 应用程序的构造块。另外，您应当理解了伴随 Ajax 方式的一些高级设计问题。创建成功的 Ajax 应用程序要求整体考虑，从
UI 设计到 JavaScript 设计，再到服务器端架构；但是您现在应当已经武装了考虑其他这些方面所需要的核心 Ajax 知识。<br /><br />如
果使用这里演示的技术编写大型 Ajax 应用程序的复杂性让您觉得恐慌，那么有好消息给您。由于 Struts、Spring 和
Hibernate 这类框架的发展把 Web 应用程序开发从底层 Servlet API 和 JDBC 的细节中抽象出来，所以正在出现简化
Ajax 开发的工具包。其中有些只侧重于客户端，提供了向页面添加可视效果的简便方式，或者简化了对 XMLHttpRequest
的使用。有些则走得更远，提供了从服务器端代码自动生成 Ajax 接口的方式。这些框架替您完成了繁重的任务，所以您可以采用更高级的方式进行
Ajax 开发。我在这个系列中将研究其中的一些。<br /><br />Ajax 社区正在快速前进，所以会有大量有价值的信息涌现。在阅读这个系列的下一期之前，我建议您参考 参考资料 一节中列出的文章，特别是如果您是刚接触 Ajax 或客户端开发的话。您还应当花些时间研究示例源代码并考虑一些增强它的方式。<br /><br />在
这个系列的下一篇文章中，我将深入讨论 XMLHttpRequest API，并推荐一些从 JavaBean 方便地创建 XML
的方式。我还将介绍替代 XML 进行 Ajax 数据传递的方式，例如 JSON（JavaScript Object
Notation）轻量级数据交换格式。<img src ="http://www.blogjava.net/computerboy/aggbug/69986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/computerboy/" target="_blank">Computerboy</a> 2006-09-15 23:27 <a href="http://www.blogjava.net/computerboy/archive/2006/09/15/69986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript 客户端实现导入word、excel的小程序</title><link>http://www.blogjava.net/computerboy/archive/2006/08/05/61986.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Sat, 05 Aug 2006 12:40:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2006/08/05/61986.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/61986.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2006/08/05/61986.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/61986.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/61986.html</trackback:ping><description><![CDATA[这个程序是我在网上搜集的，并结合自己的一点东西。写的。也算是网上的东西吧。<br />本文的所有权归原作者所有！<br /><br /><br />－－－－－start<br /><br />&lt;table id = "PrintA" width="100%" border="1" cellspacing="0" cellpadding="0" bgcolor = "#61FF13"&gt;<br />&lt;TR style="text-align : center;"&gt;<br /> &lt;TD&gt;单元格A&lt;/TD&gt;<br /> &lt;TD&gt;单元格A&lt;/TD&gt;<br /> &lt;TD&gt;单元格A&lt;/TD&gt;<br /> &lt;TD&gt;单元格A&lt;/TD&gt;<br />&lt;/TR&gt;<br />&lt;TR&gt;<br /> &lt;TD colSpan=4 style="text-align : center;"&gt;&lt;font color="BLUE" face="Verdana"&gt;单元格合并行A&lt;/FONT&gt;&lt;/TD&gt;<br />&lt;/TR&gt;<br />&lt;/TABLE&gt;<br />&lt;table id = "PrintB" width="100%" border="1" cellspacing="0" cellpadding="0"&gt;<br />&lt;TR style="text-align : center;"&gt;<br /> &lt;TD&gt;单元格B&lt;/TD&gt;<br /> &lt;TD&gt;单元格B&lt;/TD&gt;<br /> &lt;TD&gt;单元格B&lt;/TD&gt;<br /> &lt;TD&gt;单元格B&lt;/TD&gt;<br />&lt;/TR&gt;<br />&lt;TR&gt;<br /> &lt;TD colSpan=4 style="text-align : center;"&gt;单元格合并行B&lt;/TD&gt;<br />&lt;/TR&gt;<br />&lt;/TABLE&gt;<br />&lt;br/&gt;<br />&lt;input type="button" onclick="javascript:AllAreaWord();" value="导出页面指定区域内容到Word"&gt;<br />&lt;input type="button" onclick="javascript:AllAreaExcel();" value="导出页面指定区域内容到Excel"&gt;<br />&lt;input type="button" onclick="javascript:CellAreaExcel();" value="导出表单单元格内容到Excel"&gt;<br /><br /><br /><br />-----------------------<br /><br /><br /><br />&lt;SCRIPT LANGUAGE="javascript"&gt;<br /> //指定页面区域内容导入Excel<br /> function AllAreaExcel() <br /> {<br />  var oXL = new ActiveXObject("Excel.Application"); <br />  var oWB = oXL.Workbooks.Add(); <br />  var oSheet = oWB.ActiveSheet;  <br />  var sel=document.body.createTextRange();<br />  sel.moveToElementText(PrintA);<br />  sel.select();<br />  sel.execCommand("Copy");<br />  oSheet.Paste();<br />  oXL.Visible = true;<br /> }<br /> //指定页面区域“单元格”内容导入Excel<br /> function CellAreaExcel() <br /> {<br />  var oXL = new ActiveXObject("Excel.Application"); <br />  var oWB = oXL.Workbooks.Add(); <br />  var oSheet = oWB.ActiveSheet; <br />  var Lenr = PrintA.rows.length;<br />  for (i=0;i&lt;Lenr;i++) <br />  { <br />   var Lenc = PrintA.rows(i).cells.length; <br />   for (j=0;j&lt;Lenc;j++) <br />   { <br />    oSheet.Cells(i+1,j+1).value = PrintA.rows(i).cells(j).innerText; <br />   } <br />  } <br />  oXL.Visible = true; <br /> }<br /> //指定页面区域内容导入Word<br /> function AllAreaWord()<br /> {<br />  var oWD = new ActiveXObject("Word.Application");<br />  var oDC = oWD.Documents.Add("",0,1);<br />  var oRange =oDC.Range(0,1);<br />  var sel = document.body.createTextRange();<br />  sel.moveToElementText(PrintA);<br />  sel.select();<br />  sel.execCommand("Copy");<br />  oRange.Paste();<br />  oWD.Application.Visible = true;<br />  //window.close();<br /> }<br />&lt;/SCRIPT&gt;<br />&lt;/body&gt;&lt;/html&gt;<br /><br />－－－－end<br /><img src ="http://www.blogjava.net/computerboy/aggbug/61986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/computerboy/" target="_blank">Computerboy</a> 2006-08-05 20:40 <a href="http://www.blogjava.net/computerboy/archive/2006/08/05/61986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ajax框架汇总</title><link>http://www.blogjava.net/computerboy/archive/2006/06/04/50328.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Sun, 04 Jun 2006 12:25:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2006/06/04/50328.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/50328.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2006/06/04/50328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/50328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/50328.html</trackback:ping><description><![CDATA[文章来源<br />http://tb.blog.csdn.net/TrackBack.aspx?PostId=655786<br />http://www.okajax.com/info/zixun/200605189.html<br /><br /><br /><br />1. Pure Javascript: Application Frameworks<br />1.1 Bindows (成立于2003年)<br /><br />Backbase是一个通过DHTML、JavaScript、CSS和HTML等技术强劲联合起来的一套完整的<br /><br />Windows桌面式的WEB应用程序解决方案。 Bindows无需下载安装客户端支撑组件（如Java、<br /><br />ActiveX或Flash），仅需一个浏览器。纯OO的理念体现在Bindows任何地方， Bindows或许<br /><br />是笔者见过的最完整最强大的AJAX应用程序平台。<br />Bindows是商业程序的，使用了来自于MB的技术(总部位于GA USA，主要开发中心在瑞典，成<br /><br />立于2002年)。<br /><br />Bindows框架提供的功能和特性有：<br /><br />    * 基于面相对象技术的类和API<br />    * 一套完整的Windows桌面系统，支持各种特性窗口模式，包括菜单、表单、表格、滑<br /><br />动条、测量仪器窗口和其他一些Windows窗口特性支持。<br />    * 是开发zero-footprint(零空间占用)SOA客户端应用程序首选工具包<br />    * 本机的XML，SOAP和XML-RPC支持<br />    * 单用户到企业级开发的支持<br />    * 内建的完美的AJAX支持 <br /><br />Bindows开发环境：<br /><br />    * 支持企业级规模的项目开发<br />    * 跨浏览器、跨OS平台的支持<br />    * 不受服务器结构限制<br />    * 良好的与新的、现有的资源互操作性<br />    * 统一的开发接口 <br /><br /> <br />1.2 BackBase (成立于2003年)<br /><br />BackBase是一个完整的浏览器端框架，提供了丰富的浏览器操作功能，以及对.NET和JAVA平<br /><br />台的集成。<br />商业化产品，来自于Backbase B.V(总部在Amsterdam，成立于2003年)。<br /><br /> <br />1.3 DOJO (开发中,成立于2004年9月)<br /><br />DOJO提供完整的轻量级窗口组件和浏览器-服务器消息映射支持<br /><br />    * 提供创建自定义Javascript窗口组件的框架支持<br />    * 预制的丰富的窗口类型库<br />    * B/S消息映射支持——XMLHttpRequest和其他机制<br />    * 支持浏览器中的URL操纵功能<br />    * 开源许可(Academic Free License 2.1)，由JotSpot的Alex Russell所领导。 <br /><br />1.4 Open Rico (开发中;成立于2005年5月;基于早期的一个proprietary 框架)<br /><br />Open Rico是一个支持Ajax架构和用户交互的多用途框架。<br /><br />    * 一个XMLHttpRequest response能被一个或多个的DOM对象，或者Javascript对象调用<br /><br />。<br />    * 支持拖拽操作<br />    * 支持基于AJAX的动画模式，如缩放和变换等<br />    * 基于Behaviors的操作库<br />    * 使用指南，由RussMirimar的Yonah提供<br />    * 开源。源于Sabre航空公司解决方案，由Bill Scott，Darren James及另外一些人维<br /><br />护。 <br /><br /> <br />1.5 qooxdoo (开发中; 成立于2005年5月)<br /><br />qooxdoo，是另一个发展迅猛的应用框架，提供广泛的UI支持，正在开发基础架构等特性。<br /><br />    * 基础结构特性：<br />          o 能轻易的捕获和操纵DOM事件<br />          o 支持调试<br />          o 支持一个时间操作的Timer类<br />          o Getter/Setter支持 <br />    * UI:<br />          o 窗口组件库和框架<br />          o 界面布局管理<br />          o 图像缓存和透明PNG图片处理 <br />    * 开源(LGPL). <br /><br />1.6 Tibet (开发中; 创建于2005年6月)<br /><br />Tibet提供了大量的易移植和完整的JavaScript API，通过这些可以快速生成大量的客户端<br /><br />代码，Tibet自称是企业级AJAX。<br /><br />    * 远程脚本调用封装在XMLHttpRequest中<br />    * URI支持<br />    * 支持所有的HTTP事件，不再仅仅是GET和POST<br />    * 低级的协议-File://和WebDav也可以当作HTTP正常使用<br />    * Web Services调用支持，包括SOAP、XML-RPC等等<br />    * 大型的Javascript对象库<br />    * 多种多样的XML操作支持<br />    * IDE和开发工具<br />    * 开源协议(OSI) <br /><br />1.7 AJFORM (创建于2005年6月)<br /><br />AJFORM是一个极易上手的AJAX框架，被用来编写入门级的AJAX代码，提供有以下功能：<br /><br />    * 三步安装<br />    * 自动支持任意HTML表单元素<br />    *<br />      几乎无需编码即可实现AJAX <br />2 Pure Javascript: Infrastructural Frameworks<br />2.1 AjaxCaller(创建于2005年5月，目前是Alpha版)<br /><br />AjaxCaller是一个具有多线程安全访问的XMLHttpRequest组件，主要针对Ajax开发新手，目<br /><br />前仍处于alpha开发阶段，仅在AjaxPatterns的在线搜索范例中使用了这个程序。<br /><br />    * 用明文或者XML结构的数据实现和服务器的交互(GET/POST/PUT/DELETE)<br />    * 支持XMLHttRequest对象的构析(销毁对象，C++支持内存对象的构析操作)<br />    * 支持Response的高速缓存(尚在计划中)<br />    * 简单的库文件代码易于新手学习使用，并且支持脚本调试<br />    * 开源协议 <br /><br />2.2 Flash JavaScript Integration Kit<br /><br />The Flash JavaScript Integration Kit可以使Flash和Javascript脚本实现相互集成。<br /><br />    * 可以实现在JavaScript中调用Flash ActionScript脚本，反之亦然。<br />    * 几乎支持双方主要数据类型的在不同环境中的传递调用。<br />    * 开源协议，有几个Flash开源爱好者维护。 <br /><br />2.3 Google AJAXSLT (2005年6月发行)<br /><br />Google AJAXSLT，是一个Javascript框架，用来执行XSLT转换以及XPath查询。<br /><br />    * 目前在Google Map上就使用了这个。<br />    * 开源协议(BSD) <br /><br />2.4 HTMLHttpRequest(Beta版；创建于2005年)<br /><br />HtmlHttpRequest最大的特点就是运用XMLHttpRequest对象和标准HTML标签IFrame来实现最<br /><br />大限度的跨浏览跨平台的AJAX支持，其原理是在支持XMLHttpRequest的浏览器上调用<br /><br />XMLHttp，如果不支持，就用IFrame来模拟实现异步交互。<br /><br />    * 目前支持的浏览器：IE6/Win, IE5.5/Win, IE5/Win, IE4/Win, Mozilla/Win, <br /><br />Opera7/Win, Safari/Mac, IE5/Mac<br />    * 尚未测试的浏览器：IE4/Mac, Mozilla/Mac, Opera/Other, Konqueror/Linux。<br />    * 开源协议(LGPL) <br /><br />2.5 Interactive Website Framework (创建于2005年)<br /><br />Interactive Website Framework定位在浏览器中支持各种各样的AJAX基础应用的开源项目<br /><br />。自称是通过JavaScript、CSS、XML和HTML实现高性能的交互式WEB框架，包括一个可定制<br /><br />易读的XML解析器。实际上，IWF是一个AJAX的基础框架，并且还包括一些通用脚本代码。<br /><br />    * 实现了线程安全的XMLHttpRequest<br />    * 对XML Document进行封装，以便创建更具有可读性的代码：<br /><br />          var node = doc.groceries.frozen[0].pizza[0].size;<br /><br />      封装后的数据读取<br /><br />          var node = doc.documentElement.firstChild.firstChild.getAttribute<br /><br />("size");<br /><br />      原始的DOM操作读取<br />    * 开源协议 <br /><br />2.6 LibXMLHttpRequest (2003年6月发布)<br /><br />libXmlRequest是一个小型XMLHttpRequest封装包<br /><br />    * 用getXML()和postXML()两个事件简化XMLHttpReuqest调用<br />    * 支持XMLHttpRequest对象池<br />    * Response缓存处理<br />    * 源码可以使用，但是有版权保护。 <br /><br />2.7 MAJAX<br /><br />MAJAX是另一个非常小巧的HttpRequest封装包，为收发字符型信息提供简单接口，并为每步<br /><br />动作设置回调界面。<br />2.8 RSLite (x)<br /><br />RSLite是一个XMLHttpRequest封装组件，作为Brent Ashley的JSRS(JavaScript Remote <br /><br />Scripting)其中的一部分功能单独发布。详情可以看JSRS的介绍<br />2.9 Sack(开发中，成立于2005年5月)<br /><br />Sack也是一个很有名字的微型XMLHttpRequest封装包。调用者可以自定义回调函数或者是<br /><br />DOM对象。借助于回调DOM对象，可以把Response回来的数据直接以文本的方式嵌入DOM中。<br />2.10 Sarissa (发布于2003年2月)<br /><br />Sarissa是一个JavaScript API，封装了在浏览器端独立调用XML的功能。<br /><br />    * 可移植的XMLHttpRequest对象创造<br />    * 可移植的XPath查询<br />    * 可移植的DOM操控<br />    * 可移植的XSLT<br />    * 可移植的XML序列化<br />    * 开源协议(GPL2.0和LGPL2.1) <br /><br />2.11 XHConn (2005年4月发布)<br /><br />XHConn也是一个小型的XMLHttpRequest封装库。笔者也使用改良过的XHConn，其特点就是调<br /><br />用简单，代码也清晰易读。<br /><br />    * 例子：<br /><br />          new XHConn().connect("mypage.php"，"POST"，"foo=bar&amp;baz=qux"，<br /><br />fnWhenDone);<br /><br />    *<br />      开源协议许可 <br /><br />3 Server-Side: Multi-Language<br />3.1 Cross-Platform Asynchronous INterface Toolkit (2005年5月)<br /><br />CPAINT是一个真正的同时支持PHP和ASP/VBScript脚本的AJAX和JSRS工具包。CPAINT在后台<br /><br />提供你需求的AJAX和JSRS代码，并自动返回到浏览器端相应的Javascript脚本代码，这种方<br /><br />式易于实时反馈需求的WEB应用程序。<br /><br />    * 支持PHP和ASP<br />    * 所有功能函数都在统一的JavaScript文件中<br />    * 支持远程脚本和XML<br />    * 支持本地和远程函数调用<br />    * 可以创建单个或多个XMLHttp对象<br />    * 返回给后台的数据即可以是文本也可以是XML/DOM文档对象<br />    * 支持POST和GET<br />    * 用服务端代理的方式实现远程函数和数据的访问操作<br />    * 大部分浏览器中测试正常使用<br />    * 在GNU、GPL、LGPL开源协议保护下发行 <br /><br />3.2 SAJAX (2005年3月)<br /><br />SAJAX的实现方式很独特，例如：调用一个javascript方法x_calculateBudget()，将先把响<br /><br />应传到服务器并调用一个Java calculateBudget()方法，然后以javascript方式把值返回到<br /><br />x_calculateBudget_cb()中。SAJAX的名气不错，估计很多人都听过甚至用过，不过缺点就<br /><br />是它的这套映射理论感觉较繁锁，远不如一些轻量级的封装库好用，不过SAJAX最大的特点<br /><br />就是支持的平台丰富，几乎囊括了WEB下常用的编程语言和平台<br /><br />    * 很方便从JavaScript函数映射到服务端代理操作<br />    * 支持多种平台(ASP/ColdFusion/Io/Lua/Perl/PHP/Python/Ruby)<br />    * 开源协议 <br /><br />3.3 Javascipt Object Notation (JSON) and JSON-RPC<br /><br />JSON是一个"face-free" XML，而JSON-RPC是一种远程交互协议，类似于XML-RPC，对<br /><br />JavaScript支持较强<br /><br />    * 支持多服务端平台: Java, Python, Ruby, Perl.<br />    * 针对不同的平台有不同的包和许可协议, 如JSON-RPC-Java. <br /><br />3.4 JavaScript Remote Scripting(JSRS)(2000年)<br /><br />JSRS，较经典的远程脚本访问组件，支持将客户端数据通过服务器做代理进行远程的数据/<br /><br />操作交互。<br /><br />    * 支持的浏览器：IE4+，NS4.x，NS6.x，Mozilla，Opera7和Galeon。<br />    * 服务器端脚本语言支持：ASP，ColdFusion，PerlCGI，PHP,Python和JSP(servlet)。<br />    * 开源协议。由Brent Ashley提供支持。 <br /><br />3.5 Bitkraft for ASP.NET<br /><br />Bitkraft是个基于(.NET)Web框架的CLR(公共语言运行库)，允许用独特的方式创建和操作分<br /><br />布式Web内容。用C#编写，运行在微软的.NET 1.1和Mono框架下，无缝式的客户端-服务器响<br /><br />应方式是它的最大特点。Bitkraft没有使用XML组织数据，而是用JSON代替。<br /><br />    * 支持的浏览器： IE5+, Firefox1+, NS6<br />    * 服务器端要求：ASP.NET, Mono XSP, Cassini, Apache (modMono) .NET Framework <br /><br />1.1+<br />    * 事件驱动<br />    * 支持同步和异步的远程代理<br />    * 客户端支持所有的.NET类型或自定义类对象映射到JSON中<br />    * 用JSON取代XML<br />    *<br />      免费，开源许可协议 <br /><br />4 Server-Side: Java<br />4.1 WebORB for Java (2005年8月)<br /><br />WebORB for Java是一个开发AJAX和基于Flash的富客户端应用程序的开发平台。在线例子<br /><br />    * WebORB包括一个富客户端开发类库。提供简单的在线式API用来绑定或者调用任何<br /><br />Java对象、XML Web Services和EJB<br />    * 支持异步或同步的事件驱动<br />    * 不需要在服务端修改任何代码，不需要自定义方法或属性、变量等。不要求设计时指<br /><br />定代理等。<br />    * 同步调用不需要回调，异步调用需要一个回调方法。<br />    * 客户端可以向服务端请求指定的活动方式，不需要任何编程就可以把处理结果轻易的<br /><br />转变为状态。<br />    * 提供一个特定API来处理数据库查询结果-服务器代码能返回DataSet或者DataTable，<br /><br />而客户端以一个类似于RecordSet的JavaScript对象来显示这个结果。该对象提供检索列名<br /><br />和行数据的方法。<br />    * 支持数据分页技术。客户应用程序能检索页面中的数据。<br />    * 支持以参数的方式返回所有服务期端数据类型，如primitives, strings, complex <br /><br />types, arrays, native .net collections, remote references<br />    * 目前有两个版本：标准版(免费)，专业版(商业许可) <br /><br />4.2 Echo 2 (2005年3月)<br /><br />Echo 2允许你用纯Java语言编写AJAX程序。 Demo.<br /><br />    * 自动生成HTML和Javascript代码<br />    * 用XML在客户端-服务端传递消息<br />    * 如果愿意支持自定义Javascript组件<br />    * 开源协议(Mozilla Public License or GNU LGPL) <br /><br />4.3 Direct Web Remoting (DWR) (2005)<br /><br />Direct Web Remoting可以在Javascript代码中直接调用Java方法的应用框架<br /><br />    * 类似于SAJAX，可以把Javascript中的请求调用转递到Java方法中并将执行结果返回<br /><br />给Javascript<br />    * 可以和任何Web框架一起使用，如Struts、Tapestry等等<br />    * 开源(Apache)，目前该产品被加入到WebWork中 <br /><br />4.4 SWATO (2005)<br /><br />SWATO是一套可重用的和良好集成的Java/JavaScript库，它实现了一种更容易的方式来改变<br /><br />你的web应用程序的交互，通过AJAX方式实现。<br /><br />    * 服务端Java库可以非常容易的部署到所有Servlet2.3+兼容的容器中<br />    * 客户端Javascript库可以在所有支持XMLHttpRequest的浏览器中使用<br />    * 使用JSON技术在服务端组织POJO数据，这样你可以在任何Javascript环境中(HTML、<br /><br />XUL、SVG)访问这些远程数据，这种方式很容易通过硬编码或者某种成熟的Javascript库集<br /><br />成到当前应用中<br />    * 提供一个简单接口使你能在Javascript中调用远程的POJO数据<br />    * 使用和灵活的在web.xml中进行配置，并且可以集成(不是必须)到你的Spring框架中<br />    * 提供了几个可帮助你快速开发web应用程序的组件(如自动完成的文本框，在线表单，<br /><br />在线列表等等) <br /><br />4.5 AJAX JSP Tag Library<br /><br />The AJAX JSP Tag Library是一组JSP标签库，用来AJAX程序开发。可以在J2EE下无需<br /><br />Javascript就能轻松开发AJAX模式的Web Form。标签库为比较通用的AJAX功能提供了5个标<br /><br />签：<br /><br />    * autocomplete: 用户在文本框中输入字符，自动从指定的数据中匹配用户输入的字符<br /><br />，类似于Google Suggest<br />    * callout:可以为A标签加入气泡式的消息提示框，不过是实时的服务端取出数据<br />    * Select/dropdown:类似于联动菜单，比如地州市的联动下拉框<br />    * toggle:开关闸按钮，比如在一个hidden表单域中存储true和falsh，同时显示相应的<br /><br />img图像<br />    * update field:更新数据，也就是无刷新提交了。 <br /><br />4.6 AJAX Java Server Faces Framework<br /><br />The AJAX-JSF用来把任意的JSF应用程序转变为AJAX应用程序<br /><br />    * 例子：AJAX组件的 MyFaces JSF Tree(树型目录), table scroller(可滚动的表格), <br /><br />tabbed pane(分页栏)<br />    *<br />      开源协议(Apache Software License) <br />Server-Side: Lisp<br />5.1 CL-Ajax<br /><br />CL-Ajax实现Javascript直接调用服务端Lisp<br /><br />    * 生成可带参数的函数<br />    * 可以回调Javascript函数或者DOM对象<br />    * 可以集成到SAJAX中<br />    * 开源许可 <br /><br />6 Server-Side: .NET<br />6.1 WebORB for .NET (2005年8月)<br /><br />WebORB for .NET是一个用.NET和XML Web Services方式开发AJAX和基于Flash的富客户端应<br /><br />用程序(在线例子)<br /><br />    * WebORB包括一个富客户端开发类库。提供简单的在线式API用来绑定或者调用任<br /><br />何.NET对象、XML Web Services<br />    * 支持异步或同步的事件驱动<br />    * 不需要在服务端修改任何代码，不需要自定义方法或属性、变量等。不要求设计时指<br /><br />定代理等。<br />    * 同步调用不需要回调，异步调用需要一个回调方法。<br />    * 客户端可以向服务端请求指定的活动方式，不需要任何编程就可以把处理结果轻易的<br /><br />转变为状态。<br />    * 提供一个特定API来处理数据库查询结果-服务器代码能返回DataSet或者DataTable，<br /><br />而客户端以一个类似于RecordSet的JavaScript对象来显示这个结果。该对象提供检索列名<br /><br />和行数据的方法。<br />    * 支持数据分页技术。客户应用程序能检索页面中的数据。<br />    * 支持以参数的方式返回所有服务期端数据类型，如primitives, strings, complex <br /><br />types, arrays, native .net collections, remote references<br />    * 目前有两个版本：标准版(免费)，专业版(商业许可) <br /><br />6.2 Ajax.NET (2005年3月)<br /><br />Ajax.NET是首家支持各种方式通过Javascript访问服务端.net的免费库<br /><br />    * 类似于SAJAX，能把Javascript请求发送到.NET方法，服务端回传给Javascript，甚<br /><br />至包括串行化自定义类。<br />    * 可以在Javascript中访问Session和Application数据<br />    * 缓存查询结果<br />    * 免费使用源代码<br />    * 无需更改源代码，允许给Ajax.NET添加和修改方法和属性<br />    * 所有类支持Javascript客户端返回数据，可以在JavaScript中使用DataSet：<br /><br />res.Tables[0].Rows<br />    * 使用HtmlControls组件访问和返回数据<br />    * 页面无需重载，用事件代理(数据访问层)<br />    * 因为只提供一个调用接口方法，所以服务端CPU占用非常少 <br /><br />6.3 ComfortASP.NET (2005年8月)<br /><br />ComfortASP.NET可以让开发者在纯.NET下开发类似AJAX(DHTML,JavaScript,XMLHttp)特性的<br /><br />应用程序。<br /><br />    * 快速应答<br />    * 减少HTML传输<br />    * 减少页面重载<br />    * 无闪烁的浏览器内容更改<br />    * AJAX用户体验， <br /><