﻿<?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>Thu, 05 Aug 2010 01:41:02 GMT</lastBuildDate><pubDate>Thu, 05 Aug 2010 01:41:02 GMT</pubDate><ttl>60</ttl><item><title>Solaris10下安装MySQL</title><link>http://www.blogjava.net/computerboy/archive/2010/08/04/327973.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Wed, 04 Aug 2010 13:09:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2010/08/04/327973.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/327973.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2010/08/04/327973.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/327973.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/327973.html</trackback:ping><description><![CDATA[1 下载MySQL<br />
下载页面： http://www.mysql.com/downloads/mysql<br />
选择对应的Solaris版本，目前需要安装的版本是Solaris 10 SPARC 64-bit<br />
2 解压MySQL <br />
转到下载目录，目前本机器放在 /u02/mysqltemp 目录下<br />
#gunzip -d mysql-5.1.49-solaris10-sparc-64bit.pkg.gz<br />
3 创建mysql 的用户组和用户 并指定目录<br />
#groupadd mysql<br />
#useradd -G mysql mysql<br />
＝＝＝＝<br />
mkdir /export/home/mysql<br />
chgrp mysql /export/home/mysql<br />
chown mysql /export/home/mysql<br />
usermod -d /export/home/mysql mysql<br />
＝＝＝＝<br />
如果觉得不需要指定目录，可以个略过创建步骤。<br />
<br />
4 使用pkgadd 安装MySQl 包<br />
#pkgadd -d mysql-5.1.49-solaris10-sparc-64bit.pkg<br />
安装后的MySQL 位于 /opt/mysql/mysql 目录下<br />
<br />
如果不用此文件可以略过此步骤。<br />
4.1 建立目录连接<br />
#cd /usr/local<br />
#ln -s /opt/mysql/mysql/mysql<br />
如果不需要，可以略过此步骤。<br />
<br />
5 在目录/etc下创建mysql.cnf 文件，内如如下：<br />
[mysqld]<br />
basedir=/opt/mysql/mysql<br />
datadir=/opt/mysql/mysql/data<br />
<br />
6 运行MySQL 的post-install 文件，创建数据库 repository 或者叫初始化MySQL<br />
#cd /opt/mysql/mysql<br />
#./scripts/mysql_install_db --defaults-file=/etc/mysql.cnf --user=mysql<br />
或者用:<br />
#./scripts/mysql_install_db&nbsp; --user=mysql<br />
7 启动MySQL<br />
#cd /opt/mysql/mysql<br />
#./bin/mysql_safe -defaults-file=/etc/mysql.cnf -user=mysql<br />
也可以使用如下的方法启动MySQL<br />
#/etc/init.d/mysql start<br />
8 更改MySQL root用户的口令<br />
#/opt/mysql/mysql/bin/mysqladmin -u root password 'new-password'<br />
#/opt/mysql/mysql/bin/mysqladmin -u root -h 机器名称 password 'new-password'<br />
或者登录MySQL 之后用如下的方法更改：<br />
update user set password=PASSWORD('root') where user='root';<br />
9 登录MySQL 命令<br />
#mysql -p <br />
输入新的密码：<br />
或者用如下方法登录<br />
mysql -u root mysql<br />
<br />
10 停止MySQL<br />
#/etc/init.d/mysql stop<br />
<br />
<br />
<img src ="http://www.blogjava.net/computerboy/aggbug/327973.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> 2010-08-04 21:09 <a href="http://www.blogjava.net/computerboy/archive/2010/08/04/327973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><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>4</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>1</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>1</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>3</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>2</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 /><br />6.4 AjaxAspects (2005年8月)<br /><br />AjaxAspects是个可以用Javascript调用服务端WebService事件的引擎<br /><br />    * 用标准的SOAP和WSDL进行服务端-客户端通信<br />    * 用简单的类型和XML对象支持带参数的返回值<br />    * 缓存支持<br />    * 动作队列<br />    *<br />      免费使用，开源协议 <br /><br />7 Server-Side: PHP<br />7.1 AjaxAC (2005年4月)<br /><br />AjaxAC用一个单独类封装了完整的应用程序功能<br /><br />    * 所有的功能集成在自包含的类中(另外附带一些Javascript库)<br />    * 调用PHP文件或者HTML页面非常简易，只需创建App类后把类引用传递给需要调用的<br /><br />Javascript对象或者HTML元素即可。<br />    * 捕获Javascript事件<br />    * 可以自定义配置数据，并且支持运行时参数更改<br />    * 无需再Javascript代码中夹杂凌乱的Html代码，所有事件都是被动态附加上的<br />    * 由于以上两个优点，所以支持良好的模版引擎<br />    * 容易Hook到PHP类和MySql数据已返回给自己的request<br />    * 能够容易的用Javascript建立窗口模式应用程序。 <br /><br />7.2 JPSpan<br /><br />JPSPAN通过Javascript直接调用PHP中的函数。<br /><br />    * 进行了严谨的单元测试<br />    * 开源许可(PHP) <br /><br />7.3 XAJAX<br /><br />XAjax通过Javascript直接调用PHP中的函数<br /><br />    * 支持用Javascript调用PHP脚本<br />    * 开源许可协议 <br /><br />8 Server-Side: Ruby<br />8.1 Ruby On Rails<br /><br />Ruby On Rails是一个支持AJAX的完整Web框架，使用Ruby语言编写，严格按照MVC结构开发<br /><br />。<br /><br />    * 当Ajax出现的时候Rails还处于其发展的早期，因此Ajax可能逐渐成为Rails框架的核<br /><br />心。<br />    * 生成浏览器中大多数/全部的Window应用组件和动画的Javascript脚本。<br />    * 支持服务器端调用。<br />    * 队列支持<br />    *<br />      开源许可 <br /><br /><img src ="http://www.blogjava.net/computerboy/aggbug/50328.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-06-04 20:25 <a href="http://www.blogjava.net/computerboy/archive/2006/06/04/50328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ajax资源  or Ajax Resources</title><link>http://www.blogjava.net/computerboy/archive/2006/06/04/50256.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Sun, 04 Jun 2006 05:41:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2006/06/04/50256.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/50256.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2006/06/04/50256.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/50256.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/50256.html</trackback:ping><description><![CDATA[这些是完全的搜集。但是很遗憾的是这些在国内的站点上还是寥寥无几。<br /><br />资源－－－－中文<br />1 Ajax中国<br />    http://www.okajax.com/<br />2 Java 开源大全<br />    http://www.open-open.com/<br /><br />3 安全矩阵（Security Matrix）官方网站<br />    http://www.smatrix.org/<br />4 TechTarget IT专家网－－Ajax_IT专家网_Web服务<br />    http://searchwebservices.techtarget.com.cn/wsdev/ajax/<br />5 网易学院<br />    http://tech.163.com/special/c/0009159F/codeother.html<br />6 Java 视线论坛<br />    http://forum.javaeye.com/<br /><br /><br />Resources－－－－English<br /><br />1 AJAX开发人员的编译模式:<br />    http://www.ajaxpatterns.org<br />2  XMLHttpRequest教程：“动态网页接口”:<br />    http://www.xml.com/pub/a/2005/02/09/xml-http-request.html<br />3 JavaScript性能基准:<br />    http://blogs.ebusiness-apps.com/dave/?p=14<br />4 AJAX资源:<br />    http://www.ajaxmatters.com<br />5 JavaScript规范:<br />    http://www.ecma-international.org/publications/standards/Ecma-262.htm<br />6 介绍JavaScript对象标识:<br />    http://www.crockford.com/JSON/index.html<br />7  Mozilla 的Venkman JavaScript调试器:<br />    http://www.mozilla.org/projects/venkman/<br />8  XML DOM参考:<br />      http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/e9da2722-7879-4e48-869c-7f16714e2824.asp<br />9 Microsoft Dynamic HTML reference: <br />    http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/dhtml_reference_entry.asp<br />10 Gecko DOM Reference: <br />      http://www.mozilla.org/docs/dom/domref/<br />11 "“移植IE应用到Mozilla”<br />    http://www-128.ibm.com/developerworks/web/library/wa-ie2mozgd/<br />12 Mozilla XUL reference:<br />    http://www.xulplanet.com/<br />13 Microsoft XAML reference:<br />    http://windowssdk.msdn.microsoft.com/library/default.asp?url=/library/en-us/wcp_conceptual/html/0ff5f36e-dd84-44d1-aa3e-            <br /><br />5bb4f147b169.asp?frame=true<br />14 James Jesses Garret introduced the term AJAX in his article "AJAX: A New Approach to Web Applications," (Adaptive Path, February 2005): <br /><br />“AJAX：新的网页应用开发方式”<br />    http://www.adaptivepath.com/publications/essays/archives/000385.php<br />15 JetBrains IntelliJ IDEA:<br />    http://www.jetbrains.com/<br />16 Microsoft Visual Studio:<br />    http://msdn.microsoft.com/vstudio/<br />17 JSEditor:<br />    http://jseditor.sourceforge.net/<br />18 JSEclipse:<br />    http://www.interaktonline.com/Products/Eclipse/JSEclipse/Overview/<br />19 ActiveState Komodo:<br />    http://www.activestate.com/Products/Komodo/<br />20 XHTML:<br />    http://www.w3.org/TR/xhtml1/<br />21 Document Object Model:<br />    http://www.w3.org/DOM/<br />22 Cascading Style Sheets:<br />    http://www.w3.org/Style/CSS/<br />23 Extensible Stylesheet Language:<br />    http://www.w3.org/Style/XSL/<br />24 XForms:<br />    http://www.w3.org/MarkUp/Forms/<br />25 Scaling Vector Graphics:<br />    http://www.w3.org/Graphics/SVG/<br />26 XPath:<br />    http://www.w3.org/TR/xpath<br />27 AJAX.Net:<br />    http://ajax.schwarz-interactive.de/csharpsample/default.aspx<br />28 Backbase:<br />    http://www.backbase.com<br />29 Bitkraft:<br />    http://www.tiggrbitz.com/<br />30 Django:<br />    http://www.djangoproject.com/<br />31 Dojo:<br />    http://www.dojotoolkit.org/<br />32 DWR (Direct Web Reporting):<br />    http://getahead.ltd.uk/dwr/<br />33 MochiKit:<br />    http://mochikit.com/<br />34 Prototype:<br />    http://prototype.conio.net/<br />35 Rico:<br />    http://openrico.org/rico/home.page<br />36 Sajax:<br />    http://www.modernmethod.com/sajax/<br />37 Sarissa:<br />    http://sarissa.sourceforge.net/doc/<br />38 Script.aculo.us:<br />    http://script.aculo.us/<br />39 Ruby on Rails:<br />    http://www.rubyonrails.org/<br />40 For more on AJAX and DWR, read "AJAX Made Simple with DWR," Cloves Carneiro Jr. (JavaWorld, June 2005): 关于AJAX和DWR，请阅读“AJAX使用DWR更<br /><br />简单”<br />    http://www.javaworld.com/javaworld/jw-06-2005/jw-0620-dwr.html<br />41 For more articles on Java development tools, browse the Development Tools section of JavaWorld’s Topical Index: 更多Java开发工具的文章，请<br /><br />浏览JavaWorld的开发工具部分索引页<br />    http://www.javaworld.com/channel_content/jw-tools-index.shtml<br />42 For more articles on XML, browse the Java and XML section of JavaWorld’s Topical Index: 更多XML的文章，请浏览JavaWorld的Java和XML部分索引页<br />    http://www.javaworld.com/channel_content/jw-xml-index.shtml<br />43 For more articles on UI design, browse the User Interface Design section of JavaWorld’s Topical Index: 更多UI设计的文章，请浏览JavaWorld的<br /><br />UI设计部分索引页<br />    http://www.javaworld.com/channel_content/jw-ui-index.shtml <br /><img src ="http://www.blogjava.net/computerboy/aggbug/50256.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-06-04 13:41 <a href="http://www.blogjava.net/computerboy/archive/2006/06/04/50256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ajax 之DWR里程碑2发布说明（试翻译）</title><link>http://www.blogjava.net/computerboy/archive/2006/05/31/49137.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Tue, 30 May 2006 16:05:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2006/05/31/49137.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/49137.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2006/05/31/49137.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/49137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/49137.html</trackback:ping><description><![CDATA[这个里程碑是我在出差期间翻译的，时间仓促，可能有的没有翻译，准备回去再整理了，先发个草稿到博客上吧。有错误请告诉我！！！！<br />原文地址：http://getahead.ltd.uk/dwr/changelog/dwr20m2<br /><br /><br />DWR2.0版本里程碑2 发布！<br /><br />We're on a roll ...<br /><br />里程碑１描述反向Ajax和其它goodies.里程碑2添加注释，反向Ajax使用Jetty Continuations，在Java 中写JavaScript 你的效率会更高！<br /><br />Java 中写脚本（Write your Javascript in Java）<br />Javascript puts some people off Ajax; DWR2.0里程碑2有一套新的实验性的API允许你使用Java和熟悉的语言和IDE写脚本(JavaScript).<br /><br />我们拥有DWRUtil库，首先是服务器端版本：<br /><br />－－－－<br />import org.directwebremoting.proxy.dwrutil.DwrUtil;<br />  DwrUtil util=new DwrUtil(...);<br />  util.addOptions("selectId",array);<br /><br />－－－－<br /><br />上述是Java代码，但是它修改是在远程浏览器中是可见的，在这种情况下，加入了一系列内容到下拉列表(droo-down list)。<br />我们也有一个实验性的服务器端java版本of Script.aculo.us Effects:<br /><br />－－－－<br />import org.directwebremoting.proxy.scriptaculous.Effect;<br />  Effect effect=new Effect(...);<br />  effect.fade("selectId");<br /><br />－－－－<br /><br /><br />整洁的事情是反向AJAX能结合这些服务器端APIS以少数请求改变多数浏览器.<br /><br /><br />－－－－<br />Collectiong sessions=WebContextFactory.get().getScriptSessionsByPage("/index.html");<br />DwrUtil util=new DwrUtil(sessions);<br />util.setValue("message","Hello,World!");<br /><br />－－－－<br /><br />这代码将在主页上查找所有浏览器并更改内容of a div with id="message" 包含问候。<br /><br /><br />注释<br />如果你使用java 5(JDK) ，那么你能利用新的DWR注释，感谢Maik Schreiber.<br />在里程碑1支持组合一般类型映射。(to get rid of the need for a &lt;signature&gt; element)<br />你能没有对任何DWR.XML的需要(了解)而使用DWR.<br />新的注释包括 @Create,@Convert,@RemoteMethod,@RemoteProperty.<br />了解更多注释细节请看http://getahead.ltd.uk/dwr/server/annotations<br /><br />Jetty Continuations<br />反向的Ajax正在进行的工作是确保由于额外的加载没有使WebServer得到损害。<br />第一块难题来自于Greg Wilkins of Jetty fame.<br />如果反向的Ajax在Jetty Servlet引擎上能够打开的话，那么DWR就能够自动使用Jetty 的 Ajax Continuations在多线程上保存。<br /><br />我想要把支持扩展到其它的Servlet引擎上，但是，Jetty看起来像是在曲线的前面。<br />我最近blogged，我们需要一个JSR 为 Continuations to make this easy.<br /><br />Other Changes<br />如果有安全限制超时，一些安全的机制会自动的返回一个登录页面给用户！<br />如果有些事物替换DWR请求，我们添加一个实验性的特性，允许你采取特殊的方式登录。<br />你一般想要重新加载当前页面，查看完全的登录。<br />你能做如下：<br /><br />－－－－<br />DWREngine.setTextHtmlHandler(function(){document.location.reload();});<br /><br />－－－－<br />里程碑2也确定了许许多多的错误，如果你发现有任何错误，请反馈给我！<br /><br /><br /><img src ="http://www.blogjava.net/computerboy/aggbug/49137.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-05-31 00:05 <a href="http://www.blogjava.net/computerboy/archive/2006/05/31/49137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP及XMLHTTP状态代码一览(基础知识库)</title><link>http://www.blogjava.net/computerboy/archive/2006/05/30/48952.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Tue, 30 May 2006 05:30:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2006/05/30/48952.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/48952.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2006/05/30/48952.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/48952.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/48952.html</trackback:ping><description><![CDATA[(一) HTTP 1.1支持的状态代码<br />　　<br />　　100 Continue 初始的请求已经接受，客户应当继续发送请求的其余部分<br />　　<br />　　101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议<br />　　<br />　　200 OK 一切正常，对GET和POST请求的应答文档跟在后面。<br />　　<br />　　201 Created 服务器已经创建了文档，Location头给出了它的URL。<br />　　<br />　　202 Accepted 已经接受请求，但处理尚未完成。<br />　　<br />　　203 Non-Authoritative Information 文档已经正常地返回，但一些应答头可能不正确，<br />        因为使用的是文档的拷贝<br />　　<br />　　204 No Content 没有新文档，浏览器应该继续显示原来的文档。如果用户定期地刷新页面，<br />        而Servlet可以确定用户文档足够新，这个状态代码是很有用的<br />　　<br />　　205 Reset Content 没有新的内容，但浏览器应该重置它所显示的内容。<br />        用来强制浏览器清除表单输入内容<br />　　<br />　　206 Partial Content 客户发送了一个带有Range头的GET请求，服务器完成了它。<br />　　<br />　　300 Multiple Choices 客户请求的文档可以在多个位置找到，这些位置已经在返回的文档内列出。<br />        如果服务器要提出优先选择，则应该在Location应答头指明。<br />　　<br />　　301 Moved Permanently 客户请求的文档在其他地方，新的URL在Location头中给出，<br />        浏览器应该自动地访问新的URL。<br />　　<br />　　302 Found 类似于301，但新的URL应该被视为临时性的替代，而不是永久性的。<br />　　<br />　　303 See Other 类似于301/302，不同之处在于，如果原来的请求是POST，<br />        Location头指定的重定向目标文档应该通过GET提取<br />　　<br />　　304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求<br />      （一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档）。<br />       服务器告诉客户，原来缓冲的文档还可以继续使用。<br />　　<br />　　305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取。<br />　　<br />　　307 Temporary Redirect 和302（Found）相同。许多浏览器会错误地响应302应答进行重定向，<br />        即使原来的请求是POST，即使它实际上只能在POST请求的应答是303时才能重定向。<br />        由于这个原因，HTTP 1.1新增了307，以便更加清除地区分几个状态代码：当出现303应答时，<br />        浏览器可以跟随重定向的GET和POST请求；如果是307应答，<br />        则浏览器只能跟随对GET请求的重定向。<br />　　<br />　　400 Bad Request 请求出现语法错误。<br />　　<br />　　401 Unauthorized 客户试图未经授权访问受密码保护的页面。<br />        应答中会包含一个WWW-Authenticate头，浏览器据此显示用户名字/密码对话框，<br />        然后在填写合适的Authorization头后再次发出请求。<br />　　<br />　　403 Forbidden 资源不可用。<br />　　<br />　　404 Not Found 无法找到指定位置的资源<br />　　<br />　　405 Method Not Allowed 请求方法（GET、POST、HEAD、DELETE、PUT、TRACE等）<br />        对指定的资源不适用。<br />　　<br />　　406 Not Acceptable 指定的资源已经找到，但它的MIME类型和客户在Accpet头中所指定的不兼容。<br />　　<br />　　407 Proxy Authentication Required 类似于401，表示客户必须先经过代理服务器的授权。<br />　　<br />　　408 Request Timeout 在服务器许可的等待时间内，客户一直没有发出任何请求。<br />        客户可以在以后重复同一请求。<br />　　<br />　　409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突，因此请求不能成功。<br />　　<br />　　410 Gone 所请求的文档已经不再可用，而且服务器不知道应该重定向到哪一个地址。<br />       它和404的不同在于，返回407表示文档永久地离开了指定的位置，<br />       而404表示由于未知的原因文档不可用。<br />　　<br />　　411 Length Required 服务器不能处理请求，除非客户发送一个Content-Length头。<br />　　<br />　　412 Precondition Failed 请求头中指定的一些前提条件失败<br />　　<br />　　413 Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。<br />        如果服务器认为自己能够稍后再处理该请求，则应该提供一个Retry-After头<br />　　<br />　　414 Request URI Too Long URI太长<br />　　<br />　　416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。<br />　　<br />　　500 Internal Server Error 服务器遇到了意料不到的情况，不能完成客户的请求<br />　　<br />　　501 Not Implemented 服务器不支持实现请求所需要的功能。<br />        例如，客户发出了一个服务器不支持的PUT请求<br />　　<br />　　502 Bad Gateway 服务器作为网关或者代理时，为了完成请求访问下一个服务器，<br />        但该服务器返回了非法的应答<br />　　<br />　　503 Service Unavailable 服务器由于维护或者负载过重未能应答。<br />        例如，Servlet可能在数据库连接池已满的情况下返回503。<br />        服务器返回503时可以提供一个Retry-After头<br />　　<br />　　504 Gateway Timeout 由作为代理或网关的服务器使用，表示不能及时地从远程服务器获得应答。<br />　　<br />　　505 HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本<br />　　<br />　　(二) XMLHttpRequest 对象方法<br />　　<br />　　abort()　　　　　　　　　　 停止当前请求<br />　　getAllResponseHeaders()　　 作为字符串返问完整的headers<br />　　getResponseHeader("headerLabel")　　      作为字符串返问单个的header标签<br />　　open("method","URL"[,asyncFlag[,"userName"[, "password"]]])　　<br />                                设置未决的请求的目标 URL, 方法, 和其他参数<br />　　send(content)　　           发送请求<br />　　setRequestHeader("label", "value")　　　　设置header并和请求一起发送<br />　　<br />　　(三) XMLHttpRequest 对象属性<br />　　<br />　　onreadystatechange　　　　  状态改变的事件触发器<br />　　readyState　　　　　　　　  对象状态(integer):<br />　　　　　　　　　　0 = 未初始化<br />　　　　　　　　　　1 = 读取中<br />　　　　　　　　　　2 = 已读取<br />　　　　　　　　　　3 = 交互中<br />　　　　　　　　　　4 = 完成<br />　　responseText　　　　服务器进程返回数据的文本版本<br />　　responseXML　　　　 服务器进程返回数据的兼容DOM的XML文档对象<br />　　status　　　　　　  服务器返回的状态码, 如：404 = "文件末找到" 、200 ="成功"<br />　　statusText　　　　  服务器返回的状态文本信息<img src ="http://www.blogjava.net/computerboy/aggbug/48952.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-05-30 13:30 <a href="http://www.blogjava.net/computerboy/archive/2006/05/30/48952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ajax 之DWR发布说明（试翻译）</title><link>http://www.blogjava.net/computerboy/archive/2006/05/14/46038.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Sat, 13 May 2006 18:32:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2006/05/14/46038.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/46038.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2006/05/14/46038.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/46038.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/46038.html</trackback:ping><description><![CDATA[
		<p>说明：这个发布说明是我试翻译的，由于水平有限，错误再所难免！<br />原文地址：<a href="http://getahead.ltd.uk/dwr/changelog/dwr20m1">http://getahead.ltd.uk/dwr/changelog/dwr20m1</a><br />DWR现在已经发布了2.0的milestone 2 了。我现在翻译的是milestone 1<br />由于我要出差，所以这个翻译是一个草稿<br />欢迎朋友们提出指正<br />我的MSN：zhang_2958@hotmail.com<br /><br /><br /><br /><br />DWR 发布说明</p>
		<p>DWR 2.0版本 是1的里程碑</p>
		<p>
				<br />这是我们在新特性方面的最大发布！<br />反向的AJAX<br />最大的特性是我们成为反向的Ajax。DWR1.x允许你用javascript异步的访问java代码。<br />DWR2.0在这上允许你建立异步java访问javascript代码。<br />反向的Ajax使你编写应用程序更容易得多。</p>
		<p> It can use polling or Comet(long-lived HTTP)queries.<br />我们的‘聊天室’例子包含这样一段java代码：</p>
		<p>－－－－</p>
		<p>//Get the current page －－得到当前的页</p>
		<p>WebContext wctx=WebContextFactory.get();<br />String currentPage=wctx.getCurrentPage();</p>
		<p>// 'messages' is a List of recent messages for a browser to display<br />// Java objects converted to Javascript hava a declarating and a declared </p>
		<p>///variable name.<br />OutboundVariable ov=wctx.toJavascript(messages);<br />//Loop over all the users on the current page</p>
		<p>for(ScriptSession otherSession:wctx.getScriptSessionsByPage(currentPage)){<br />     otherSession.addScript(ov.getInitCode());<br />     otherSession.addScript("receiveMessages("+ov.getAssignCode()+");");<br />   //receiveMessages is a Javascript function that displays the current list of  <br />     ///messages <br />  }</p>
		<p>－－－－</p>
		<p>在本质上我们发送一些javascript循环所有用户在当前页上更新并显示他们。<br />javascript更简单。你可以启用轮流（轮询）检测这种查询方式。</p>
		<p>－－－－</p>
		<p>DWREngine.setPolling(true);</p>
		<p>－－－－</p>
		<p>聊天室例子（在WAR包里下载）包括javascript源码 到 receiveMessages()　是使用</p>
		<p>DWRUtil的４路线路（线程）将信息显示到屏幕上。　????<br />其它这技术的用法包括酒吧，游戏在线，售票和任何的系统在何处服务器状态变化，<br />我们需要把更新发布到浏览者或者浏览器上。</p>
		<p>
				<br />跨领域 Ajax:&lt;script&gt; 标签（tag）操作　　　<br />如果你需要访问不同的领域服务器　我们的遥远（remoting）计划已成为可能。<br />从DWR2.0你可以操作&lt;script&gt;标签(tags)增加在XMLHttpRequest 或　iframes.<br />对于使用你需要做如下：</p>
		<p>－－－－<br />DRWEngine.setMethod(DWREngine.ScriptTag);<br />－－－－</p>
		<p>&lt;signatures&gt;(签名)元素(Element)<br />DWR1.0有时需要一个&lt;signatures&gt;元素(Element)帮你它得到一个类型转换。<br />如果你用DWR2.0同JDK5　此时一般的类型你就不要使用更多的&lt;signatures&gt;<br />DWR将自动调用类型转换。</p>
		<p>
				<br />DWRUtil 更新<br />我们已更新DWRUtils.有一种新的DWRUtil.cloneNode(elementID)方法<br />你可以重复使用HTML片段作为模板。<br />例如：</p>
		<p>－－－－<br />// Loop over all the beans<br />for(var i=0;i&lt;beanArray.length;i++){<br />   //Fill in the blanks in the template. You will have several lines like this.<br />   DWRUtil.setValue("someid",beanArray[i].property);<br />   //Clone the node so we don't overwrite it next time<br />   DWRUtil.cloneNode("template");<br />  }<br /> //Finally hide the template<br />  $("template").style.display="none";</p>
		<p>－－－－</p>
		<p>我们也尝试着写一些的取值的的更新。如果其值为假的话，将返回false(假).<br />这有可能破坏反向的兼容性。<br />它是轻微非明显依赖你的观点，我们需要关于这样的反馈。</p>
		<p>新的属性作用域(Scope)－－脚本(Script)<br />有一个新的作用域。<br />Servlet与JSP开发者熟悉设置属性在一次请求，页面，会话，或者应用水平。<br />DWR2.0允许你使用"script"(脚本)作用域。<br />脚本作用域在单一页面内，Ajax应用能持续使用变量。</p>
		<p>
				<br />脚本作用域其long-lived 有一点像会话作用域，然而它不要cookies（甜点）.脚本作用域</p>
		<p>属性在单一页面内，任何Ajax操作都是可用的。<br />创建dwr.xml它是可用的。</p>
		<p>－－－－<br />&lt;create creator="new" javascript="Test" scope="script"&gt;<br />   &lt;param name="class" value="com.example.Test"/&gt;<br />&lt;/create&gt;</p>
		<p>－－－－</p>
		<p>脚本作用域也同样可用于 programatically:</p>
		<p>－－－－<br />WebContextFactory.get().getScriptSession().setAttribute("key",value);<br />－－－－</p>
		<p>例子(Example)</p>
		<p>开始下载DWR2.0　压缩文件时会比以前有一些大因为我们包括一些例子。<br />我们从事简单的struts 和　Spring 整理演示。</p>
		<p>
				<br />Refactoring(重用)这个词我叫不准。是应该是重载的呢还是重构。大家可以告诉我！</p>
		<p>　在开发者眼中，重用是一个特性，因为代码整洁。<br />但是它也是导致用户向后兼容性问题的原因。<br />我们为DWR2.0做了一些重用。但是这里是用户剔除它：<br />我们使用 org.directwebremoting.* 包　代替模糊的uk.ltd.getahead.dwr.*, <br />由于兼容性差，我们已经抛弃存根（stubs）.<br />如果我们有所遗漏，请告诉我们。我们也试图使DWR成为可嵌入的。</p>
		<p>同时，如果现在创建像SOAP或者JSON-RPC一样的预备的协议应该是可能的！</p>
		<p>
				<br />呼叫集合数据（Call Meta-data）<br />你能像这样使用DWR传递请求属性呼叫集合数据:</p>
		<p>－－－－<br />Remote.getData(42,{<br />   Callback:function(str){alert(str);},<br />   customKey:"Fred",<br />});</p>
		<p>－－－－<br />java 在HttpSevletRequest 中额外的集合数据是可用的。如下代码将返回字符串"Fred":</p>
		<p>－－－－<br />WebContextFactory.get().getHttpServletRequest().getAttribute("customKey");</p>
		<p>－－－－</p>
		<p>其它事项</p>
		<p>虽然我们已经删除了deprecated.js，但是有人竟然还能够注意到，对此我十分怀疑。在</p>
		<p>DWR9.0版本出现时，它已经不能满足需求了。</p>
		<p>
				<br />安全和稳定</p>
		<p>我们十分慎重的对待安全。DWR1.X　到迄今为止是十分安全的，但是，那不意味着我们停止</p>
		<p>在我们的荣誉上。<br />DWR2.0介绍许多新的代码。反向的AJAX和脚本为基础的会话管理是疏忽（slip up）的地方</p>
		<p>。</p>
		<p>此外，里程碑1，反向的ajax将在你的webserver 上创建一些较多的加载，比老版本稳定。<br />我们已得到2个答案－－设计允许服务器加载监控和动态back-off。</p>
		<p>
				<br />更令人激动的是，我们正与Mortbay一起努力，使DRW能够运用Jetty6的持续性，如果可行的话，可以满足长期HTTP的请求而不冒资源匮乏风险。</p>
		<p>
		</p>
		<p>
				<br />因此，在这之前，请不要使用DWR2.0在开发系统，直到我们有更多的测试和检查。</p>
		<p>
				<br />未来版本</p>
		<p>这是一个令人兴奋的第一个里程碑,我们将在未来数周内推出.<br />我们将得到更多东西！</p>
		<p>
				<br />下载<br />你可以下载DWR2.0 M1 <br />下载地址：<br /><a href="http://getahead.ltd.uk/dwr/download">http://getahead.ltd.uk/dwr/download</a></p>
		<p> </p>
<img src ="http://www.blogjava.net/computerboy/aggbug/46038.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-05-14 02:32 <a href="http://www.blogjava.net/computerboy/archive/2006/05/14/46038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAX 之 DWR简介（不断更新）</title><link>http://www.blogjava.net/computerboy/archive/2006/04/19/41974.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Wed, 19 Apr 2006 10:12:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2006/04/19/41974.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/41974.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2006/04/19/41974.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/41974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/41974.html</trackback:ping><description><![CDATA[
		<p>本文是我翻译的并整理的，由于水平有限，错误在所难免，希望指正。<br />如果要转载，请注明出处。谢谢<br /><br />DWR: Easy Ajax for java<br />DWR使你制作简单的AJAX网站成为可能<br /><br />关于DWR：</p>
		<p>你写Ajax网站，DWR是你的java开源库。<br />DWR能够让运行在服务器端的Java代码就像运行在浏览器里一样<br />DWR 包括两个主要部分：<br /> 一 在服务器上运行java servlet 请求，并把应答返回给浏览器<br /> 二 在浏览器运行JavaScript 请求和能动态的更新网页。</p>
		<p>DWR动态的通过Java类生成Javascript代码,<br />执行AJAX服务器端的代码就像在本地浏览器上执行的一样,但是是实际上服务器上执行代码和DWR来回的传递数据。<br />这从 JAVA到JAVASCRIPT 给DWR 用户感到像像RMI或者SOAP一样的常规的RPC机制一样。而运行在WEB 上不要浏览器插入。<br />JAVA是同步的而AJAX是异步的，因此当数据从网络返回时，你向DWR提供一个返回功能调用。DWR 能像javascript的onclick事件一样，改变图形显示目录列表的结果<br />DWR 能动态的产生一个AjaxService（服务）类 与一些javascript匹配的服务器端代码。<br />这是通过事件处理器调用的。然后DWR处理远程的数据（细节），包括改变javascript和java之间所有参数和返回值。<br />用DWR实用工具来执行下面的例子中提供的回调函数来改变网页。<br />DWR提供一些javascript库和一套DHTML的例子给你帮助你开发出高效的交互式站点。<br />图片如下：<br /><img src="http://getahead.ltd.uk/sitefiles/getahead/howitworks.png" /></p>
<img src ="http://www.blogjava.net/computerboy/aggbug/41974.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-04-19 18:12 <a href="http://www.blogjava.net/computerboy/archive/2006/04/19/41974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java相关英语（不断更新中）</title><link>http://www.blogjava.net/computerboy/archive/2006/03/20/36267.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Mon, 20 Mar 2006 03:43:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2006/03/20/36267.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/36267.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2006/03/20/36267.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/36267.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/36267.html</trackback:ping><description><![CDATA[
		<p>这个是我所收集的和JAVA有关的英语主要是Servlet的（以后不断更新中）<br />当然了，这个也只是对英语不好的人来说的，高手就不用看了！！！<br /><br />***********************<br /><br />Lift-cycle methods    生命周期<br />calls                 调用<br />sequence              序列<br />access                存取<br />Binding               绑定<br />provide               提供<br />getCharacterEncoding  获取字符编码<br />Attribute             属性<br />MIME                  多用途网际邮件扩充协议<br />container             容器<br />middle layer          中间件<br />acting as             担当<br />Custom                定制<br />Explicit              显示<br />Implicit              隐式<br />Varieties             变量<br />behing-the-scenes     幕后<br />Critical              重要的</p>
		<p>
				<br />****************************************************************<br />Servlet's Job</p>
		<p>Servlets are Java programs that run on Web or application servers,<br />acting as a middle layer between requests coming from Web browsers <br />or other HTTP clients and databases or applications on the HTTP server.</p>
		<p> </p>
		<p>Read the explicit data sent by the client</p>
		<p>The end user normally enters this data in an HTML form on a Web page.<br />However,the data could also come from an applet or a custom HTTP client program.</p>
		<p> </p>
		<p>Read the implicit HTTP request data sent by the browser</p>
		<p>there are really two varieties of data:the explicit data that the end user enters<br />in a form and the behind-the-scenes HTTP information.<br />Both varieties are critical.The HTTP information includes cookies,information<br />about media types and compression schemes.</p>
		<p> </p>
		<p>Generate the results</p>
		<p>This process may require talking to a database,executing an RMI or EJB call,invoking<br />a Web service,or computing the response directly.<br />Your real data may be in a relational database.Fine.<br />But your database probably doesn't speak HTTP or return results in HTML,<br />so the Web browser can't talk directly to the database.Even if it could,for secutity<br />reasons,you probably would not want it to. The same argument applies to most other<br />applications.<br />You need the Web middle layer to extract the incoming data from the HTTP stream,talk<br />to the application,and embed the results inside a document.</p>
		<p> </p>
		<p>Send the explicit data (i.e.,the document)to the client.</p>
		<p>This document can be sent in a variety of formats,including text(HTML or XML),binary<br />(GIF images),<br />or even a compressed format like gzip that is layered on top of some other underlying format.<br />But,HTML is by far the most common format,so an important servlet/JSp task is to <br />wrap the results inside of HTML.</p>
		<p> </p>
		<p>
				<br />Send the implicit HTTP response data.</p>
		<p>there are really two varieties of data sent:<br />the document itself and the behind-the-scenes HTTP information.Again,both varieties are critical to effective development.<br />Sending HTTP response data involves telling the browser or other client what type of<br />documents is being returned(e.g.,HTML),setting cookies and caching parameters,and<br />other such tasks.</p>
		<p> </p>
		<p>************************************************************</p>
		<p>Servlet 的功能<br />　Servlet 是运行在Web 服务器或应用服务器上的JAVA程序，它是一个中间层，<br />负责连接来自Web浏览器或其他HTTP客户程序的请求和HTTP服务器上的数据库或应用程序。</p>
		<p>读取客户发送的显示数据<br />最终用户一般在网页的HTML表单中输入这些数据。然而，数据还有可能来自于applet 或定制的<br />HTTP客户程序。</p>
		<p>它们分别为用户在表单中输入的显示数据，以及后台的HTTP信息，两种数据都很重要。HTTP<br />信息包括cookie, 浏览器所能识别的媒体类型和压缩模式等。</p>
		<p> </p>
		<p> </p>
		<p>***********************************************************</p>
		<p> </p>
		<p>Sensitive                 敏感<br />Concuread                 可同时发生的<br />Absoluteposion            绝对位置<br />Cursor                    指针<br />granted                   准许<br />License                   许可，执照<br />involve                   包括<br />indirectly                间接的<br />directories               目录<br />ascirbe                   归因于</p>
		<p> </p>
		<p>
				<br />*******</p>
		<p>student_survey                 n 学生调查<br />Separator                      n 分隔符<br />generates                      v 生成  <br />CompareTO                      v 比较<br />Otherwise                      adv 否则，另外<br />Hierarchy                      n 层次　Class Hierarchy<br />compatibility                  兼容性<br />resources                      资源<br />Data resources                 数据源<br />Constructs                     v 创建<br />Functionality                  n 功能<br />Encodes                        v 编码<br />specified URL                  特定的URL<br />Raw                            原始</p>
		<p>
				<br />************************************************************</p>
		<p>
				<br />You call request.getParameter to get the value of a form parameter.<br />You can also call request.getParameterValues if the parameter appears more <br />than once you can call request.getParameterNames if you want a complete list of <br />all parameters in thecurrent request.<br />In the rare cases in which you need to read the raw request data and parse it <br />yourself,call getReader of getInputStream.</p>
		<p> </p>
		<p>********</p>
		<p>你可以调用request.getParameter 可以得到表单参数值。<br />如果参数多次出现，还可以调用request.getParameterValues.<br />如果希望得到当前请求中所有参数的完整列表，可以调用request.getParameterNames.<br />在极少数情况下，可能需要读取原始的请求数据对它自己进行分析，此时可以调用getReader或<br />getInputStream.</p>
		<p>
				<br />************************************************************03 Servelet 处理表单</p>
		<p>
				<br />Override        覆盖<br />Resource bundle      资源包<br />Scheme          模式<br />Template        模板<br />Wildcard        通配符<br />Internationalization      国际化<br />Authorization   鉴别<br />Authentication  授权<br />Native code     本机代码<br />Manipulation    处理</p>
		<p>Java syntax     Java语法<br />Standardizes    标准化<br />approach        路径<br />extensions      扩展<br />Vendor          卖主，供应商<br />Establish       建立</p>
		<p>
				<br />JDBC provides a standard library for accessing relational databases.<br />By using the JDBC API, you can access a wide variety of SQL databases with exactly<br />the same Java syntax.</p>
		<p>********翻译开始</p>
		<p>JDBC 提供一套访问关系型数据库的标准库。通过JDBC API ，我们可以适用完全相同的JAVA 语法访问大量各种各样的SQL数据库。</p>
		<p>
				<br />********</p>
		<p> </p>
		<p>It is important to note that although the JDBC API standardizes the approach for </p>
		<p>connection to databases,the syntax for sending queries and committing t<br />ransactions,<br />and the data structure representing the result,JDBC does not attmpt to standardize<br />the SQL syntax.</p>
		<p>*******翻译开始</p>
		<p>要主义，虽然JDBC API 标准化了数据库的连接方式，发送查询和提交事务的语法，以及表示结果的数据结构，但JDBC 并不试图将SQL的语法也标准化，了解这一点比较重要。</p>
		<p>********</p>
		<p> </p>
		<p>So,you can use any SQL extensions your database vendor supports.However,since most<br />queries follow standard SQL syntax,using JDBC lets you change database hosts,ports,and even database vendors with minimal changes to you code.</p>
		<p>
				<br />*******翻译开始</p>
		<p>故而，我们依旧可以使用数据库提供商支持的任何扩展，但是由于大多数查询都遵循标准的SQL语法。因此，在使用JDBC 的情况下，对代码做出很少的修改就可以更改数据的主机，端口，甚至数据库提供商。</p>
		<p>
				<br />*******</p>
		<p>Following is a summary;details are given in the rest of the section.</p>
		<p>Load the JDBC driver. To load a driver,you specify the classname of the database <br />driver in the Class.forName method.By doing so,you automatically create a driver<br />instance and register is with the JDBC driver manager.<br />Define the connection URL. In JDBC,a connection URL specifies the server host,<br />port ,and database name with which to establish a connection.</p>
		<p>*******翻译开始</p>
		<p>下面是一个汇总。<br />载入JDBC 驱动程序，如果要载入驱动程序，只需在Class.forName 方法中指定数据库驱动程序的类名。这样做就自动创建了驱动程序的实例，产注册到JDBC 驱动程序管理器。</p>
		<p>定义连接URL<br />在JDBC 中，连接URL 指定服务器的主机名，端口以及希望与之建立连接的数据库名。</p>
		<p>********<br />Estblish the connection.With the connection URL, username,and passwrod, a network<br />connection to the database can be established. Once the <br />connection is established,<br />database queries can be preformed until the connection is closed.<br />Create a Stantement object. Creating a Statement object enables you to send <br />queries and commands to the database.</p>
		<p>
				<br />*******翻译开始</p>
		<p>建立连接<br />有了连接URL,用户名和密码，就可以建立到数据库的网络连接。连接建立之后，就可以执行数据库的查询，直到数据关闭为止。<br />创建Statement 对象<br />创建Statement 对象才能向数据库发送查询和命令。</p>
		<p>
				<br />*************</p>
		<p>Execute a query or update. Give a Statement object, you can send SQL stateents to <br />the database by using the execute, executeQuery, executeUpdate, or executeBatch<br />methods.</p>
		<p>Process the results.When a database query is executed, a ResultSet is returned.<br />The ResultSet represents a set of rows and columns that you can process by calls <br />to next and various getXXX methods.</p>
		<p>Close the connection. When you are finished performing queries and processing <br />results, you should close the connection ,releasing resources to the database.</p>
		<p>
				<br />******翻译开始</p>
		<p>执行查询或更新<br />有了Statement 对象后，就可以用excute,excuteQuery,excuteUpdate 或 excuteBatch 方法<br />发送给SQL 语句到数据库。<br />结果处理<br />数据库查询执行完毕后，返回一个ResultSet 。ResultSet表示一系列的行和列，我们可以<br />调用next 和各种 getXXX方法对这些行和列进行处理。<br />关闭连接<br />在执行完查询且处理完结果之后，应该关闭连接，释放与数据库相连的资源。</p>
		<p>
				<br />**************************************************************<br />**** Cookies </p>
		<p>Cookies are small bits of textual information that a Web server sends to a <br />browser <br />and that the browser later returns unchanged when visiting the same Web site <br />of domain.<br />By letting the server read information it sent the client previously,the site can <br />provide visitors with a number of conveniences<br />such as presenting the site the way the visitor previously customized it or <br />letting identifiable visitors in without their having to reenter a password.</p>
		<p>
				<br />********翻译开始</p>
		<p>Cookie 是小段文本信息，由Web 服务器将它发送到浏览器，<br />之后，在访问同一网站或域时，浏览器又将它原封不动地返回。<br />通过让服务器读取它之前发送给客户程序的信息，站点可以为访问者提供诸多的便利，<br />比如按照访问者之前的定制呈现该站点，或让分身已通过验证者进入，不需要再次输入<br />密码。</p>
		<p>
				<br />************</p>
		<p>communicate          通话<br />dispatch             分布式的<br />processing           处理<br />match                匹配<br />ignored              忽略<br />overloaded           过载<br />Furthermore          此外<br />purposes             目的目标</p>
		<p>
				<br />************************* 05-Servlet 中处理会话 Session </p>
		<p> </p>
		<p>Separate       单独、分离<br />Persistent     持久，稳固<br />Multiple       多个、多样<br />Maintaining    维持、维修<br />Inadequacies   不足</p>
		<p> </p>
		<p>****</p>
		<p>HTTP is a "stateless" protocol:<br />each time a client retrieves a Web page,the client opens a separate connection to <br />the Web server and the server does not automatically maintain contextual <br />information .<br />about the client.Even with servers that support persistent(Keep-alive)HTTP<br />connections and keep sockets open for multiple client requests that occur<br />in rapid succession, there is no built-in support for maintaining contextual<br />information.</p>
		<p>This lack of context causes a number of difficulties.</p>
		<p>*******翻译开始 </p>
		<p>HTTP 是“无状态”协议：<br />客户程序每次读取Web页面，都会打开一个单独连接到Web服务器，并且服务器也不自动<br />维护客户的上下文信息。<br />即使哪些支持持续性HTTP 连接的服务器，尽管 多个客户请求连接发生且间隔很短时他们<br />会保持socket打开，但是，它们也没有提供维护上下文信息的内建支持。<br />上下文的缺失引起许多困难。</p>
		<p>
				<br />*******</p>
		<p>
				<br />For example, when clients at an online store add an item to their shopping carts,<br />how does the server know what's already in the carts?<br />Similarly, when clients decide to proceed to checkout, how can the server <br />determine which previously created shopping carts are theirs?<br />These questions seem very simple, yet, because of the inadequacies of HTTP,<br />answering them is surprisingly complicated.</p>
		<p>********翻译开始</p>
		<p>例如，在线商店的客户向它们的购物车加入商品时，服务器如何知道购物车中已有何种<br />物品呢？<br />类似的，在客户决定结账时，服务器如何能确定之前创建的购物车中哪个属于客户呢？<br />这些问题虽然看起来简单，但是由于HTTP的不足，解决它们却异常复杂困难。</p>
		<p> </p>
		<p>
				<br />***********</p>
		<p>
				<br />There are three typical solutions to this problem:cookies,URL rewriting,and<br />hidden form fields ,session</p>
		<p>
				<br />****翻译开始</p>
		<p>对于这个问题，存在四种解决方案：<br />cookie，URL重写隐藏的表单域和session</p>
		<p> </p>
		<p> </p>
		<p>*********************</p>
		<p>
				<br />initialization parameters        初始化参数<br />Reference                        引用<br />Logging                          日志<br />Encryption                       加密<br />Chain                            链<br />executing                        执行<br />tasks                            任务<br />Authentication                   压缩<br />conversion                       转换</p>
		<p> </p>
		<p>*******</p>
		<p>
				<br />A filter is a program that runs on the server before the servlet or JSP page<br />with which it is associated.</p>
		<p>A filter can be attached to one or more servlets or JSp pages and can examine<br />the request information going into these resources</p>
		<p> </p>
		<p>****************************</p>
		<p> </p>
		<p> </p>
		<p>                 <br /><br /></p>
<img src ="http://www.blogjava.net/computerboy/aggbug/36267.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-03-20 11:43 <a href="http://www.blogjava.net/computerboy/archive/2006/03/20/36267.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp数据库连接大全</title><link>http://www.blogjava.net/computerboy/archive/2006/03/17/35839.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Fri, 17 Mar 2006 08:01:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2006/03/17/35839.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/35839.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2006/03/17/35839.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/35839.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/35839.html</trackback:ping><description><![CDATA[ 一、jsp连接Oracle8/8i/9i数据库（用thin模式） <br />testoracle.jsp如下： <br />&lt; %@ page contentType="text/html;charset=gb2312"% &gt; <br />&lt; %@ page import="java.sql.*"% &gt; <br />&lt; html &gt; <br />&lt; body &gt; <br />&lt; %Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); <br />String url="jdbc:oracle:thin:@localhost:1521:orcl"; <br />//orcl为你的数据库的SID <br />String user="scott"; <br />String password="tiger"; <br />Connection conn= DriverManager.getConnection(url,user,password); <br />Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />String sql="select * from test"; <br />ResultSet rs=stmt.executeQuery(sql); <br />while(rs.next()) {% &gt; <br />您的第一个字段内容为：&lt; %=rs.getString(1)% &gt; <br />您的第二个字段内容为：&lt; %=rs.getString(2)% &gt; <br />&lt; %}% &gt; <br />&lt; %out.print("数据库操作成功，恭喜你");% &gt; <br />&lt; %rs.close(); <br />stmt.close(); <br />conn.close(); <br />% &gt; <br />&lt; /body &gt; <br />&lt; /html &gt; <br /><br />二、jsp连接Sql Server7.0/2000数据库 <br />testsqlserver.jsp如下： <br />&lt; %@ page contentType="text/html;charset=gb2312"% &gt; <br />&lt; %@ page import="java.sql.*"% &gt; <br />&lt; html &gt; <br />&lt; body &gt; <br />&lt; %Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); <br />String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"; <br />//pubs为你的数据库的 <br />String user="sa"; <br />String password=""; <br />Connection conn= DriverManager.getConnection(url,user,password); <br />Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />String sql="select * from test"; <br />ResultSet rs=stmt.executeQuery(sql); <br />while(rs.next()) {% &gt; <br />您的第一个字段内容为：&lt; %=rs.getString(1)% &gt; <br />您的第二个字段内容为：&lt; %=rs.getString(2)% &gt; <br />&lt; %}% &gt; <br />&lt; %out.print("数据库操作成功，恭喜你");% &gt; <br />&lt; %rs.close(); <br />stmt.close(); <br />conn.close(); <br />% &gt; <br />&lt; /body &gt; <br />&lt; /html &gt; <br /><br />三、jsp连接DB2数据库 <br />testdb2.jsp如下： <br />&lt; %@ page contentType="text/html;charset=gb2312"% &gt; <br />&lt; %@ page import="java.sql.*"% &gt; <br />&lt; html &gt; <br />&lt; body &gt; <br />&lt; %Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); <br />String url="jdbc:db2://localhost:5000/sample"; <br />//sample为你的数据库名 <br />String user="admin"; <br />String password=""; <br />Connection conn= DriverManager.getConnection(url,user,password); <br />Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />String sql="select * from test"; <br />ResultSet rs=stmt.executeQuery(sql); <br />while(rs.next()) {% &gt; <br />您的第一个字段内容为：&lt; %=rs.getString(1)% &gt; <br />您的第二个字段内容为：&lt; %=rs.getString(2)% &gt; <br />&lt; %}% &gt; <br />&lt; %out.print("数据库操作成功，恭喜你");% &gt; <br />&lt; %rs.close(); <br />stmt.close(); <br />conn.close(); <br />% &gt; <br />&lt; /body &gt; <br />&lt; /html &gt; <br /><br />四、jsp连接Informix数据库 <br />testinformix.jsp如下： <br />&lt; %@ page contentType="text/html;charset=gb2312"% &gt; <br />&lt; %@ page import="java.sql.*"% &gt; <br />&lt; html &gt; <br />&lt; body &gt; <br />&lt; %Class.forName("com.informix.jdbc.IfxDriver").newInstance(); <br />String url = <br />"jdbc:informix-sqli://123.45.67.89:1533/testDB:INFORMIXSERVER=myserver; <br />user=testuser;password=testpassword"; <br />//testDB为你的数据库名 <br />Connection conn= DriverManager.getConnection(url); <br />Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />String sql="select * from test"; <br />ResultSet rs=stmt.executeQuery(sql); <br />while(rs.next()) {% &gt; <br />您的第一个字段内容为：&lt; %=rs.getString(1)% &gt; <br />您的第二个字段内容为：&lt; %=rs.getString(2)% &gt; <br />&lt; %}% &gt; <br />&lt; %out.print("数据库操作成功，恭喜你");% &gt; <br />&lt; %rs.close(); <br />stmt.close(); <br />conn.close(); <br />% &gt; <br />&lt; /body &gt; <br />&lt; /html &gt; <br /><br />五、jsp连接Sybase数据库 <br />testmysql.jsp如下： <br />&lt; %@ page contentType="text/html;charset=gb2312"% &gt; <br />&lt; %@ page import="java.sql.*"% &gt; <br />&lt; html &gt; <br />&lt; body &gt; <br />&lt; %Class.forName("com.sybase.jdbc.SybDriver").newInstance(); <br />String url =" jdbc:sybase:Tds:localhost:5007/tsdata"; <br />//tsdata为你的数据库名 <br />Properties sysProps = System.getProperties(); <br />SysProps.put("user","userid"); <br />SysProps.put("password","user_password"); <br />Connection conn= DriverManager.getConnection(url, SysProps); <br />Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />String sql="select * from test"; <br />ResultSet rs=stmt.executeQuery(sql); <br />while(rs.next()) {% &gt; <br />您的第一个字段内容为：&lt; %=rs.getString(1)% &gt; <br />您的第二个字段内容为：&lt; %=rs.getString(2)% &gt; <br />&lt; %}% &gt; <br />&lt; %out.print("数据库操作成功，恭喜你");% &gt; <br />&lt; %rs.close(); <br />stmt.close(); <br />conn.close(); <br />% &gt; <br />&lt; /body &gt; <br />&lt; /html &gt; <br /><br />六、jsp连接MySQL数据库 <br />testmysql.jsp如下： <br />&lt; %@ page contentType="text/html;charset=gb2312"% &gt; <br />&lt; %@ page import="java.sql.*"% &gt; <br />&lt; html &gt; <br />&lt; body &gt; <br />&lt; %Class.forName("org.gjt.mm.mysql.Driver").newInstance(); <br />String url ="jdbc:mysql://localhost/softforum?user=soft&amp;password=soft1234&amp;useUnicode=true&amp;characterEncoding=8859_1" <br />//testDB为你的数据库名 <br />Connection conn= DriverManager.getConnection(url); <br />Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />String sql="select * from test"; <br />ResultSet rs=stmt.executeQuery(sql); <br />while(rs.next()) {% &gt; <br />您的第一个字段内容为：&lt; %=rs.getString(1)% &gt; <br />您的第二个字段内容为：&lt; %=rs.getString(2)% &gt; <br />&lt; %}% &gt; <br />&lt; %out.print("数据库操作成功，恭喜你");% &gt; <br />&lt; %rs.close(); <br />stmt.close(); <br />conn.close(); <br />% &gt; <br />&lt; /body &gt; <br />&lt; /html &gt; <br /><br />七、jsp连接PostgreSQL数据库 <br />testmysql.jsp如下： <br />&lt; %@ page contentType="text/html;charset=gb2312"% &gt; <br />&lt; %@ page import="java.sql.*"% &gt; <br />&lt; html &gt; <br />&lt; body &gt; <br />&lt; %Class.forName("org.postgresql.Driver").newInstance(); <br />String url ="jdbc:postgresql://localhost/soft" <br />//soft为你的数据库名 <br />String user="myuser"; <br />String password="mypassword"; <br />Connection conn= DriverManager.getConnection(url,user,password); <br />Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />String sql="select * from test"; <br />ResultSet rs=stmt.executeQuery(sql); <br />while(rs.next()) {% &gt; <br />您的第一个字段内容为：&lt; %=rs.getString(1)% &gt; <br />您的第二个字段内容为：&lt; %=rs.getString(2)% &gt; <br />&lt; %}% &gt; <br />&lt; %out.print("数据库操作成功，恭喜你");% &gt; <br />&lt; %rs.close(); <br />stmt.close(); <br />conn.close(); <br />% &gt; <br />&lt; /body &gt; <br />&lt; /html &gt; <br /> <img src ="http://www.blogjava.net/computerboy/aggbug/35839.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-03-17 16:01 <a href="http://www.blogjava.net/computerboy/archive/2006/03/17/35839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts表单校验</title><link>http://www.blogjava.net/computerboy/archive/2006/03/17/35799.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Fri, 17 Mar 2006 03:41:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2006/03/17/35799.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/35799.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2006/03/17/35799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/35799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/35799.html</trackback:ping><description><![CDATA[
		<h3>简要描述</h3>
		<p>Struts采用Validator框架（Validator框架现在是Jakarta Commons项目的一部分）来解决校验问题，它将校验规则代码集中到外部的且对具体的应用程序中立的.xml文件中，这样，就将那些到处出现的校验逻辑从应用程序中分离出来，任何一个Struts应用都可以使用这个文件，同时还为校验规则的扩展提供了便利。更难能可贵的是由于Validator框架将校验中要用到的一些消息等信息与资源绑定有机结合在一起，使得校验部分的国际化编程变得十分的便捷和自然。<br /><br /></p>
		<h3>主要构成</h3>
		<p>Validator框架大致有如下几个主要组件： </p>
		<ul>
				<li>校验类：<br />是Validator框架调用的一些Java类，它处理那些基本的通用的校验，包括required、mask（匹配正则表达式）、最小长度、最大长度、范围、日期等。校验类可以根据需要扩展。 
</li>
				<li>配置文件：<br />主要包括两个配置文件，一个是validator-rules.xml，主要包含一些通用的校验规则，另一个是validation.xml，包含需要校验的一些form及其组件的集合。 
</li>
				<li>资源绑定：<br />提供国际化标签和消息，缺省使用struts的资源绑定。即校验所用到的一些标签与消息都写在ApplicationResources.properities文件中。 
</li>
				<li>Jsp 标签：<br />为给定的form或者action path生成前端校验的 JavaScript 代码。 
</li>
				<li>ValidatorForm：<br />是ActionForm的一个子类。 </li>
		</ul>
		<h3>校验框架的使用</h3>
		<h4>1) 配置</h4>
		<p>在struts-config.xml文件中，最底下添加一组插件：</p>
		<p>　<font color="#000000" size="2"><font color="#000080">&lt;plug-in</font><font color="#000000">  </font><font color="#000080">className=</font><font color="#008000">"org.apache.struts.validator.ValidatorPlugIn"</font><font color="#000080">&gt;<br /></font><font color="#000000">         </font><font color="#000080">&lt;set-property</font><font color="#000000">  </font><font color="#000080">property=</font><font color="#008000">"pathnames"</font><font color="#000000">  <br />                       </font><font color="#000080">value="/WEB-INF/validator-rules.xml,<br /></font><font color="#000000">                              </font><font color="#000080">/WEB-INF/validation.xml"/&gt;<br /></font><font color="#000000">     </font><font color="#000080">&lt;/plug-in&gt;</font></font></p>
		<p>从struts的例子，拷贝文件 <font color="#000080" size="2">validator-rules.xml</font> 和 <font color="#000080" size="2">validation.xml ，</font>放到目录 /WEB-INF 下面</p>
		<h4>2) 校验定义</h4>
		<p>在<font color="#000080" size="2">validation.xml</font>文件中定义校验的表单和属性。</p>
		<p>
				<font color="#000080" size="2">例子：</font>
		</p>
		<p>
				<font color="#000000">
						<font size="2">
								<font face="ËÎÌå">    </font>
								<font color="#000080">&lt;form</font>
								<font color="#000000">  </font>
								<font color="#000080">name=</font>
								<font color="#008000">"customerForm"</font>
								<font color="#000080">&gt;<br /></font>
								<font color="#000000">             </font>
								<font color="#000080">&lt;field</font>
								<font color="#000000">  </font>
								<font color="#000080">property=</font>
								<font color="#008000">"name"</font>
								<font color="#000000">  </font>
								<font color="#000080">depends=</font>
								<font color="#008000">"required"</font>
								<font color="#000080">&gt;<br /></font>
								<font color="#000000">                 </font>
								<font color="#000080">&lt;arg0</font>
								<font color="#000000">  </font>
								<font color="#000080">key=</font>
								<font color="#008000">"customerForm.name"</font>
								<font color="#000080">/&gt;<br /></font>
								<font color="#000000">             </font>
								<font color="#000080">&lt;/field&gt;<br /></font>
								<font color="#000000">              </font>
								<font color="#000080">&lt;field</font>
								<font color="#000000">  </font>
								<font color="#000080">property=</font>
								<font color="#008000">"address"</font>
								<font color="#000000">  </font>
								<font color="#000080">depends=</font>
								<font color="#008000">"required"</font>
								<font color="#000080">&gt;<br /></font>
								<font color="#000000">                 </font>
								<font color="#000080">&lt;arg0</font>
								<font color="#000000">  </font>
								<font color="#000080">key=</font>
								<font color="#008000">"customerForm.address"</font>
								<font color="#000080">/&gt;<br /></font>
								<font color="#000000">             </font>
								<font color="#000080">&lt;/field&gt;<br /></font>
								<font color="#000000">         </font>
								<font color="#000080">&lt;/form&gt;<br /><br /></font>
						</font>
				</font>其中，表单名称customerForm必须在struts-config.xml中定义。</p>
		<p>property为表单的属性。</p>
		<p>depends为校验规则的名称。validator_rules.xml中缺省定义的校验规则请参考struts的文档。</p>
		<p>
				<font color="#000000" size="2">
						<font color="#000080">&lt;arg0</font>
						<font color="#000000">  </font>
						<font color="#000080">key=</font>
						<font color="#008000">"customerForm.name"</font>
						<font color="#000080">/&gt;</font>
				</font>指定校验规则中使用的消息在消息资源文件中的key值</p>
		<h4>3) 表单类继承</h4>
		<p>为了使服务器边的验证能够进行，将用到的formBean从ActionForm的子类改为ValidatorForm的子类，如：<br /></p>
		<p>
				<span class="syntax6">public</span>
				<span class="syntax6">class</span> BaseForm <span class="syntax6">extends</span> ValidatorForm <span class="syntax6">implements</span> Serializable <br /><br /></p>
		<h4>4) 客户端校验</h4>
		<p>要实现客户端校验，必须在提交的时候运行校验框架生成的javascript代码。</p>
		<p>在&lt;html:form&gt;标签中，添加属性 onsubmit="return validateCustomerForm(this)"</p>
		<p>在标签后加上：</p>
		<p>
				<font color="#008080" size="2">
						<font face="ËÎÌå">&lt;</font>
						<font color="#3f7f7f">html:javascript </font>
						<font color="#7f007f">formName</font>
						<font color="#000000">=</font>
						<font color="#2a00ff">"customerForm"  </font>
						<font color="#7f007f">cdata</font>
						<font color="#000000">=</font>
						<font color="#2a00ff">"false"<br />       </font>
						<font color="#7f007f">dynamicJavascript</font>
						<font color="#000000">=</font>
						<font color="#2a00ff">"true" </font>
						<font color="#7f007f">staticJavascript</font>
						<font color="#000000">=</font>
						<font color="#2a00ff">"false"</font>
						<font color="#008080">/&gt;<br />&lt;</font>
						<font color="#3f7f7f">script </font>
						<font color="#7f007f">type</font>
						<font color="#000000">=</font>
						<font color="#2a00ff">"text/javascript"<br />       </font>
						<font color="#7f007f">src</font>
						<font color="#000000">=</font>
						<font color="#2a00ff">"</font>
						<font color="#008080">&lt;</font>
						<font color="#3f7f7f">c:url</font>
						<font color="#000000">  </font>
						<font color="#7f007f">value</font>
						<font color="#000000">=</font>
						<font color="#2a00ff">"/scripts/validator.jsp"</font>
						<font color="#008080">/&gt;</font>
						<font color="#2a00ff">"</font>
						<font color="#008080">&gt;&lt;/</font>
						<font color="#3f7f7f">script</font>
						<font color="#008080">&gt;<br /></font>
				</font>
		</p>
		<h4>5) Action指定校验</h4>
		<p>在action的配置中加上指定校验的属性：validate="true"，如：</p>
		<p>　<font color="#000000" size="2"><font color="#000080">&lt;action</font><font color="#000000">  </font><font color="#000080">path=</font><font color="#008000">"/customer/customer"</font><font color="#000000">  <br />                </font><font color="#000080">type=</font><font color="#008000">"com.demo.order.actions.CustomerAction"</font><font color="#000000">  <br />                </font><font color="#000080">name=</font><font color="#008000">"customerForm"</font><font color="#000000">  <br />                </font><font color="#000080">parameter=</font><font color="#008000">"method"</font><font color="#000000">  <br />                </font><font color="#000080">input=</font><font color="#008000">"add"<br /></font><font color="#000000">                </font><font color="#000080">unknown=</font><font color="#008000">"false"<br /></font><font color="#000000">                </font></font><font color="#ff00ff" size="2">validate</font><font color="#000000" size="2"><font color="#000080">=</font><font color="#008000">"true"<br /></font><font color="#000000">                </font><font color="#000080">&gt;<br /></font><font color="#000000">            </font><font color="#000080">&lt;forward</font><font color="#000000">  </font><font color="#000080">name=</font><font color="#008000">"view"</font><font color="#000000">  </font><font color="#000080">path=</font><font color="#008000">"model.customer.view"</font><font color="#000080">&gt;<br /></font><font color="#000000">            </font><font color="#000080">&lt;/forward&gt;<br /></font><font color="#000000">            </font><font color="#000080">&lt;forward</font><font color="#000000">  </font><font color="#000080">name=</font><font color="#008000">"add"</font><font color="#000000">  </font><font color="#000080">path=</font><font color="#008000">"model.customer.add"</font><font color="#000080">&gt;<br /></font><font color="#000000">            </font><font color="#000080">&lt;/forward&gt;<br /></font><font color="#000000">            </font><font color="#000080">&lt;forward</font><font color="#000000">  </font><font color="#000080">name=</font><font color="#008000">"list"</font><font color="#000000">  </font><font color="#000080">path=</font><font color="#008000">"model.customer.list"</font><font color="#000080">&gt;<br /></font><font color="#000000">            </font><font color="#000080">&lt;/forward&gt;<br /><br /></font><font color="#000000">        </font><font color="#000080">&lt;/action&gt;<br /></font></font></p>
<img src ="http://www.blogjava.net/computerboy/aggbug/35799.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-03-17 11:41 <a href="http://www.blogjava.net/computerboy/archive/2006/03/17/35799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些常用Java站和下载地址</title><link>http://www.blogjava.net/computerboy/archive/2006/01/06/26830.html</link><dc:creator>Computerboy</dc:creator><author>Computerboy</author><pubDate>Fri, 06 Jan 2006 01:46:00 GMT</pubDate><guid>http://www.blogjava.net/computerboy/archive/2006/01/06/26830.html</guid><wfw:comment>http://www.blogjava.net/computerboy/comments/26830.html</wfw:comment><comments>http://www.blogjava.net/computerboy/archive/2006/01/06/26830.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/computerboy/comments/commentRss/26830.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/computerboy/services/trackbacks/26830.html</trackback:ping><description><![CDATA[
		<p>Java 站：<br />　1、 <a href="http://java.sun.com/">http://java.sun.com/</a> ;(英文) <br />Sun的Java网站，是一个应该经常去看的地方。不用多说。 </p>
		<p>2、 <a href="http://www-900.ibm.com/developerWorks/cn/">http://www-900.ibm.com/developerWorks/cn/</a> ;<br />IBM的developerWorks网站，英语好的直接去英文主站点看。这里不但是一个极好的面向对象的分析设计网站，也是Web Services，Java，Linux极好的网站。强烈推荐！！！ </p>
		<p>3、 <a href="http://www.java-cn.com/">http://www.java-cn.com/</a> ;(中文) <br />JAVA中文站，目前国内资料最全、会员最多的JAVA技术网站，人气极高。有《JAVA电子书库》、《JAVA视频库》(国内唯一)、《JAVA技术文摘库》、《JAVA源代码库》、《JAVA工具库》、《招聘求职广场》等主要栏目，还有一些专家栏目。目前会员有5万多，VIP会员近1000人。无论是菜鸟还是老鸟，都能在此网站中找到自己所需要的东东！！ 最强烈推荐！！！！！！ </p>
		<p>4、 <a href="http://www.javaworld.com/">http://www.javaworld.com/</a> ;(英文) <br />关于Java很多新技术的讨论和新闻。想多了解Java的方方面面的应用，这里比较好。 </p>
		<p>5、 <a href="http://dev2dev.bea.com.cn/index.jsp">http://dev2dev.bea.com.cn/index.jsp</a> ;<br />BEA的开发者园地，BEA作为最重要的App Server厂商，有很多独到的技术，在Weblogic上做开发的朋友不容错过。 </p>
		<p>6、 <a href="http://www.huihoo.com/">http://www.huihoo.com/</a> ;<br />灰狐动力网站，一个专业的中间件网站，虽然不是专业的Java网站，但是在J2EE企业应用技术方面有深厚的造诣。 </p>
		<p>7、 <a href="http://www.theserverside.com/home/">http://www.theserverside.com/home/</a> ;(英文) <br />TheServerSide是一个著名的专门面向Java Server端应用的网站。 </p>
		<p>8、 <a href="http://www.javaresearch.org/">http://www.javaresearch.org/</a> ;<br />Java研究组织，有很多优秀的Java方面的文章和教程，特别是在JDO方面的文章比较丰富。 </p>
		<p>9、 <a href="http://www.cnjsp.org/">http://www.cnjsp.org/</a> ;<br />JSP技术网站，有相当多的Java方面的文章和资源。 </p>
		<p>10、 <a href="http://www.jdon.com/">http://www.jdon.com/</a> ;</p>
		<p>还有<a href="http://www.javaeye.com">www.javaeye.com</a><br /><br /><br />下载地址：<br /><br />相关下载 ModelsTry_SSH_V1下载，请点击<a href="http://www.modelstry.net/download_license.asp?file=modelstry31.zip">这里 </a><br />ModelsTry_SSH_V1的评估版License下载，请点击<a href="http://www.modelstry.net/download_license.asp?file=sunbor_license.zip">这里 </a><br />ModelsTry属性编辑器下载，请点击<a href="http://www.modelstry.net/download_license.asp?file=properties31.zip">这里</a><br />ModelsTry安装演示录像的下载，请点击<a href="ftp://modelstry:modelstry@61.129.117.61/install.zip">这里</a>下载；并请阅读<a href="http://www.modelstry.net/setup.asp">安装说明</a><br />ModelsTry使用演示录像的下载，请点击<a href="ftp://modelstry:modelstry@61.129.117.61/use_modelstry.zip">这里下载</a>。 <br />下载JDK 5.0，请到 <br />http://java.sun.com/j2se/downloads.html 下载<br />Eclipse 3.1 SDK 和GEF3.1，请到http://www.eclipse.org/downloads/index.php <br />Eclipse3.2发布了：<br />官方下载：<br /><a href="http://download.eclipse.org/eclipse/downloads/drops/S-3.2M6-200603312000/index.php" target="_new"><u><font color="#0000ff">http://download.eclipse.org/eclipse/downloads/drops/S-3.2M6-200603312000/index.php</font></u></a></p>
		<p>通过Jpetstore学习WSAD、ROSE、WEBSPHERE<br /><a href="http://www.matrix.org.cn/resource/article/43/43859_Jpetstore_Websphere.html">http://www.matrix.org.cn/resource/article/43/43859_Jpetstore_Websphere.html</a><br /><br />Tomcat 网站:<br /><a href="http://jakarta.apache.org/tomcat">http://jakarta.apache.org/tomcat</a><br /><br />BEA Weblogic 网站:<br /><a href="http://commerce.bea.com/index.jsp">http://commerce.bea.com/index.jsp</a><br /><br />IBM Webshpere 网站:<br /><a href="http://www7b.software.ibm.com">http://www7b.software.ibm.com</a><br />developerWorks中文网站的连接是：<br /><a href="http://www-900.ibm.com/developerWorks/cn/wsdd/">http://www-900.ibm.com/developerWorks/cn/wsdd/</a><br /><br />Jboss 下载:<br /><a href="http://www.jboss.org/index.html">http://www.jboss.org/index.html</a><br /><br />BEA dev2dev在线<br /><a href="http://dev2dev.bea.com.cn/">http://dev2dev.bea.com.cn/</a><br /><br /></p>
<img src ="http://www.blogjava.net/computerboy/aggbug/26830.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-01-06 09:46 <a href="http://www.blogjava.net/computerboy/archive/2006/01/06/26830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>