﻿<?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-junmy不断地学习-随笔分类-转载的文章</title><link>http://www.blogjava.net/wujun/category/10508.html</link><description>不断地学习
&lt;br&gt;
踏踏实实做技术....学而不思则罔，思而不学则殆。——《论语·为政》
&lt;br&gt;
...&lt;!--
target=_blank
&lt;font color=red&gt;

&lt;script type="text/javascript" src="http://fastonlineusers.com/on2.php?

d=www.blogjava.net/wujun"&gt;&lt;/script&gt; online&lt;/a&gt;&lt;/font&gt;
--&gt;
&lt;br&gt;
&lt;!--&lt;script src="http://www.NewZGC.com/others/counter/counter.asp?username=wujun2008&amp;style=10"&gt;&lt;/script&gt;--&gt;
&lt;br&gt;
</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:39:34 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:39:34 GMT</pubDate><ttl>60</ttl><item><title>谷歌啊谷歌,要做就做专业点别误导人</title><link>http://www.blogjava.net/wujun/archive/2007/01/23/google_suggestion.html</link><dc:creator>junmy</dc:creator><author>junmy</author><pubDate>Tue, 23 Jan 2007 12:06:00 GMT</pubDate><guid>http://www.blogjava.net/wujun/archive/2007/01/23/google_suggestion.html</guid><wfw:comment>http://www.blogjava.net/wujun/comments/95598.html</wfw:comment><comments>http://www.blogjava.net/wujun/archive/2007/01/23/google_suggestion.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wujun/comments/commentRss/95598.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wujun/services/trackbacks/95598.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: google改的速度还真块。。有的关键字已经不行了~&nbsp;&nbsp;<a href='http://www.blogjava.net/wujun/archive/2007/01/23/google_suggestion.html'>阅读全文</a><img src ="http://www.blogjava.net/wujun/aggbug/95598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wujun/" target="_blank">junmy</a> 2007-01-23 20:06 <a href="http://www.blogjava.net/wujun/archive/2007/01/23/google_suggestion.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>microsoft  All Downloads</title><link>http://www.blogjava.net/wujun/archive/2006/07/19/59009.html</link><dc:creator>junmy</dc:creator><author>junmy</author><pubDate>Wed, 19 Jul 2006 08:10:00 GMT</pubDate><guid>http://www.blogjava.net/wujun/archive/2006/07/19/59009.html</guid><wfw:comment>http://www.blogjava.net/wujun/comments/59009.html</wfw:comment><comments>http://www.blogjava.net/wujun/archive/2006/07/19/59009.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wujun/comments/commentRss/59009.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wujun/services/trackbacks/59009.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: microsoft  All Downloads&nbsp;&nbsp;<a href='http://www.blogjava.net/wujun/archive/2006/07/19/59009.html'>阅读全文</a><img src ="http://www.blogjava.net/wujun/aggbug/59009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wujun/" target="_blank">junmy</a> 2006-07-19 16:10 <a href="http://www.blogjava.net/wujun/archive/2006/07/19/59009.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>夏昕ibatisiBATIS 2.0 开发指南配置文件说明</title><link>http://www.blogjava.net/wujun/archive/2006/05/24/47774.html</link><dc:creator>junmy</dc:creator><author>junmy</author><pubDate>Wed, 24 May 2006 02:47:00 GMT</pubDate><guid>http://www.blogjava.net/wujun/archive/2006/05/24/47774.html</guid><wfw:comment>http://www.blogjava.net/wujun/comments/47774.html</wfw:comment><comments>http://www.blogjava.net/wujun/archive/2006/05/24/47774.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/wujun/comments/commentRss/47774.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wujun/services/trackbacks/47774.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 夏昕ibatisiBATIS 2.0 开发指南[配置文件说明。。。。。。。。。。。。。&nbsp;&nbsp;<a href='http://www.blogjava.net/wujun/archive/2006/05/24/47774.html'>阅读全文</a><img src ="http://www.blogjava.net/wujun/aggbug/47774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wujun/" target="_blank">junmy</a> 2006-05-24 10:47 <a href="http://www.blogjava.net/wujun/archive/2006/05/24/47774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用MiddleGen 产生hibernate的数据库表映射文件</title><link>http://www.blogjava.net/wujun/archive/2006/05/16/46299.html</link><dc:creator>junmy</dc:creator><author>junmy</author><pubDate>Mon, 15 May 2006 16:11:00 GMT</pubDate><guid>http://www.blogjava.net/wujun/archive/2006/05/16/46299.html</guid><wfw:comment>http://www.blogjava.net/wujun/comments/46299.html</wfw:comment><comments>http://www.blogjava.net/wujun/archive/2006/05/16/46299.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wujun/comments/commentRss/46299.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wujun/services/trackbacks/46299.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 虽然myEclipse也可以生成，但是这种方式也看一下...也还是不错的..&nbsp;&nbsp;<a href='http://www.blogjava.net/wujun/archive/2006/05/16/46299.html'>阅读全文</a><img src ="http://www.blogjava.net/wujun/aggbug/46299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wujun/" target="_blank">junmy</a> 2006-05-16 00:11 <a href="http://www.blogjava.net/wujun/archive/2006/05/16/46299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>prototype.js</title><link>http://www.blogjava.net/wujun/archive/2006/05/09/45306.html</link><dc:creator>junmy</dc:creator><author>junmy</author><pubDate>Tue, 09 May 2006 15:38:00 GMT</pubDate><guid>http://www.blogjava.net/wujun/archive/2006/05/09/45306.html</guid><wfw:comment>http://www.blogjava.net/wujun/comments/45306.html</wfw:comment><comments>http://www.blogjava.net/wujun/archive/2006/05/09/45306.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wujun/comments/commentRss/45306.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wujun/services/trackbacks/45306.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 覆盖版本 1.3.1																																																								1. Prototype是什么?																																		或许你还没有用过它， prototype.js 是一个由Sam Stephenson写的JavaScript包。...&nbsp;&nbsp;<a href='http://www.blogjava.net/wujun/archive/2006/05/09/45306.html'>阅读全文</a><img src ="http://www.blogjava.net/wujun/aggbug/45306.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wujun/" target="_blank">junmy</a> 2006-05-09 23:38 <a href="http://www.blogjava.net/wujun/archive/2006/05/09/45306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP常用问答 </title><link>http://www.blogjava.net/wujun/archive/2006/05/04/44547.html</link><dc:creator>junmy</dc:creator><author>junmy</author><pubDate>Thu, 04 May 2006 10:36:00 GMT</pubDate><guid>http://www.blogjava.net/wujun/archive/2006/05/04/44547.html</guid><wfw:comment>http://www.blogjava.net/wujun/comments/44547.html</wfw:comment><comments>http://www.blogjava.net/wujun/archive/2006/05/04/44547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wujun/comments/commentRss/44547.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wujun/services/trackbacks/44547.html</trackback:ping><description><![CDATA[<p>
				<span class="Title">JSP常用问答</span>
		</p>
		<p>1、如何混合使用Jsp和SSI #include? <br />在JSP中可以使用如下方式包含纯HTML： <br />&lt;!--#include file="data.inc"--&gt; <br />但是如果data.inc中包含JSP CODE ，我们可以使用： <br />&lt;<a href="mailto:%@include">%@include</a> file="data.inc"%&gt; </p>
		<p>
				<br />2、如何执行一个线程安全的JSP? <br />只需增加如下指令 <br />&lt;%@ page isThreadSafe="false" %&gt; </p>
		<p>
				<br />3、JSP如何处理HTML FORM中的数据? <br />通过内置的request对象即可，如下： <br />&lt;% <br />String item = request.getParameter("item"); <br />int howMany = new Integer(request.getParameter("units")).intValue(); <br />%&gt; </p>
		<p>
				<br />4、在JSP如何包含一个静态文件? <br />静态包含如下：&lt;%@ include file="copyright.html" %&gt; <br />动态包含如下：&lt;jsp:include page="copyright.html" flush="true"/&gt; </p>
		<p>
				<br />5、在JSP中如何使用注释? <br />主要有四中方法： <br />1。&lt;%-- 与 --%&gt; <br />2。// <br />3。/**与**/ <br />4。&lt;!--与--&gt; </p>
		<p>
				<br />6、在JSP中如何执行浏览重定向? <br />使用如下方式即可：response.sendRedirect("<a href="http://ybwen.home.chinaren.com/index.html">http://ybwen.home.chinaren.com/index.html</a>"); <br />也能物理地改变HTTP HEADER属性，如下： <br />&lt;% <br />response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); <br />String newLocn="/newpath/index.html"; <br />response.setHeader("Location",newLocn); <br />%&gt; </p>
		<p>
				<br />7、如何防止在JSP或SERVLET中的输出不被BROWSER保存在CACHE中? <br />把如下脚本加入到JSP文件的开始即可： <br />&lt;% <br />response.setHeader("Cache-Control","no-store"); //HTTP 1.1 <br />response.setHeader("Pragma","no-cache"); //HTTP 1.0 <br />response.setDateHeader ("Expires", 0); //prevents caching at the proxy server <br />%&gt; </p>
		<p>
				<br />8、在JSP中如何设置COOKIE? <br />COOKIE是作为HTTP HEADER的一部分被发送的，如下方法即可设置： <br />&lt;% <br />Cookie mycookie = new Cookie("aName","aValue"); <br />response.addCookie(mycookie); <br />%&gt; </p>
		<p>
				<br />9、在JSP中如何删除一个COOKIE? <br />&lt;% <br />Cookie killMyCookie = new Cookie("mycookie", null); <br />killMyCookie.setMaxAge(0); <br />killMyCookie.setPath("/"); <br />response.addCookie(killMyCookie); <br />%&gt; </p>
		<p>
				<br />10、在一个JSP的请求处理中如何停止JSP的执行 <br />如下例： <br />&lt;% <br />if (request.getParameter("wen") != null) { <br />// do something <br />} else { <br />return; <br />} <br />%&gt; </p>
		<p>
				<br />11、在JSP中如何定义方法 <br />你可以定义方法，但是你不能直接访问JSP的内置对象，而是通过参数的方法传递。如下： <br />&lt;%! <br />public String howBadFrom(HttpServletRequest req) { <br />HttpSession ses = req.getSession(); <br />... <br />return req.getRemoteHost(); <br />} <br />%&gt; <br />&lt;% <br />out.print("in general,lao lee is not baddie "); <br />%&gt; <br />&lt;%= howBadFrom(request) %&gt; </p>
		<p>
				<br />12、如果BROWSER已关闭了COOKIES，在JSP中我如何打开SESSION来跟踪 <br />使用URL重写即可，如下： <br />hello1.jsp <br />&lt;%@ page session="true" %&gt; <br />&lt;% <br />Integer num = new Integer(100); <br />session.putValue("num",num); <br />String url =response.encodeURL("hello2.jsp"); <br />%&gt; <br />&lt;a href=&lt;%=url%&gt;&gt;hello2.jsp&lt;/a&gt; </p>
		<p>hello2.jsp <br />&lt;%@ page session="true" %&gt; <br />&lt;% <br />Integer i= (Integer )session.getValue("num"); <br />out.println("Num value in session is "+i.intValue()); <br />%&gt; </p>
		<p>
				<br />13、在JSP中能发送EMAIL吗 <br />可以使用SUN的专用包：sun.net.smtp包。如下脚本使用SmtpClient类发送EMAIL。 <br />&lt;%@ page import="sun.net.smtp.SmtpClient, java.io.*" %&gt; <br />&lt;% <br />String from="<a href="mailto:ybwen@sina.com">ybwen@sina.com</a>"; <br />String to="<a href="mailto:hewenjun@yeah.net">hewenjun@yeah.net</a>, <a href="mailto:lei@who.com.cn">lei@who.com.cn</a>"; <br />try{ <br />SmtpClient client = new SmtpClient("mail.xxxxx.xxx"); <br />client.from(from); <br />client.to(to); <br />PrintStream message = client.startMessage(); <br />message.println("To: " + to); <br />message.println("Subject: Sending email from JSP!"); <br />message.println("This was sent from a JSP page!"); <br />message.println(); <br />message.println("Cool! :-)"); <br />message.println(); <br />message.println("Good Boy"); <br />message.println("Im in genius.com"); <br />message.println(); <br />client.closeServer(); <br />} <br />catch (IOException e){ <br />System.out.println("ERROR SENDING EMAIL:"+e); <br />} <br />%&gt; </p>
		<p>
				<br />14、在SERVLET中我能调用一个JSP错误页吗 <br />当然没问题，如下展示了如何在一个SERVLET控制逻辑单元内调用一个JSP错误页面。 <br />protected void sendErrorRedirect(HttpServletRequest request, <br />HttpServletResponse response, String errorPageURL, <br />Throwable e) <br />throws ServletException, IOException { <br />request.setAttribute ("javax.servlet.jsp.jspException", e); <br />getServletConfig().getServletContext(). <br />getRequestDispatcher(errorPageURL).forward(request, <br />response); <br />} </p>
		<p>public void doPost(HttpServletRequest request,HttpServletResponse response) { <br />try { <br />// do something <br />} catch (Exception ex) { <br />try { <br />sendErrorRedirect(request,response,"/jsp/MyErrorPage.jsp",ex); <br />} catch (Exception e) { <br />e.printStackTrace(); <br />} <br />} <br />} </p>
		<p>
				<br />15、JSP和APPLET如何通讯 <br />JSP如何与EJB SessionBean通讯 <br />下面的代码段作了很好的示范 <br />&lt;%@ page import="javax.naming.*, javax.rmi.PortableRemoteObject, <br />foo.AccountHome, foo.Account" %&gt; <br />&lt;%! <br />//定义一个对SessionBeanHome接口实例的全局引用 <br />AccountHome accHome=null; </p>
		<p>public void jspInit() { <br />//获得Home接口实例 <br />InitialContext cntxt = new InitialContext( ); <br />Object ref= cntxt.lookup("java:comp/env/ejb/AccountEJB"); <br />accHome = (AccountHome)PortableRemoteObject.narrow(ref,AccountHome.class); <br />} <br />%&gt; <br />&lt;% <br />//实例化SessionBean <br />Account acct = accHome.create(); <br />//调用远程方法 <br />acct.doWhatever(...); <br />// 如此等等 <br />%&gt; </p>
		<p>
				<br />16、当我使用一个结果集时，如何防止字段为"null"的字域显示在我的HTML输入文本域中? <br />可以定义一个简单的函数来达到目的，如下： <br />&lt;%! <br />String blanknull(String s) { <br />return (s == null) ? "" : s; <br />} <br />%&gt; </p>
		<p>然后在JSP的FORM中，可以这样使用 <br />&lt;input type="text" name="shoesize" value="&lt;%=blanknull(shoesize)%&gt;"&gt; </p>
		<p>
				<br />17、如何中SERVLET或JSP下载一个文件（如：binary,text,executable)？ <br />现提供两个解决方案： <br />A：使用HTTP， <br />B：在Servlet中，通过设置ContentType和使用java.io包的Stream等类可作到.例如： <br />response.setContentType("application/x-msword"); <br />然后想输出缓冲中写一些东东即可。 </p>
		<p>18、使用useBean标志初始化BEAN时如何接受初始化参数 <br />使用如下两标签即可： <br />&lt;jsp:getProperty name="wenBean" property="someProperty"/&gt; <br />&lt;jsp:setProperty name="wenBean" property="someProperty" value="someValue"/&gt; </p>
		<p>19、使用JSP如何获得客户浏览器的信息？ <br />使用request.getHeader(String)即可 </p>
		<p>
				<br />20、能象调用子程序一样调用JSP吗？ <br />当然可以，用&lt;jsp:include page="relativeURL" flush="true"/&gt; </p>
		<p>
				<br />21、当我重编译我的JSP使用的一个类后，为什么JVM继续使用我的老CLASS？ </p>
		<p>
				<br />&lt;<a href="mailto:%@include">%@include</a> file="abc.jsp"%&gt;与&lt;jsp:include page="abc.jsp"/&gt;之间的差别？ <br />前一个为静态包含，而后一个为动态包含 </p>
		<p>
				<br />22、JSP的缺点？ <br />1。对JAVA程序进行调试没有好东东 <br />2。因大多数的servlet引擎不支持connection pooling <br />3。Servlet引擎没有标准 <br />4。JSP与其它脚本语言的交互 </p>
		<p>
				<br />23、JSP能进行递归调用吗？ <br />当然可以,如对form的提交给本页 </p>
		<p>
				<br />34、如何实现JSP的国际化？ <br />为各种版本提供resource bundles属性文件即可 </p>
		<p>25、在JSP中如何写文本文件？ <br />使用PrintWriter对象，如： <br />&lt;%@ page import="java.io.*" %&gt; <br />&lt;% <br />String str = "print me"; <br />String nameOfTextFile = "/usr/anil/imp.txt"; <br />try { <br />PrintWriter pw = new PrintWriter(new FileOutputStream(nameOfTextFile)); <br />pw.println(str); <br />pw.close(); <br />} catch(IOException e) { <br />out.println(e.getMessage()); <br />} <br />%&gt; </p>
		<p>
				<br />26、如何在JSP中包括绝对路径文件？ <br />使用URLConnection即可。 </p>
		<p>
				<br />27、在servlets和JSP之间能共享session对象吗？ <br />当然可以， <br />HttpSession session = request.getSession(true); <br />session.putValue("variable","value"); </p>
		<p>
				<br />28、JavaScript的变量能复制到JSP的SESSION中吗？ </p>
		<p>
				<br />29、如何设置cookie在某一时间后过期？ <br />用Cookie.setMaxAge(int) </p>
		<p>
				<br />30、如何获得当前的sessions数？ <br />可以使用HttpSessionBindingListeners来跟踪 </p>
		<p>
				<br />31、能设置一些代码在我所有的JSP文件之上运行？如果可以，能共享吗？ <br />当然可以,可以为你的JSP文件定义一个别名:/jsp/=ybwen.genius.myPreprocessingServlet,而以/jsp/为前缀的文件可以使用 </p>
		<p>
				<br />32、对一个JSP页，如果多个客户端同时请求它，同步可能吗？ <br />在jsp:useBean语法中使用beanName有何好处？ <br />beanName使用Beans.instantiate()初始化Bean </p>
		<p>
				<br />33、当我使用&lt;jsp:forward&gt;时，在浏览器的地址栏没有改变？ <br />使用response.sendRedirect("newURL") </p>
		<p>
				<br />34、如何转换JSP 0.9版本的文件到JSP1.1? <br />可使用sed/awk即可 </p>
		<p>
				<br />35、使用JSP能设置HTML FORM中输入域的焦点，不用JavaScript? <br />没办法 </p>
		<p>
				<br />36、使用JSP连接到数据库连接缓冲池的最好方法是什么？ <br />1.使用JDBC2。0中带有此服务的Driver <br />2.使用提供有此服务的Application server <br />3.自己写</p>
		<br />
		<br />
		<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=698057</p><img src ="http://www.blogjava.net/wujun/aggbug/44547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wujun/" target="_blank">junmy</a> 2006-05-04 18:36 <a href="http://www.blogjava.net/wujun/archive/2006/05/04/44547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp数据库连接大全和数据库操作封装到Javabean</title><link>http://www.blogjava.net/wujun/archive/2006/04/26/43429.html</link><dc:creator>junmy</dc:creator><author>junmy</author><pubDate>Wed, 26 Apr 2006 14:26:00 GMT</pubDate><guid>http://www.blogjava.net/wujun/archive/2006/04/26/43429.html</guid><wfw:comment>http://www.blogjava.net/wujun/comments/43429.html</wfw:comment><comments>http://www.blogjava.net/wujun/archive/2006/04/26/43429.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wujun/comments/commentRss/43429.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wujun/services/trackbacks/43429.html</trackback:ping><description><![CDATA[<strong>
				<font size="4">
						<p align="right">
								<font size="4">
								</font>
								<font color="#333333">来源</font>
								<font color="#333333">： http://blog.csdn.net/cm4ever/</font>
						</p>
						<br />一、jsp连接Oracle8/8i/9i数据库（用thin模式）<br /></font>
		</strong>testOracle.jsp如下： 
<table width="0%" border="1"><tbody><tr><td valign="top"><p style="FONT-SIZE: 9pt"><font color="#993300">&lt;%</font>@ page <font color="#0000ff">contentType</font>=<font color="#999999">"text/html;charset=gb2312"</font><font color="#993300">%&gt;</font><br /><font color="#993300">&lt;%</font>@ page <font color="#0000ff">import</font>=<font color="#999999">"java.sql.*"</font><font color="#993300">%&gt;</font><br /><font color="#993300">&lt;%</font><br />    <font color="#ff0000">String</font> result = ""; <font color="#009900">// 查询结果字符串</font><br /><br />    <font color="#ff0000">String</font> sql = <font color="#999999">"select * from test"</font>; <font color="#009900">// SQL 字符串</font><br /><br /><font color="#009900">    // 连接字符串，格式： "jdbc:数据库驱动名称:连接模式:@数据库服务器ip:端口号:数据库SID"</font><br />    <font color="#ff0000">String</font> url = <font color="#999999">"jdbc:oracle:thin:@localhost:1521:orcl"</font>;<br />    <font color="#ff0000">String</font> username = <font color="#999999">"scott"</font>; <font color="#009900">// 用户名</font><br />    <font color="#ff0000">String</font> password = <font color="#999999">"tiger"</font>; <font color="#009900">//密码</font><br /><br />    <font color="#009900">// 创建oracle数据库驱动实例</font><br /><font color="#ff0000">    Class</font>.<font color="#ff9900">forName</font>(<font color="#999999">"oracle.jdbc.driver.OracleDriver"</font>).<font color="#ff9900">newInstance</font>();<br /><br /><font color="#009900">    // 获得与数据库的连接</font><br />    <font color="#ff0000">Connection</font> conn = <font color="#ff0000">DriverManager</font>.<font color="#ff9900">getConnection</font>(url, username, password); <br /><font color="#009900">    // 创建执行语句对象</font><br />    <font color="#ff0000">Statement</font>  stmt = conn.<font color="#ff9900">createStatement</font>();<br /><font color="#009900">    // 执行sql语句，返回结果集</font><br />    <font color="#ff0000">ResultSet</font>  rs   = stmt.<font color="#ff9900">executeQuery</font>(sql);<br /><br />    <font color="#0000ff">while</font> ( rs.<font color="#ff9900">next</font>() ) <br />    {<br />        result += <font color="#999999">"\n 第一个字段内容："</font> + rs.<font color="#ff9900">getString</font>(1) + <font color="#999999">"&lt;BR&gt;"</font>;<br />    }<br /><br />    rs.<font color="#ff9900">close</font>(); <font color="#009900">// 关闭结果集</font><br />    stmt.<font color="#ff9900">close</font>(); <font color="#009900">// 关闭执行语句对象</font><br />    conn.<font color="#ff9900">close</font>(); <font color="#009900">// 关闭与数据库的连接</font><br /><font color="#993300">%&gt;</font><br /><br /><font color="#0000ff">&lt;HTML&gt;<br />&lt;BODY&gt;</font><br /><font color="#0000ff">  </font><font color="#993300">&lt;%</font>=result<font color="#993300">%&gt;</font><font color="#0000ff"><br />&lt;/BODY&gt;<br />&lt;/HTML&gt;</font></p></td></tr></tbody></table><br /><font size="+1"><b>二、jsp连接Sql Server7.0/2000数据库</b></font><br />testSqlServer.jsp如下 
<table width="0%" border="1"><tbody><tr><td valign="top"><p style="FONT-SIZE: 9pt"><font color="#993300">&lt;%</font>@ page <font color="#0000ff">contentType</font>=<font color="#999999">"text/html;charset=gb2312"</font><font color="#993300">%&gt;</font><br /><font color="#993300">&lt;%</font>@ page <font color="#0000ff">import</font>=<font color="#999999">"java.sql.*"</font><font color="#993300">%&gt;</font><br /><font color="#993300">&lt;%</font><br />    <font color="#ff0000">String</font> sql = <font color="#999999">"select * from test"</font>;<br /><br /><font color="#009900">    // 连接字符串，格式： "jdbc:公司名称:数据库驱动名称://数据库服务器ip:端口号;DatabaseName=数据库名称"</font><br />    <font color="#ff0000">String</font> url = <font color="#999999">"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"</font>;<br />    <font color="#ff0000">String</font> username = <font color="#999999">"scott"</font>;<font color="#ff0000"><br />    String</font> password = <font color="#999999">"tiger"</font>;<br /><br /><font color="#ff0000">    Class</font>.<font color="#ff9900">forName</font>(<font color="#999999">"com.microsoft.jdbc.sqlserver.SQLServerDriver"</font>).<font color="#ff9900">newInstance</font>();<br /><br />    <font color="#ff0000">Connection</font> conn = <font color="#ff0000">DriverManager</font>.<font color="#ff9900">getConnection</font>(url, username, password); <br />    <font color="#ff0000">Statement</font>  stmt = conn.<font color="#ff9900">createStatement</font>(<font color="#ff0000">ResultSet</font>.TYPE_SCROLL_SENSITIVE, <font color="#ff0000">ResultSet</font>.CONCUR_UPDATABLE);<br />    <font color="#ff0000">ResultSet</font>  rs   = stmt.<font color="#ff9900">executeQuery</font>(sql);<br /><br /><font color="#993300">%&gt;</font><br /><br /><font color="#0000ff">&lt;HTML&gt;<br />&lt;BODY&gt;</font><br /><br /><font color="#993300">&lt;% </font><br />    <font color="#0000ff">while</font> ( rs.<font color="#ff9900">next</font>() ) <br />    {<br />        <font color="#993300">%&gt;</font><br />        第一个字段内容为：<font color="#993300">&lt;%=</font>rs.<font color="#ff9900">getStrisng</font>(1)<font color="#993300">%&gt;</font><font color="#0000ff">&lt;BR&gt;</font><br />        <font color="#993300">&lt;%</font><br />    }<br /><br />    rs.<font color="#ff9900">close</font>();<br />    stmt.<font color="#ff9900">close</font>();<br />    conn.<font color="#ff9900">close</font>();<br /><font color="#993300">%&gt;</font><br /><font color="#0000ff"><br />&lt;/BODY&gt;<br />&lt;/HTML&gt;</font></p></td></tr></tbody></table><br /><font size="+1"><b>三、jsp连接DB2数据库</b></font><br />testDB2.jsp如下：<br /><table width="0%" border="1"><tbody><tr><td valign="top"><p style="FONT-SIZE: 9pt"><font color="#993300">&lt;%</font>@ page <font color="#0000ff">contentType</font>=<font color="#999999">"text/html;charset=gb2312"</font><font color="#993300">%&gt;</font><br /><font color="#993300">&lt;%</font>@ page <font color="#0000ff">import</font>=<font color="#999999">"java.sql.*"</font><font color="#993300">%&gt;</font><br /><font color="#993300">&lt;%</font><br />    <font color="#ff0000">String</font> sql = <font color="#999999">"select * from test"</font>;<br /><br /><font color="#009900">    // 连接字符串，格式： "jdbc:数据库驱动名称://数据库服务器ip:端口号/数据库名称"</font><br />    <font color="#ff0000">String</font> url = <font color="#999999">"jdbc:db2://localhost:5000/sample"</font>;<br />    <font color="#ff0000">String</font> username = <font color="#999999">"scott"</font>;<font color="#ff0000"><br />    String</font> password = <font color="#999999">"tiger"</font>;<br /><br /><font color="#ff0000">    Class</font>.<font color="#ff9900">forName</font>(<font color="#999999">"com.ibm.db2.jdbc.app.DB2Driver"</font>).<font color="#ff9900">newInstance</font>();<br /><br />    <font color="#ff0000">Connection</font> conn = <font color="#ff0000">DriverManager</font>.<font color="#ff9900">getConnection</font>(url, username, password); <br />    <font color="#ff0000">Statement</font>  stmt = conn.<font color="#ff9900">createStatement</font>(<font color="#ff0000">ResultSet</font>.TYPE_SCROLL_SENSITIVE, <font color="#ff0000">ResultSet</font>.CONCUR_UPDATABLE);<br />    <font color="#ff0000">ResultSet</font>  rs   = stmt.<font color="#ff9900">executeQuery</font>(sql);<br /><br />    rs.<font color="#ff9900">close</font>();<br />    stmt.<font color="#ff9900">close</font>();<br />    conn.<font color="#ff9900">close</font>();<br /><font color="#993300">%&gt;</font></p></td></tr></tbody></table><br /><font size="+1"><b>四、jsp连接Informix数据库 </b></font><br />testInformix.jsp如下：<br /><table width="0%" border="1"><tbody><tr><td valign="top"><p style="FONT-SIZE: 9pt"><font color="#993300">&lt;%</font>@ page <font color="#0000ff">contentType</font>=<font color="#999999">"text/html;charset=gb2312"</font><font color="#993300">%&gt;</font><br /><font color="#993300">&lt;%</font>@ page <font color="#0000ff">import</font>=<font color="#999999">"java.sql.*"</font><font color="#993300">%&gt;</font><br /><font color="#993300">&lt;%</font><br />    <font color="#ff0000">String</font> sql = <font color="#999999">"select * from test"</font>;<br /><br /><font color="#009900">    // 连接字符串，格式： "jdbc:数据库驱动名称://数据库服务器ip:端口号/数据库名称:INFORMIXSERVER=服务器名;user=用户名;password=</font><font color="#009900">密码"</font><br />    <font color="#ff0000">String</font> url = <font color="#999999">"jdbc:informix-sqli://123.45.67.89:1533/testDB:INFORMIXSERVER=myserver;user=testuser;password=testpassword"</font>;<br /><br /><font color="#ff0000">    Class</font>.<font color="#ff9900">forName</font>(<font color="#999999">"com.informix.jdbc.IfxDriver"</font>).<font color="#ff9900">newInstance</font>();<br /><br />    <font color="#ff0000">Connection</font> conn = <font color="#ff0000">DriverManager</font>.<font color="#ff9900">getConnection</font>(url); <br />    <font color="#ff0000">Statement</font>  stmt = conn.<font color="#ff9900">createStatement</font>(<font color="#ff0000">ResultSet</font>.TYPE_SCROLL_SENSITIVE, <font color="#ff0000">ResultSet</font>.CONCUR_UPDATABLE);<br />    <font color="#ff0000">ResultSet</font>  rs   = stmt.<font color="#ff9900">executeQuery</font>(sql);<br /><br />    rs.<font color="#ff9900">close</font>();<br />    stmt.<font color="#ff9900">close</font>();<br />    conn.<font color="#ff9900">close</font>();<br /><font color="#993300">%&gt;</font></p></td></tr></tbody></table><br /><b><font size="+1">五、jsp连接Sybase数据库 <br /></font></b>testSybase.jsp如下： 
<table width="0%" border="1"><tbody><tr><td valign="top"><p style="FONT-SIZE: 9pt"><font color="#993300">&lt;%</font>@ page <font color="#0000ff">contentType</font>=<font color="#999999">"text/html;charset=gb2312"</font><font color="#993300">%&gt;</font><br /><font color="#993300">&lt;%</font>@ page <font color="#0000ff">import</font>=<font color="#999999">"java.sql.*"</font><font color="#993300">%&gt;</font><br /><font color="#993300">&lt;%</font><br />    <font color="#ff0000">String</font> sql = <font color="#999999">"select * from test"</font>;<br /><br /><font color="#009900">    // 连接字符串，格式： "jdbc:公司名称:数据库驱动名称:数据库服务器ip:端口号/数据库名称"</font><br />    <font color="#ff0000">String</font> url = <font color="#999999">"jdbc:sybase:Tds:localhost:5007/tsdata"</font>;<br /><br /><font color="#ff0000">Properties</font> prop = <font color="#ff0000">System</font>.<font color="#ff9900">getProperties</font>();<br />prop.<font color="#ff9900">put</font>(<font color="#999999">"user"</font>, <font color="#999999">"userid"</font>); <font color="#009900">// 用户名</font><br />prop.<font color="#ff9900">put</font>(<font color="#999999">"password"</font>, <font color="#999999">"user_password"</font>); <font color="#009900">// 密码</font><br /><br /><font color="#ff0000">    Class</font>.<font color="#ff9900">forName</font>(<font color="#999999">"com.sybase.jdbc.SybDriver"</font>).<font color="#ff9900">newInstance</font>();<br /><br />    <font color="#ff0000">Connection</font> conn = <font color="#ff0000">DriverManager</font>.<font color="#ff9900">getConnection</font>(url, prop); <br />    <font color="#ff0000">Statement</font>  stmt = conn.<font color="#ff9900">createStatement</font>(<font color="#ff0000">ResultSet</font>.TYPE_SCROLL_SENSITIVE, <font color="#ff0000">ResultSet</font>.CONCUR_UPDATABLE);<br />    <font color="#ff0000">ResultSet</font>  rs   = stmt.<font color="#ff9900">executeQuery</font>(sql);<br /><br />    rs.<font color="#ff9900">close</font>();<br />    stmt.<font color="#ff9900">close</font>();<br />    conn.<font color="#ff9900">close</font>();<br /><font color="#993300">%&gt;</font></p></td></tr></tbody></table><br /><font size="+1"><b>六、jsp连接MySQL数据库 </b></font><br />testMySQL.jsp如下： 
<table width="0%" border="1"><tbody><tr><td valign="top" height="304"><p style="FONT-SIZE: 9pt"><font color="#993300">&lt;%</font>@ page <font color="#0000ff">contentType</font>=<font color="#999999">"text/html;charset=gb2312"</font><font color="#993300">%&gt;</font><br /><font color="#993300">&lt;%</font>@ page <font color="#0000ff">import</font>=<font color="#999999">"java.sql.*"</font><font color="#993300">%&gt;</font><br /><font color="#993300">&lt;%</font><br />    <font color="#ff0000">String</font> sql = <font color="#999999">"select * from test"</font>;<br /><br /><font color="#009900">    // 连接字符串，格式： "jdbc:数据库驱动名称://数据库服务器ip/数据库名称?user=用户名&amp;password=密码&amp;使用Unicode=布尔值&amp;字符编码=编码"</font><br />    <font color="#ff0000">String</font> url = <font color="#999999">"jdbc:mysql://localhost/softforum?user=soft&amp;password=soft1234&amp;useUnicode=true&amp;characterEncoding=8859_1"</font>;<br />    <font color="#ff0000">String</font> username = <font color="#999999">"scott"</font>;<font color="#ff0000"><br />    String</font> password = <font color="#999999">"tiger"</font>;<br /><br /><font color="#ff0000">    Class</font>.<font color="#ff9900">forName</font>(<font color="#999999">"org.gjt.mm.mysql.Driver"</font>).<font color="#ff9900">newInstance</font>();<br /><br />    <font color="#ff0000">Connection</font> conn = <font color="#ff0000">DriverManager</font>.<font color="#ff9900">getConnection</font>(url, username, password); <br />    <font color="#ff0000">Statement</font>  stmt = conn.<font color="#ff9900">createStatement</font>(<font color="#ff0000">ResultSet</font>.TYPE_SCROLL_SENSITIVE, <font color="#ff0000">ResultSet</font>.CONCUR_UPDATABLE);<br />    <font color="#ff0000">ResultSet</font>  rs   = stmt.<font color="#ff9900">executeQuery</font>(sql);<br /><br />    rs.<font color="#ff9900">close</font>();<br />    stmt.<font color="#ff9900">close</font>();<br />    conn.<font color="#ff9900">close</font>();<br /><font color="#993300">%&gt;</font></p></td></tr></tbody></table><br /><b><font size="+1">七、jsp连接PostgreSQL数据库</font></b><br />testPostgreSQL.jsp如下： 
<table width="0%" border="1"><tbody><tr><td valign="top" height="304"><p style="FONT-SIZE: 9pt"><font color="#993300">&lt;%</font>@ page <font color="#0000ff">contentType</font>=<font color="#999999">"text/html;charset=gb2312"</font><font color="#993300">%&gt;</font><br /><font color="#993300">&lt;%</font>@ page <font color="#0000ff">import</font>=<font color="#999999">"java.sql.*"</font><font color="#993300">%&gt;</font><br /><font color="#993300">&lt;%</font><br />    <font color="#ff0000">String</font> sql = <font color="#999999">"select * from test"</font>;<br /><br /><font color="#009900">    // 连接字符串，格式： "jdbc:数据库驱动名称://数据库服务器ip/数据库名称"</font><br />    <font color="#ff0000">String</font> url = <font color="#999999">"jdbc:postgresql://localhost/soft"</font>;<br />    <font color="#ff0000">String</font> username = <font color="#999999">"scott"</font>;<font color="#ff0000"><br />    String</font> password = <font color="#999999">"tiger"</font>;<br /><br /><font color="#ff0000">    Class</font>.<font color="#ff9900">forName</font>(<font color="#999999">""org.postgresql.Driver"</font>).<font color="#ff9900">newInstance</font>();<br /><br />    <font color="#ff0000">Connection</font> conn = <font color="#ff0000">DriverManager</font>.<font color="#ff9900">getConnection</font>(url, username, password); <br />    <font color="#ff0000">Statement</font>  stmt = conn.<font color="#ff9900">createStatement</font>(<font color="#ff0000">ResultSet</font>.TYPE_SCROLL_SENSITIVE, <font color="#ff0000">ResultSet</font>.CONCUR_UPDATABLE);<br />    <font color="#ff0000">ResultSet</font>  rs   = stmt.<font color="#ff9900">executeQuery</font>(sql);<br /><br />    rs.<font color="#ff9900">close</font>();<br />    stmt.<font color="#ff9900">close</font>();<br />    conn.<font color="#ff9900">close</font>();<br /><font color="#993300">%&gt;</font></p></td></tr></tbody></table><table height="146" cellspacing="0" cellpadding="0" width="684" align="center" border="0"><tbody><tr><td class="ArticleTeitle" valign="top" height="35"><p>下面是简单的数据库操作Javabean的代码:</p><table border="1"><tbody><tr><td width="657">DbWrapper.java</td></tr><tr><td><pre><tt><span class="style2"><span class="style3"><b><font color="#000080">import</font></b> java<font color="#990000">.</font>sql<font color="#990000">.*;</font><b><font color="#000080">import</font></b> java<font color="#990000">.</font>util<font color="#990000">.*;</font><b><font color="#0000ff">public</font></b><b><font color="#0000ff">class</font></b> DbWrapper
<font color="#ff0000">{</font><i><font color="#9a1900">// 定义连接池对象为静态变量，将一直存在，直到工作目录关闭。</font></i><b><font color="#0000ff">private</font></b><b><font color="#0000ff">static</font></b> DataSource ds <font color="#990000">=</font><b><font color="#0000ff">null</font></b><font color="#990000">;</font><br /><i><font color="#9a1900">// 1.用连接池的方式获得连接</font></i><i><font color="#9a1900">// 如果不是做多数据库程序，推荐使用此方法</font></i><i><font color="#9a1900">// 相关内容：<a href="http://blog.csdn.net/cm4ever/archive/2004/10/22/147446.aspx" target="_blank">在tomcat管理界面配置连接池</a></font></i><b><font color="#0000ff">public</font></b><b><font color="#0000ff">static</font></b> Connection <b><font color="#000000">openConnection</font></b><font color="#990000">()</font><b><font color="#0000ff">throws</font></b> Exception
    <font color="#ff0000">{</font><i><font color="#9a1900">// 只需要初始化1次</font></i><b><font color="#0000ff">if</font></b><font color="#990000">(</font> ds <font color="#990000">==</font><b><font color="#0000ff">null</font></b><font color="#990000">)</font><font color="#ff0000">{</font>
            Context initContext <font color="#990000">=</font><b><font color="#0000ff">new</font></b><b><font color="#000000">InitialContext</font></b><font color="#990000">();</font>
            Context envContext <font color="#990000">=</font><font color="#990000">(</font>Context<font color="#990000">)</font> initContext<font color="#990000">.</font><b><font color="#000000">lookup</font></b><font color="#990000">(</font><font color="#ff0000">"java:/comp/env"</font><font color="#990000">);</font>
            DataSource ds <font color="#990000">=</font><font color="#990000">(</font>DataSource<font color="#990000">)</font> envContext<font color="#990000">.</font><b><font color="#000000">lookup</font></b><font color="#990000">(</font><font color="#ff0000">"jdbc/MyDataSource"</font><font color="#990000">);</font><font color="#ff0000">}</font><b><font color="#0000ff">return</font></b> ds<font color="#990000">.</font><b><font color="#000000">getConnection</font></b><font color="#990000">();</font><font color="#ff0000">}</font><i><font color="#9a1900">// 2.用jdbc驱动获得连接</font></i><i><font color="#9a1900">// 相关内容：<a href="http://blog.csdn.net/cm4ever/archive/2004/09/30/121770.aspx" target="_blank">JSP数据库连接大全</a></font></i><b><font color="#0000ff">public</font></b><b><font color="#0000ff">static</font></b> Connection <b><font color="#000000">openConnection</font></b><font color="#990000">(</font>
        String driver<font color="#990000">,</font> 
        String url<font color="#990000">,</font> 
        String username<font color="#990000">,</font> 
        String password<font color="#990000">)</font><b><font color="#0000ff">throws</font></b> Exception
    <font color="#ff0000">{</font>
        Class<font color="#990000">.</font><b><font color="#000000">forName</font></b><font color="#990000">(</font>driver<font color="#990000">).</font><b><font color="#000000">newInstance</font></b><font color="#990000">();</font><b><font color="#0000ff">return</font></b> DriverManager<font color="#990000">.</font><b><font color="#000000">getConnection</font></b><font color="#990000">(</font>url<font color="#990000">,</font> username<font color="#990000">,</font> password<font color="#990000">);</font><font color="#ff0000">}</font><b><font color="#0000ff">public</font></b><b><font color="#0000ff">static</font></b><font color="#009900">void</font><b><font color="#000000">closeConnection</font></b><font color="#990000">(</font>Connection conn<font color="#990000">)</font><b><font color="#0000ff">throws</font></b> Exception
    <font color="#ff0000">{</font><b><font color="#0000ff">if</font></b><font color="#990000">(</font> conn <font color="#990000">!=</font><b><font color="#0000ff">null</font></b><font color="#990000">)</font><font color="#ff0000">{</font>
            conn<font color="#990000">.</font><b><font color="#000000">close</font></b><font color="#990000">();</font><font color="#ff0000">}</font><font color="#ff0000">}<br /></font><b><font color="#0000ff">public</font></b><b><font color="#0000ff">static</font></b><font color="#009900">int</font><b><font color="#000000">executeUpdate</font></b><font color="#990000">(</font>String sql<font color="#990000">)</font><b><font color="#0000ff">throws</font></b> Exception
    <font color="#ff0000">{</font><font color="#009900">int</font> count <font color="#990000">=</font><font color="#993399">0</font><font color="#990000">;</font>
        
        Connection conn <font color="#990000">=</font><b><font color="#0000ff">null</font></b><font color="#990000">;</font>
        Statement  stmt <font color="#990000">=</font><b><font color="#0000ff">null</font></b><font color="#990000">;</font><b><font color="#0000ff">try</font></b><font color="#ff0000">{</font>
            conn <font color="#990000">=</font><b><font color="#000000">openConnection</font></b><font color="#990000">();</font>
            stmt <font color="#990000">=</font> conn<font color="#990000">.</font><b><font color="#000000">createStatement</font></b><font color="#990000">();</font>
        
            count <font color="#990000">=</font> stmt<font color="#990000">.</font><b><font color="#000000">executeUpdate</font></b><font color="#990000">(</font>sql<font color="#990000">);</font><font color="#ff0000">}</font><b><font color="#0000ff">catch</font></b><font color="#990000">(</font> Exception e <font color="#990000">)</font><font color="#ff0000">{</font><b><font color="#0000ff">throw</font></b> e<font color="#990000">;</font><font color="#ff0000">}</font><b><font color="#0000ff">finally</font></b><font color="#ff0000">{</font><b><font color="#000000">closeConnection</font></b><font color="#990000">(</font>conn<font color="#990000">);</font><font color="#ff0000">}</font><b><font color="#0000ff">return</font></b> count<font color="#990000">;</font><font color="#ff0000">}</font><b><font color="#0000ff">public</font></b><b><font color="#0000ff">static</font></b> List <b><font color="#000000">executeQuery</font></b><font color="#990000">(</font>String sql<font color="#990000">)</font><b><font color="#0000ff">throws</font></b> Exception
    <font color="#ff0000">{</font>
        List list <font color="#990000">=</font><b><font color="#0000ff">new</font></b><b><font color="#000000">ArrayList</font></b><font color="#990000">();</font>
        
        Connection conn <font color="#990000">=</font><b><font color="#0000ff">null</font></b><font color="#990000">;</font>
        Statement  stmt <font color="#990000">=</font><b><font color="#0000ff">null</font></b><font color="#990000">;</font>
        ResultSet  rs   <font color="#990000">=</font><b><font color="#0000ff">null</font></b><font color="#990000">;</font><b><font color="#0000ff">try</font></b><font color="#ff0000">{</font>
            conn <font color="#990000">=</font><b><font color="#000000">openConnection</font></b><font color="#990000">();</font>
            stmt <font color="#990000">=</font> conn<font color="#990000">.</font><b><font color="#000000">createStatement</font></b><font color="#990000">();</font>
            rs   <font color="#990000">=</font> stmt<font color="#990000">.</font><b><font color="#000000">executeQuery</font></b><font color="#990000">(</font>sql<font color="#990000">);</font>
            
            ResultSetMetaData rsmd <font color="#990000">=</font> rs<font color="#990000">.</font><b><font color="#000000">getMetaData</font></b><font color="#990000">();</font><b><font color="#0000ff">while</font></b><font color="#990000">(</font> rs<font color="#990000">.</font><b><font color="#000000">next</font></b><font color="#990000">()</font><font color="#990000">)</font><font color="#ff0000">{</font>
                Map map <font color="#990000">=</font><b><font color="#0000ff">new</font></b><b><font color="#000000">HashMap</font></b><font color="#990000">();</font><b><font color="#0000ff">for</font></b><font color="#990000">(</font><font color="#009900">int</font> i <font color="#990000">=</font><font color="#993399">1</font><font color="#990000">;</font> i <font color="#990000">&lt;=</font> rsmd<font color="#990000">.</font><b><font color="#000000">getColumnCount</font></b><font color="#990000">();</font> i<font color="#990000">++</font><font color="#990000">)</font><font color="#ff0000">{</font>
                    map<font color="#990000">.</font><b><font color="#000000">put</font></b><font color="#990000">(</font>rsmd<font color="#990000">.</font><b><font color="#000000">getColumnName</font></b><font color="#990000">(</font>i<font color="#990000">),</font> rs<font color="#990000">.</font><b><font color="#000000">getObject</font></b><font color="#990000">(</font>i<font color="#990000">));</font><font color="#ff0000">}</font>
                
                list<font color="#990000">.</font><b><font color="#000000">add</font></b><font color="#990000">(</font>map<font color="#990000">);</font><font color="#ff0000">}</font><br /><font color="#ff0000">}</font><b><font color="#0000ff">catch</font></b><font color="#990000">(</font> Exception e <font color="#990000">)</font><font color="#ff0000">{</font>
            e<font color="#990000">.</font><b><font color="#000000">printStackTrace</font></b><font color="#990000">();</font><font color="#ff0000">}</font><b><font color="#0000ff">finally</font></b><font color="#ff0000">{</font><b><font color="#0000ff">if</font></b><font color="#990000">(</font> rs <font color="#990000">!=</font><b><font color="#0000ff">null</font></b><font color="#990000">)</font> rs<font color="#990000">.</font><b><font color="#000000">close</font></b><font color="#990000">();</font><b><font color="#000000">closeConnection</font></b><font color="#990000">(</font>conn<font color="#990000">);</font><font color="#ff0000">}</font></span></span><span class="style3"><b><font color="#0000ff">return</font></b> list<font color="#990000">;</font><br /><font color="#ff0000">}</font></span><font color="#ff0000">}</font></tt></pre></td></tr></tbody></table><p> </p><table border="1"><tbody><tr><td width="697"><pre><tt><i><font color="#9a1900">// 1.对于insert, update, delete语句<br /></font></i><font color="#009900">int</font> count <font color="#990000">=</font> DbWrapper<font color="#990000">.</font><b><font color="#000000">executeUpdate</font></b><font color="#990000">(</font>sql<font color="#990000">)</font><font color="#990000">;<br /></font><i><font color="#9a1900">// 2.对于selete语句</font></i>
java<font color="#990000">.</font>util<font color="#990000">.</font>List list <font color="#990000">=</font> DbWrapper<font color="#990000">.</font><b><font color="#000000">executeQuery</font></b><font color="#990000">(</font>sql<font color="#990000">)</font><font color="#990000">;<br /></font><i><font color="#9a1900">// 方法一:按名字取值，注意大小写是严格区分的</font></i><b><font color="#0000ff">for</font></b><font color="#990000">(</font><font color="#009900">int</font> i <font color="#990000">=</font><font color="#993399">0</font><font color="#990000">;</font> i <font color="#990000">&lt;</font> list<font color="#990000">.</font><b><font color="#000000">size</font></b><font color="#990000">(</font><font color="#990000">)</font><font color="#990000">;</font> i<font color="#990000">+</font><font color="#990000">+</font><font color="#990000">)</font><font color="#ff0000">{</font>
    java<font color="#990000">.</font>util<font color="#990000">.</font>Map map <font color="#990000">=</font><font color="#990000">(</font>java<font color="#990000">.</font>util<font color="#990000">.</font>Map<font color="#990000">)</font>list<font color="#990000">.</font><b><font color="#000000">get</font></b><font color="#990000">(</font>i<font color="#990000">)</font><font color="#990000">;</font>
    out<font color="#990000">.</font><b><font color="#000000">println</font></b><font color="#990000">(</font>mag<font color="#990000">.</font><b><font color="#000000">get</font></b><font color="#990000">(</font><font color="#ff0000">"column_name"</font><font color="#990000">).</font><b><font color="#000000">toString</font></b><font color="#990000">());</font><font color="#ff0000">}<br /></font><i><font color="#9a1900">// 方法二：遍历取值</font></i><b><font color="#0000ff">for</font></b><font color="#990000">(</font><font color="#009900">int</font> i <font color="#990000">=</font><font color="#993399">0</font><font color="#990000">;</font> i <font color="#990000">&lt;</font> list<font color="#990000">.</font><b><font color="#000000">size</font></b><font color="#990000">(</font><font color="#990000">)</font><font color="#990000">;</font> i<font color="#990000">+</font><font color="#990000">+</font><font color="#990000">)</font><font color="#ff0000">{</font>
    java<font color="#990000">.</font>util<font color="#990000">.</font>Map map <font color="#990000">=</font><font color="#990000">(</font>java<font color="#990000">.</font>util<font color="#990000">.</font>Map<font color="#990000">)</font>list<font color="#990000">.</font><b><font color="#000000">get</font></b><font color="#990000">(</font>i<font color="#990000">)</font><font color="#990000">;<br /></font><b><font color="#0000ff">for</font></b><font color="#990000">(</font>java<font color="#990000">.</font>util<font color="#990000">.</font>Iterator it <font color="#990000">=</font> map<font color="#990000">.</font><b><font color="#000000">keySet</font></b><font color="#990000">(</font><font color="#990000">)</font><font color="#990000">.</font><b><font color="#000000">iterator</font></b><font color="#990000">(</font><font color="#990000">)</font><font color="#990000">;</font> it<font color="#990000">.</font><b><font color="#000000">hasNext</font></b><font color="#990000">(</font><font color="#990000">)</font><font color="#990000">;</font><font color="#990000">)</font><font color="#ff0000">{</font>
        String column_name <font color="#990000">=</font> it<font color="#990000">.</font><b><font color="#000000">next</font></b><font color="#990000">(</font><font color="#990000">)</font><font color="#990000"></font><font color="#990000">.</font><b><font color="#000000">toString</font></b><font color="#990000">(</font><font color="#990000">)</font><font color="#990000">)</font><font color="#990000">;</font><br /><br /><i><font color="#9a1900">// 取值</font></i><font color="#9a1900">时注意null判断</font>
        out<font color="#990000">.</font><b><font color="#000000">println</font></b><font color="#990000">(</font>column_name <font color="#990000">+</font><font color="#ff0000">" = "</font><font color="#990000">+</font> map<font color="#990000">.</font><b><font color="#000000">get</font></b><font color="#990000">(</font>column_name<font color="#990000">) </font><font color="#990000">=</font><font color="#990000">=</font><b><font color="#0000ff">null</font></b><font color="#990000">?</font><font color="#ff0000">""</font><font color="#990000">:</font> map<font color="#990000">.</font><b><font color="#000000">get</font></b><font color="#990000">(</font>column_name<font color="#990000">)</font>.<b><font color="#000000">toString</font></b><font color="#990000"></font><font color="#990000">(</font><font color="#990000">)</font><font color="#990000">);</font><font color="#ff0000">}</font><font color="#ff0000">}</font></tt></pre></td></tr></tbody></table><p></p><div class="post"><div class="postcontent"></div></div><div class="userData" id="CommentsPersistDiv"></div><script><![CDATA[
			function TempSave(ElementID)
			{
				CommentsPersistDiv.setAttribute("CommentContent",document.getElementById(ElementID).value);
				CommentsPersistDiv.save("CommentXMLStore");
			}
			function Restore(ElementID)
			{
				CommentsPersistDiv.load("CommentXMLStore");
				document.getElementById(ElementID).value=CommentsPersistDiv.getAttribute("CommentContent");
			}
		
                  ]]&gt;</script><!--Ene TempSave--><div id="AnonymousPostComment1_ValidationSummary1" style="DISPLAY: none; COLOR: red" showmessagebox="True" showsummary="False"></div><div id="commentform"><font face="宋体"></font><font face="宋体"></font><font face="宋体"></font><font face="宋体"></font><font face="宋体"></font></div></td></tr><tr><td class="ArticleTeitle" valign="top" height="25"><p align="right"><font size="4"></font><font color="#333333">来源</font><font color="#333333">： http://blog.csdn.net/cm4ever/</font></p></td></tr></tbody></table><img src ="http://www.blogjava.net/wujun/aggbug/43429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wujun/" target="_blank">junmy</a> 2006-04-26 22:26 <a href="http://www.blogjava.net/wujun/archive/2006/04/26/43429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 AJAX 构建应用程序 </title><link>http://www.blogjava.net/wujun/archive/2006/04/26/43404.html</link><dc:creator>junmy</dc:creator><author>junmy</author><pubDate>Wed, 26 Apr 2006 12:18:00 GMT</pubDate><guid>http://www.blogjava.net/wujun/archive/2006/04/26/43404.html</guid><wfw:comment>http://www.blogjava.net/wujun/comments/43404.html</wfw:comment><comments>http://www.blogjava.net/wujun/archive/2006/04/26/43404.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wujun/comments/commentRss/43404.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wujun/services/trackbacks/43404.html</trackback:ping><description><![CDATA[<table height="146" cellspacing="0" cellpadding="0" width="684" align="center" border="0">
				<tbody>
						<tr>
								<td class="ArticleTeitle" valign="top" height="35">
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td valign="top" width="416">
																		<div align="left">
																				<p align="left">作者：<a href="https://www6.software.ibm.com/developerworks/cn/education/java/wa-ajax/authors.html">Naveen Balani</a>, 技术架构师, Webify Solutions<br /><a href="https://www6.software.ibm.com/developerworks/cn/education/java/wa-ajax/authors.html">         Rajeev Hathi</a>, 高级系统分析员, Satyam 计算机有限公司<br /></p>
																				<blockquote>异步 JavaScript 和 XML（Asynchronous JavaScript with XML，AJAX）支持动态、异步的 Web 体验，却不需要页面刷新。在本教程中，将跟随一个示例图书订购应用程序的构建，学习构建基于 AJAX 的 Web 应用程序 —— 拥有实时验证，却不用页面刷新。</blockquote>
																				<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
																				<!--#include virtual="/developerworks/cn/inc/s-search-query-capture.inc"-->
																				<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
																				<p>
																						<span class="atitle">
																								<font face="Arial" size="4">开始之前</font>
																						</span>
																				</p>
																				<p>
																						<a name="N100D6">
																								<span class="smalltitle">关于本教程</span>
																						</a>
																				</p>
																				<p>在本教程中，我解释了如何开发和设计基于异步 JavaScript 和 XML（或者叫做 AJAX）的 Web 应用程序。您将构建一个基于 Web 的、提供实时验证和页面刷新、为用户提供有效和平滑的用户交互的示例<i>图书订购应用程序</i>。 </p>
																		</div>
																</td>
														</tr>
												</tbody>
										</table>
										<blockquote> </blockquote>
										<p>
												<a name="N100E3">
														<span class="smalltitle">前提条件</span>
												</a>
										</p>
										<p>我们将使用 Tomcat 来运行 AJAX 应用程序。Tomcat 是 Java Servlet 和 Java 服务器页面技术的参考实现使用的 servlet 容器。请从 <a href="http://jakarta.apache.org/site/downloads/downloads_tomcat-5.cgi" target="_new">Jakarta Site</a> 下载 Download jakarta-tomcat-5.0.28.exe 并运行它把 Tomcat 安装到喜欢的位置 —— 例如 c:\tomcat5.0。</p>
										<p>请下载本教程的源代码和 Web 应用程序（在 wa-ajax-Library.war 中）。</p>
										<p>
												<span class="atitle">
														<font face="Arial" size="4">AJAX 介绍</font>
												</span>
										</p>
										<p>
												<a name="N10100">
														<span class="smalltitle">AJAX 基础</span>
												</a>
										</p>
										<p>AJAX 支持动态、异步的 Web 体验，不需要页面刷新。它集成了以下技术： </p>
										<ul>
												<li>XHTML 和 CSS 提供了基于标准的表示。 
</li>
												<li>文档对象模型（DOM）提供了动态显示和交互。 
</li>
												<li>XML 和 XSLT 提供了数据交换和操纵。 
</li>
												<li>
														<code>XMLHttpRequest</code> 提供了异步数据检索。 
</li>
												<li>JavaScript 把每一样东西绑定在一起。 </li>
										</ul>
										<p>AJAX 技术的核心是 JavaScript 对象：<code>XMLHttpRequest</code>。这个对象是通过浏览器实现提供的 —— 先是通过 Internet Explorer 5.0 然后通过 Mozilla 兼容的浏览器。请进一步观察这个对象。 </p>
										<p>
												<a name="N10126">
														<span class="smalltitle">XMLHttpRequest</span>
												</a>
										</p>
										<p>使用 <code>XMLHttpRequest</code>，可以用 JavaScript 发出到服务器的请求，并在不阻塞用户的情况下处理响应。在创建 Web 站点并用 <code>XMLHttpRequest</code> 在客户机浏览器上无刷新地执行屏幕更新的同时，它还提供了更多灵活性和丰富的用户体验。</p>
										<p>
												<code>XMLHttpRequest</code> 应用程序的示例包括 Google 的 Gmail 服务、Google 的 Suggest 动态查询界面以及 MapQuest 的动态地图界面。在下一节，在演示图书订购应用程序的设计和实现时，详细介绍了如何使用 <code>XMLHttpRequest</code> 对象。</p>
										<p>
												<span class="atitle">
														<font face="Arial" size="4">应用程序设计</font>
												</span>
										</p>
										<p>
												<a name="N1014B">
														<span class="smalltitle">应用程序的元素</span>
												</a>
										</p>
										<p>基于 Web 的示例图书订购应用程序包含以下用 AJAX 实现的客户端函数：</p>
										<ul>
												<li>订购 ID 验证 
</li>
												<li>一个 <i>View Authors</i> 列表 
</li>
												<li>一个 <i>View Publishers</i> 列表 </li>
										</ul>
										<p>这里的目的是介绍 Web 页面中的<i>实时验证</i> 和<i>页面刷新</i> 如何让客户交互更平滑、更有效。</p>
										<p>
												<a name="N10170">
														<span class="smalltitle">应用程序的结构</span>
												</a>
										</p>
										<p>
												<a href="https://www6.software.ibm.com/developerworks/cn/education/java/wa-ajax/section3.html#fig1">图 1</a> 的图表说明了示例图书订购应用程序的设计架构：</p>
										<br />
										<a name="fig1">
												<b>图 1. AJAX 架构</b>
										</a>
										<br />
										<img height="461" alt="AJAX 架构" src="http://www.java3z.com/cwbwebhome/article/article2/images/ajax_design.gif" width="443" />
										<br />
										<p>应用程序是一个使用 Java 服务器页面（JSP）技术开发的单一 Web 页面。用户可以用 Web 浏览器（例如 Microsoft? Internet Explorer）调用 Web 页面并输入应用程序要实时验证的<i>订购 ID</i>。在 ID 异步验证的时候，用户可以输入更多信息。用户可以根据<i>作者</i> 或<i>出版者</i> 查看图书的书名。屏幕会根据用户的选择填充<i>作者列表</i> 或<i>出版者列表</i>。根据选择，<i>书名列表</i> 会被填充。所有这些列表都是实时填充的 —— 换句话说，页面没有刷新，但是数据仍然来自后台层。我们把这种现象叫做<i>实时刷新</i>。</p>
										<p>从 图 1 可以看出，<code>XMLHttpRequest</code> JavaScript 对象帮助进行实时异步处理。该对象采用 XML 格式通过 HTTP 对位于 Web 容器内的 <code>LibraryServlet</code> 发出请求。然后 servlet 查询数据库、提取数据并发送回客户机，还是采用 XML 格式通过 HTTP 进行传送。请求和响应都是在没有刷新页面的情况下实时发生的。</p>
										<p>就是这一点使得 AJAX 如此强大。用户不需要等候页面重新载入才能完成，因为这里没有页面重载。</p>
										<p>在 下一节 中，我将演示如何根据这个设计来实现图书订购应用程序。我要介绍代码并做一些分析。（要得到本教程的示例代码，请 下载文件 x-ajax-library.war。）<br /></p>
										<p>
												<span class="atitle">
														<font face="Arial" size="4">实现应用程序</font>
												</span>
										</p>
										<p>
												<a name="N101CB">
														<span class="smalltitle">用 AJAX 实现应用程序</span>
												</a>
										</p>
										<p>在这一节，我们研究示例图书订购应用程序的代码，并进一步查看每个基于 AJAX 的 Javascript 组件：</p>
										<ul>
												<li>验证订购 ID 
</li>
												<li>查看作者 
</li>
												<li>查看出版者 
</li>
												<li>查看书名 </li>
										</ul>
										<p>
												<a name="N101E4">
														<span class="smalltitle">查看代码：验证订购 ID</span>
												</a>
										</p>
										<p>先从<i>验证订购 ID</i> 的函数 <code>&lt;input type="text" name="subscriptionID" onblur="validate(this.form)"/&gt;</code> 开始。这个代码生成文本字段，用户可以在里面输入<i>订购 ID</i>。用户输入 ID 并移到表单的下一个字段时，触发 <code>onBlur</code> 事件。这个事件调用 JavaScript 函数 <code>validate()</code>：</p>
										<table cellspacing="0" cellpadding="5" width="70%" bgcolor="#eeeeee" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code class="section">
var req;
function validate(formObj) {
    init();
    req.onreadystatechange = subscriptionValidator;
    req.send("subscriptionID=" + formObj.subscriptionID.value);
}
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>
												<code>validate()</code> 函数接受 <code>formObj</code> 作为参数。它首先调用 <code>init()</code> 函数：</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code class="section">
function init() {
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
    }
    var url = "/Library/LibraryServlet";
    req.open("POST", url, true);
    req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
}
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/4.files/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/4.files/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N10217">
														<span class="smalltitle">查看代码： init()</span>
												</a>
										</p>
										<p>现在看 <code>init()</code> 函数的工作（我们把代码分成几部分）：</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code class="section">
if (window.XMLHttpRequest) {
    req = new XMLHttpRequest();
} else if (window.ActiveXObject) {
    req = new ActiveXObject("Microsoft.XMLHTTP");
}
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>
												<code>init()</code> 函数首先创建 <code>XMLHttpRequest</code> 对象。这个请求对象是 AJAX 的核心。它以 XML 格式发送和接收请求。这段代码检查浏览器对 <code>XMLHttpRequest</code> 对象的支持（多数浏览器都支持它）。如果使用 Microsoft Internet Explorer 5.0 以上版本，那么就执行第二个条件。</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code class="section">
req.open("POST", url, true);
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>代码创建了 <code>XMLHttpRequest</code> 对象之后，需要设置某些请求属性。在前面的代码中，第一行设置请求方法、请求 URL 和请求的类型（是否异步）。它通过调用 <code>XMLHttpRequest</code> 对象上的 <code>open()</code> 方法做这件事。</p>
										<p>这里我们要使用 <code>POST</code> 方法。理想情况下，当需要在服务器上修改状态时，请使用 <code>POST</code>。我们的应用程序并不修改状态，但我们仍然倾向于使用 <code>POST</code>。<code>url</code> 是要执行的 servlet 的 URL。<code>true</code> 表明我们要异步地执行请求。</p>
										<p>对于 <code>POST</code> 方法，我们需要设置 <code>Content-Type</code> 这个请求头。对于 <code>GET</code> 方法来说不需要这个设置。</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code class="section">
function validate(formObj) {
    init();
    req.onreadystatechange = subscriptionValidator;
    req.send("subscriptionID=" + formObj.subscriptionID.value);
}
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/4.files/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/4.files/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="cbh1">
														<span class="smalltitle">查看代码：回调句柄 1</span>
												</a>
										</p>
										<p>继续查看验证方法，下面把 <code>subscriptionValidator</code> 回调句柄分配给 <code>onreadystatechange</code>，请求状态的每个变化都会触发它。</p>
										<p>这个<i>回调句柄</i> 都负责什么呢？因为正在异步地处理请求，所以需要一个回调句俩，从服务器返回完整响应的时候调用它 —— 回调句柄是对订购 ID 进行验证的地方（也就是编写实际的验证代码的地方）。</p>
										<p>句柄充当侦听器。它一直等待响应完成。（稍后 将详细介绍句柄代码 。）为了发送请求，最后一行调用了 <code>send()</code> 方法。请求以<i>名称=值</i> 对的形式发送。对于 <code>GET</code> 方法，请求作为 URL 的一部分发送，所以 <code>send()</code> 方法被传递了一个空参数。</p>
										<p>请求被发送到 servlet。servlet 处理请求并实时地发回响应。这就是 servlet 处理请求的方式。下一个代码段表示了 <code>LibraryServlet 的 doPost()</code> 方法。</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code class="section">
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws 
ServletException, IOException {
    String ID = null;
    ID = req.getParameter("subscriptionID");
    if (ID != null) {
        String status = "&lt;message&gt;" + this.validID(ID) + "&lt;/message&gt;";
	this.writeResponse(resp, status);
    }
}
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/4.files/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/4.files/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="cbh2">
														<span class="smalltitle">查看代码：回调句柄 2</span>
												</a>
										</p>
										<p>
												<code>doPost()</code> 方法从请求参数得到 <code>subscriptionID</code>。为了验证 ID，它调用 <code>validID()</code> 方法。这个方法验证 ID，如果 ID 正确，则返回 <code>true</code>，否则返回 <code>false</code>。它用 XML 格式构造返回状态，并调用 <code>writeResponse()</code> 方法来写响应。现在来看 <code>writeResponse()</code> 方法。</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code class="section">
public void writeResponse(HttpServletResponse resp, String output) throws IOException {
    resp.setContentType("text/xml");
    resp.setHeader("Cache-Control", "no-cache");
    resp.getWriter().write(output);
}
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>响应用 XML 格式发送。第一行设置响应的内容类型为 <code>text/xml</code>。第二行把头 <code>Cache-Control</code> 的值设为 <code>no-cache</code>。这个值是必需的。AJAX 要求响应的输出不能被浏览器缓存。最后一行调用 <code>getWriter().write()</code> 方法来写响应。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/4.files/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/4.files/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="cbh3">
														<span class="smalltitle">查看代码：回调句柄 3</span>
												</a>
										</p>
										<p>请求由 servlet 处理，响应被发送回客户机。请记住，所有这些都在后台发生，没有页面刷新。现在 前面 讨论过的回调句柄方法会处理并解析响应：</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code class="section">
function subscriptionValidator() {
    if (req.readystate == 4) {
	if (req.status == 200) {
	    var messageObj = req.responseXML.getElementsByTagName("message")[0];
	    var message = messageObj.childNodes[0].nodeValue;
	    if (message == "true") {
		msg.innerHTML = "Subscription is valid";
		document.forms[0].order.disabled = false;
	    } else {
		msg.innerHTML = "Subscription not valid";
		document.forms[0].order.disabled = true;
	    }
	}
    }
}
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/4.files/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/4.files/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/4.files/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/4.files/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="https://www6.software.ibm.com/developerworks/cn/education/java/wa-ajax/section4.html#main">
																												<b>回页首</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N102FD">
														<span class="smalltitle">查看代码：回到 XMLHttpRequest</span>
												</a>
										</p>
										<p>如前所述，<code>XMLHttpRequest</code> 对象是构造和发送请求的核心对象。它也负责读取和解析从服务器返回的响应。请看下面几部分代码。</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code class="section">
if (req.readystate == 4) {
    if (req.status == 200) {
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>前面的代码检查请求的状态。如果请求处在就绪状态，就读取和解析响应。</p>
										<p>就绪状态是什么意思呢？当请求对象的属性 <code>readystate</code> 的值是 <code>4</code> 时，就意味着客户机接收到了响应而且接收完成。下面我们检查请求的状态（响应是正常页面还是错误页面）。为了保证响应正常，要检查状态的值是否为 <code>200</code>。如果 <code>status</code> 的值是 <code>200</code>，就会处理响应。</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code class="section">
var messageObj = req.responseXML.getElementsByTagName("message")[0];
var message = messageObj.childNodes[0].nodeValue;
if (message == "true") {
    msg.innerHTML = "Subscription is valid";
    document.forms[0].order.disabled = false;
} else {
    msg.innerHTML = "Subscription not valid";
    document.forms[0].order.disabled = true;
}	}
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>接下来，请求对象通过调用 <code>responseXML</code> 属性读取响应。请注意 servlet 用 XML 格式发送回响应，所以我们使用 <code>responseXML</code>。如果响应是以文本格式发送的，那么可以使用 <code>responseText</code> 属性。 </p>
										<p>在这个示例中，我们处理 XML。servlet 把响应构建在一个 <code>&lt;message&gt;</code> 标记中。要解析这个 XML 标记，请在 <code>XMLHttpRequest</code> 对象的 <code>responseXML</code> 属性上调用 <code>getElementsByTagName()</code> 方法。它得到标记的名称以及标记的子值。根据解析到的值，格式化响应并用 HTML 改写。</p>
										<p>现在就完成了对订购 ID 的验证，没有页面刷新。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/4.files/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/4.files/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N10353">
														<span class="smalltitle">查看代码：查看作者、出版者和书名</span>
												</a>
										</p>
										<p>其他的功能 —— <i>查看作者</i>、<i>查看出版者</i> 和<i>查看书名</i> —— 工作的方式类似。只是需要为每个功能定义独立的句柄：</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code class="section">
function displayList(field) {
    init();
    titles.innerHTML = " ";
    req.onreadystatechange = listHandler;
    req.send("select=" + escape(field));
}

function displayTitles(formObj) {
    init();
    var index = formObj.list.selectedIndex;
    var val = formObj.list.options[index].value;
    req.onreadystatechange = titlesHandler;
    req.send("list=" + val);
}
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>请记住，示例应用程序允许用户根据作者和出版者查看书名。所以显示的或者是<i>作者列表</i> 或者是<i>出版者列表</i>。在这类场景中，应用程序只能根据用户的选择调用一个回调句柄 —— 换句话说，对于作者和出版者列表，只有一个 <code>listHandler</code> 回调句柄。</p>
										<p>显示书名列表需要使用 <code>titlesHandler</code>。其余的功能仍然一样：servlet 处理请求，用 XML 格式写回响应。然后读取、解析、格式化响应，用 HTML 改写。可以用 HTML 把列表呈现为 <code>select......options</code> 标记。这个示例代码段显示了 <code>titlesHandler</code> 方法。</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code class="section">
var temp = "&lt;select name=\"titles\" multiple\&gt;";
for (var i=0; i&lt;index; i++) {
    var listObj = req.responseXML.getElementsByTagName("list")[i];
    temp = temp + "&lt;option value=" + i +"&gt;" + listObj.childNodes[0].nodeValue 
+ "&lt;/option&gt;";
}
temp = temp + "&lt;/select&gt;";
titles.innerHTML = temp;
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>迄今为止，我们演示了如何实现实时验证和刷新。使用 AJAX，可以选择多种方式给 Web 站点的用户交互添加特色。下面运行应用程序。</p>
										<p>
												<span class="atitle">
														<font face="Arial" size="4">运行和测试应用程序</font>
												</span>
										</p>
										<p>
												<a name="N10397">
														<span class="smalltitle">运行应用程序</span>
												</a>
										</p>
										<p>请下载示例代码 wa-ajax-Library.war 并把它拷贝到 Tomcat 的 Webapp 目录（例如，c:\Tomcat 5.0\Webapps）。要启动 Tomcat 服务器，请输入以下命令：</p>
										<table cellspacing="0" cellpadding="5" width="65%" bgcolor="#eeeeee" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code class="section">
cd bin
C:\Tomcat 5.0\bin&gt; catalina.bat start
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>Tomcat 现在启动了，AJAX Web 应用程序也部署在其中。</p>
										<p>
												<a name="N103AC">
														<span class="smalltitle">测试应用程序</span>
												</a>
										</p>
										<p>要测试应用程序：</p>
										<ol>
												<li>请打开 Web 浏览器，指向 <code>http://localhost:tomcatport/Library/order.jsp</code>，其中变量 <i>tompcatport</i> 是 Tomcat 服务器运行所在的端口。 
<p>将看到订购屏幕。</p></li>
												<li>在 <b>Enter Subscription ID</b> 字段中，输入用户 ID（“John” 除外）并离开字段。 
<p>向服务器异步发出的订购 ID 请求会被验证。可以看到 “Subscription not valid” 消息，如 图 2 所示：</p><br /><a name="fig2"><b>图 2. “Subcription not valid” 屏幕</b></a><br /><img height="483" alt="“Subcription not valid” 屏幕" src="http://www.java3z.com/cwbwebhome/article/article2/images/sub_notvalid.jpg" width="442" /><br /><p>应用程序在不刷新浏览器的情况下，异步地验证用户并提供运行时验证。</p></li>
												<li>输入用户 ID 值 <b>John</b>。 
<p>将看到消息 “Subscription is valid”。订购有效之后，应用程序就激活 <b>Order</b> 按钮。</p></li>
												<li>请选择 <b>By Author</b> 或 <b>By Publisher</b> 按钮分别填充作者或出版者下拉列表。 
</li>
												<li>从下拉列表选择一个作者或出版者。 
<p>书名区域被动态填充（如 <a href="https://www6.software.ibm.com/developerworks/cn/education/java/wa-ajax/section5.html#fig3">图 3</a> 所示）。</p><br /><a name="fig3"><b>图 3. “Subcription is valid”屏幕</b></a><br /><img height="463" alt="“Subcription is valid”屏幕" src="http://www.java3z.com/cwbwebhome/article/article2/images/auth_title.jpg" width="442" /><br /><p>在选择作者或出版者时，应用程序请求服务器在运行时提供来自服务器的与选中作者或出版者对应的书名信息。在不刷新浏览器的情况下显示书名信息。</p></li>
										</ol>
										<p>现在成功安装和测试了示例 AJAX 应用程序。</p>
										<p>
												<span class="atitle">
														<font face="Arial" size="4">结束语</font>
												</span>
										</p>
										<p>
												<a name="N10421">
														<span class="smalltitle">结束语</span>
												</a>
										</p>
										<p>AJAX 从开始至今已经走了很长的路。我们相信 AJAX 不仅仅可以用作设计模式，不过 AJAX 仍然有一些问题：</p>
										<ul>
												<li>浏览器对 <code>XMLHttpRequest</code> 对象的支持可能是个限制。大多数浏览器都支持 <code>XMLHttpRequest</code> 对象，但是有少数不支持（通常是较老版本的浏览器）。 
</li>
												<li>AJAX 最适合显示少量数据。如果要处理大量数据并在列表中实时显示，那么 AJAX 可能不是合适的解决方案。 
</li>
												<li>AJAX 非常依赖于 JavaScript。如果浏览器不支持 JavaScript 或者用户禁止了脚本选项，那么根本就不能利用 AJAX。 
</li>
												<li>AJAX 异步的性质不会保证多个请求的同步请求处理。如果需要对验证或刷新进行优先处理，那么要相应地设计应用程序。 </li>
										</ul>
										<p>即使有这些可能的问题，AJAX 仍然是提高 Web 页面和解决页面重载问题的最佳解决方案。</p>
										<p>
												<a href="https://www6.software.ibm.com/developerworks/cn/education/java/wa-ajax/authors.html">Naveen Balani</a>, 技术架构师, Webify Solutions<br /><a href="https://www6.software.ibm.com/developerworks/cn/education/java/wa-ajax/authors.html">Rajeev Hathi</a>, 高级系统分析员, Satyam 计算机有限公司<br /><br /></p>
								</td>
						</tr>
						<tr>
								<td class="ArticleTeitle" valign="top" height="25">
										<p align="right">
												<font size="4">
												</font>
												<font color="#333333">来源</font>
												<font color="#333333">： http://www-128.ibm.com/developerworks/cn/java/</font>
										</p>
								</td>
						</tr>
				</tbody>
		</table><img src ="http://www.blogjava.net/wujun/aggbug/43404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wujun/" target="_blank">junmy</a> 2006-04-26 20:18 <a href="http://www.blogjava.net/wujun/archive/2006/04/26/43404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>掌握 Ajax</title><link>http://www.blogjava.net/wujun/archive/2006/04/26/43403.html</link><dc:creator>junmy</dc:creator><author>junmy</author><pubDate>Wed, 26 Apr 2006 12:16:00 GMT</pubDate><guid>http://www.blogjava.net/wujun/archive/2006/04/26/43403.html</guid><wfw:comment>http://www.blogjava.net/wujun/comments/43403.html</wfw:comment><comments>http://www.blogjava.net/wujun/archive/2006/04/26/43403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wujun/comments/commentRss/43403.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wujun/services/trackbacks/43403.html</trackback:ping><description><![CDATA[<font color="#333333">
				<strong>〖 作者：Brett McLaughlin 〗</strong>
				<a href="http://www-128.ibm.com/developerworks/cn/xml/wa-ajaxintro1.html#author">Brett McLaughlin </a>
		</font>
		<font color="#000000">, 作家，编辑, O'Reilly and Associates<br /><br /><table height="146" cellspacing="0" cellpadding="0" width="684" align="center" border="0"><tbody><tr valign="top"><td><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td valign="top" width="402"><div align="left"><blockquote>Ajax 由 HTML、JavaScript? 技术、DHTML 和 DOM 组成，这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序。本文的作者是一位 Ajax 专家，他演示了这些技术如何协同工作 —— 从总体概述到细节的讨论 —— 使高效的 Web 开发成为现实。他还揭开了 Ajax 核心概念的神秘面纱，包括 XMLHttpRequest 对象。</blockquote><p>五年前，如果不知道 XML，您就是一只无人重视的丑小鸭。十八个月前，Ruby 成了关注的中心，不知道 Ruby 的程序员只能坐冷板凳了。今天，如果想跟上最新的技术时尚，那您的目标就是 Ajax。</p><p>但是，Ajax 不<i>仅仅</i> 是一种时尚，它是一种构建网站的强大方法，而且不像学习一种全新的语言那样困难。 </p></div></td></tr></tbody></table><p><a href="http://www-128.ibm.com/developerworks/cn/xml/wa-ajaxintro1.html#author"></a></p><p>但在详细探讨 Ajax 是什么之前，先让我们花几分钟了解 Ajax <i>做</i> 什么。目前，编写应用程序时有两种基本的选择：</p><ul><li>桌面应用程序 
</li><li>Web 应用程序 </li></ul><p>两者是类似的，桌面应用程序通常以 CD 为介质（有时候可从网站下载）并完全安装到您的计算机上。桌面应用程序可能使用互联网下载更新，但运行这些应用程序的代码在桌面计算机上。Web 应用程序运行在某处的 Web 服务器上 —— 毫不奇怪，要通过 Web 浏览器访问这种应用程序。</p><p>不过，比这些应用程序的运行代码放在何处更重要的是，应用程序如何运转以及如何与其进行交互。桌面应用程序一般很快（就在您的计算机上运行，不用等待互联网连接），具有漂亮的用户界面（通常和操作系统有关）和非凡的动态性。可以单击、选择、输入、打开菜单和子菜单、到处巡游，基本上不需要等待。</p><p>另一方面，Web 应用程序是最新的潮流，它们提供了在桌面上不能实现的服务（比如 Amazon.com 和 eBay）。但是，伴随着 Web 的强大而出现的是等待，等待服务器响应，等待屏幕刷新，等待请求返回和生成新的页面。</p><p>显然这样说过于简略了，但基本的概念就是如此。您可能已经猜到，Ajax 尝试建立桌面应用程序的功能和交互性，与不断更新的 Web 应用程序之间的桥梁。可以使用像桌面应用程序中常见的动态用户界面和漂亮的控件，不过是在 Web 应用程序中。</p><p>还等什么呢？我们来看看 Ajax 如何将笨拙的 Web 界面转化成能迅速响应的 Ajax 应用程序吧。</p><p><a name="IDAWDSFB"><span class="atitle">老技术，新技巧</span></a></p><p>在谈到 Ajax 时，实际上涉及到多种技术，要灵活地运用它必须深入了解这些不同的技术（本系列的头几篇文章将分别讨论这些技术）。好消息是您可能已经非常熟悉其中的大部分技术，更好的是这些技术都很容易学习，并不像完整的编程语言（如 Java 或 Ruby）那样困难。</p><table cellspacing="0" cellpadding="0" width="40%" align="right" border="0"><tbody><tr><td width="10"><img height="1" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/掌握%20Ajax，第%201%20部分%20Ajax%20简介.files/c.gif" width="10" /></td><td><table cellspacing="0" cellpadding="5" width="100%" border="1"><tbody><tr><td bgcolor="#eeeeee"><a name="IDA3DSFB"><b>Ajax 的定义</b></a><br /><p>顺便说一下，Ajax 是 Asynchronous JavaScript and XML（以及 DHTML 等）的缩写。这个短语是 Adaptive Path 的 Jesse James Garrett 发明的，按照 Jesse 的解释，这<i>不是</i> 个首字母缩写词。</p></td></tr></tbody></table></td></tr></tbody></table><p>下面是 Ajax 应用程序所用到的基本技术：</p><ul><li>HTML 用于建立 Web 表单并确定应用程序其他部分使用的字段。 
</li><li>JavaScript 代码是运行 Ajax 应用程序的核心代码，帮助改进与服务器应用程序的通信。 
</li><li>DHTML 或 Dynamic HTML，用于动态更新表单。我们将使用 <code>div</code>、<code>span</code> 和其他动态 HTML 元素来标记 HTML。 
</li><li>文档对象模型 DOM 用于（通过 JavaScript 代码）处理 HTML 结构和（某些情况下）服务器返回的 XML。 </li></ul><p>我们来进一步分析这些技术的职责。以后的文章中我将深入讨论这些技术，目前只要熟悉这些组件和技术就可以了。对这些代码越熟悉，就越容易从对这些技术的零散了解转变到真正把握这些技术（同时也真正打开了 Web 应用程序开发的大门）。</p><p><a name="IDAZESFB"><span class="smalltitle">XMLHttpRequest 对象</span></a></p><p>要了解的一个对象可能对您来说也是最陌生的，即 <code>XMLHttpRequest</code>。这是一个 JavaScript 对象，创建该对象很简单，如清单 1 所示。</p><br /><a name="code1"><b>清单 1. 创建新的 XMLHttpRequest 对象</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section">
&lt;script language="javascript" type="text/javascript"&gt;
var xmlHttp = new XMLHttpRequest();
&lt;/script&gt;
</code></pre></td></tr></tbody></table><br /><p>下一期文章中将进一步讨论这个对象，现在要知道这是处理所有服务器通信的对象。继续阅读之前，先停下来想一想：通过 <code>XMLHttpRequest</code> 对象与服务器进行对话的是 <i>JavaScript</i> 技术。这不是一般的应用程序流，这恰恰是 Ajax 的强大功能的来源。</p><p>在一般的 Web 应用程序中，用户填写表单字段并单击 <i>Submit</i> 按钮。然后整个表单发送到服务器，服务器将它转发给处理表单的脚本（通常是 PHP 或 Java，也可能是 CGI 进程或者类似的东西），脚本执行完成后再发送回全新的页面。该页面可能是带有已经填充某些数据的新表单的 HTML，也可能是确认页面，或者是具有根据原来表单中输入数据选择的某些选项的页面。当然，在服务器上的脚本或程序处理和返回新表单时用户必须等待。屏幕变成一片空白，等到服务器返回数据后再重新绘制。这就是交互性差的原因，用户得不到立即反馈，因此感觉不同于桌面应用程序。</p><p>Ajax 基本上就是把 JavaScript 技术和 <code>XMLHttpRequest</code> 对象放在 Web 表单和服务器<i>之间</i>。当用户填写表单时，数据发送给一些 JavaScript 代码而<i>不是</i> 直接发送给服务器。相反，JavaScript 代码捕获表单数据并向服务器发送请求。同时用户屏幕上的表单也不会闪烁、消失或延迟。换句话说，JavaScript 代码在幕后发送请求，用户甚至不知道请求的发出。更好的是，请求是异步发送的，就是说 JavaScript 代码（和用户）不用等待服务器的响应。因此用户可以继续输入数据、滚动屏幕和使用应用程序。</p><p>然后，服务器将数据返回 JavaScript 代码（仍然在 Web 表单中），后者决定如何处理这些数据。它可以迅速更新表单数据，让人感觉应用程序是立即完成的，表单没有提交或刷新而用户得到了新数据。JavaScript 代码甚至可以对收到的数据执行某种计算，再发送另一个请求，完全不需要用户干预！这就是 <code>XMLHttpRequest</code> 的强大之处。它可以根据需要自行与服务器进行交互，用户甚至可以完全不知道幕后发生的一切。结果就是类似于桌面应用程序的动态、快速响应、高交互性的体验，但是背后又拥有互联网的全部强大力量。</p><p><a name="IDALGSFB"><span class="smalltitle">加入一些 JavaScript</span></a></p><p>得到 <code>XMLHttpRequest</code> 的句柄后，其他的 JavaScript 代码就非常简单了。事实上，我们将使用 JavaScript 代码完成非常基本的任务：</p><ul><li>获取表单数据：JavaScript 代码很容易从 HTML 表单中抽取数据并发送到服务器。 
</li><li>修改表单上的数据：更新表单也很简单，从设置字段值到迅速替换图像。 
</li><li>解析 HTML 和 XML：使用 JavaScript 代码操纵 DOM（请参阅 下一节），处理 HTML 表单服务器返回的 XML 数据的结构。 </li></ul><p>对于前两点，需要非常熟悉 <code>getElementById()</code> 方法，如 清单 2 所示。</p><br /><a name="code2"><b>清单 2. 用 JavaScript 代码捕获和设置字段值</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section">
// Get the value of the "phone" field and stuff it in a variable called phone
var phone = document.getElementById("phone").value;

// Set some values on a form using an array called response
document.getElementById("order").value = response[0];
document.getElementById("address").value = response[1];
</code></pre></td></tr></tbody></table><br /><p>这里没有特别需要注意的地方，真是好极了！您应该认识到这里并没有非常复杂的东西。只要掌握了 <code>XMLHttpRequest</code>，Ajax 应用程序的其他部分就是如 清单 2 所示的简单 JavaScript 代码了，混合有少量的 HTML。同时，还要用一点儿 DOM，我们就来看看吧。</p><p><a name="dom"><span class="smalltitle">以 DOM 结束</span></a></p><p>最后还有 DOM，即文档对象模型。可能对有些读者来说 DOM 有点儿令人生畏，HTML 设计者很少使用它，即使 JavaScript 程序员也不大用到它，除非要完成某项高端编程任务。大量使用 DOM 的<i>是</i> 复杂的 Java 和 C/C++ 程序，这可能就是 DOM 被认为难以学习的原因。</p><p>幸运的是，在 JavaScript 技术中使用 DOM 很容易，也非常直观。现在，按照常规也许应该说明如何使用 DOM，或者至少要给出一些示例代码，但这样做也可能误导您。即使不理会 DOM，仍然能深入地探讨 Ajax，这也是我准备采用的方法。以后的文章将再次讨论 DOM，现在只要知道可能需要 DOM 就可以了。当需要在 JavaScript 代码和服务器之间传递 XML 和改变 HTML 表单的时候，我们再深入研究 DOM。没有它也能做一些有趣的工作，因此现在就把 DOM 放到一边吧。</p><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/掌握%20Ajax，第%201%20部分%20Ajax%20简介.files/blue_rule.gif" width="100%" /></td></tr></tbody></table><br /><br /><p><a name="IDAGAYW"><span class="atitle">获取 Request 对象</span></a></p><p>有了上面的基础知识后，我们来看看一些具体的例子。<code>XMLHttpRequest</code> 是 Ajax 应用程序的核心，而且对很多读者来说可能还比较陌生，我们就从这里开始吧。从 清单 1 可以看出，创建和使用这个对象非常简单，不是吗？等一等。</p><p>还记得几年前的那些讨厌的浏览器战争吗？没有一样东西在不同的浏览器上得到同样的结果。不管您是否相信，这些战争仍然在继续，虽然规模较小。但令人奇怪的是，<code>XMLHttpRequest</code> 成了这场战争的牺牲品之一。因此获得 <code>XMLHttpRequest</code> 对象可能需要采用不同的方法。下面我将详细地进行解释。</p><p><a name="IDA5AYW"><span class="smalltitle">使用 Microsoft 浏览器</span></a></p><p>Microsoft 浏览器 Internet Explorer 使用 MSXML 解析器处理 XML。因此如果编写的 Ajax 应用程序要和 Internet Explorer 打交道，那么必须用一种特殊的方式创建对象。</p><p>但并不是这么简单。根据 Internet Explorer 中安装的 JavaScript 技术版本不同，MSXML 实际上有两种不同的版本，因此必须对这两种情况分别编写代码。请参阅 清单 3，其中的代码在 Microsoft 浏览器上创建了一个 <code>XMLHttpRequest</code>。</p><br /><a name="code3"><b>清单 3. 在 Microsoft 浏览器上创建 XMLHttpRequest 对象</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section">
var xmlHttp = false;
try {
  xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
  try {
    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  } catch (e2) {
    xmlHttp = false;
  }
}
</code></pre></td></tr></tbody></table><br /><p>您对这些代码可能还不完全理解，但没有关系。当本系列文章结束的时候，您将对 JavaScript 编程、错误处理、条件编译等有更深的了解。现在只要牢牢记住其中的两行代码：</p><p><code>xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");</code></p><p>和</p><p><code>xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");</code>。</p><p>这两行代码基本上就是尝试使用一个版本的 MSXML 创建对象，如果失败则使用另一个版本创建该对象。不错吧？如果都不成功，则将 <code>xmlHttp</code> 变量设为 false，告诉您的代码出现了问题。如果出现这种情况，可能是因为安装了非 Microsoft 浏览器，需要使用不同的代码。</p><p><a name="IDANCYW"><span class="smalltitle">处理 Mozilla 和非 Microsoft 浏览器</span></a></p><p>如果选择的浏览器不是 Internet Explorer，或者为非 Microsoft 浏览器编写代码，就需要使用不同的代码。事实上就是 清单 1 所示的一行简单代码：</p><p><code>var xmlHttp = new XMLHttpRequest();</code>。</p><p>这行简单得多的代码在 Mozilla、Firefox、Safari、Opera 以及基本上所有以任何形式或方式支持 Ajax 的非 Microsoft 浏览器中，创建了 <code>XMLHttpRequest</code> 对象。</p><p><a name="IDACDYW"><span class="smalltitle">结合起来</span></a></p><p>关键是要支持<i>所有</i> 浏览器。谁愿意编写一个只能用于 Internet Explorer 或者非 Microsoft 浏览器的应用程序呢？或者更糟，要编写一个应用程序两次？当然不！因此代码要同时支持 Internet Explorer 和非 Microsoft 浏览器。清单 4 显示了这样的代码。</p><br /><a name="code4"><b>清单 4. 以支持多种浏览器的方式创建 XMLHttpRequest 对象</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section">
/* Create a new XMLHttpRequest object to talk to the Web server */
var xmlHttp = false;
/*@cc_on @*/
/*@if (@_jscript_version &gt;= 5)
try {
  xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
  try {
    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  } catch (e2) {
    xmlHttp = false;
  }
}
@end @*/

if (!xmlHttp &amp;&amp; typeof XMLHttpRequest != 'undefined') {
  xmlHttp = new XMLHttpRequest();
}
</code></pre></td></tr></tbody></table><br /><p>现在先不管那些注释掉的奇怪符号，如 <code>@cc_on</code>，这是特殊的 JavaScript 编译器命令，将在下一期针对 <code>XMLHttpRequest</code> 的文章中详细讨论。这段代码的核心分为三步：</p><ol><li>建立一个变量 <code>xmlHttp</code> 来引用即将创建的 <code>XMLHttpRequest</code> 对象。 
</li><li>尝试在 Microsoft 浏览器中创建该对象： 
<ul><li>尝试使用 <code>Msxml2.XMLHTTP</code> 对象创建它。 
</li><li>如果失败，再尝试 <code>Microsoft.XMLHTTP</code> 对象。 </li></ul></li><li>如果仍然没有建立 <code>xmlHttp</code>，则以非 Microsoft 的方式创建该对象。 </li></ol><p>最后，<code>xmlHttp</code> 应该引用一个有效的 <code>XMLHttpRequest</code> 对象，无论运行什么样的浏览器。</p><p><a name="IDALFYW"><span class="smalltitle">关于安全性的一点说明</span></a></p><p>安全性如何呢？现在浏览器允许用户提高他们的安全等级，关闭 JavaScript 技术，禁用浏览器中的任何选项。在这种情况下，代码无论如何都不会工作。此时必须适当地处理问题，这需要单独的一篇文章来讨论，要放到以后了（这个系列够长了吧？不用担心，读完之前也许您就掌握了）。现在要编写一段健壮但不够完美的代码，对于掌握 Ajax 来说就很好了。以后我们还将讨论更多的细节。</p><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/掌握%20Ajax，第%201%20部分%20Ajax%20简介.files/blue_rule.gif" width="100%" /></td></tr></tbody></table><br /><br /><p><a name="IDAQFYW"><span class="atitle">Ajax 世界中的请求/响应</span></a></p><p>现在我们介绍了 Ajax，对 <code>XMLHttpRequest</code> 对象以及如何创建它也有了基本的了解。如果阅读得很仔细，您可能已经知道与服务器上的 Web 应用程序打交道的是 JavaScript 技术，而不是直接提交给那个应用程序的 HTML 表单。</p><p>还缺少什么呢？到底如何使用 <code>XMLHttpRequest</code>。因为这段代码非常重要，您编写的<i>每个</i> Ajax 应用程序都要以某种形式使用它，先看看 Ajax 的基本请求/响应模型是什么样吧。</p><p><a name="IDADGYW"><span class="smalltitle">发出请求</span></a></p><p>您已经有了一个崭新的 <code>XMLHttpRequest</code> 对象，现在让它干点活儿吧。首先需要一个 Web 页面能够调用的 JavaScript 方法（比如当用户输入文本或者从菜单中选择一项时）。接下来就是在所有 Ajax 应用程序中基本都雷同的流程：</p><ol><li>从 Web 表单中获取需要的数据。 
</li><li>建立要连接的 URL。 
</li><li>打开到服务器的连接。 
</li><li>设置服务器在完成后要运行的函数。 
</li><li>发送请求。 </li></ol><p><a href="http://www-128.ibm.com/developerworks/cn/xml/wa-ajaxintro1.html#code5">清单 5</a> 中的示例 Ajax 方法就是按照这个顺序组织的：</p><br /><a name="code5"><b>清单 5. 发出 Ajax 请求</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section">
function callServer() {
  // Get the city and state from the web form
  var city = document.getElementById("city").value;
  var state = document.getElementById("state").value;
  // Only go on if there are values for both fields
  if ((city == null) || (city == "")) return;
  if ((state == null) || (state == "")) return;

  // Build the URL to connect to
  var url = "/scripts/getZipCode.php?city=" + escape(city) + "&amp;state=" + escape(state);

  // Open a connection to the server
  xmlHttp.open("GET", url, true);

  // Setup a function for the server to run when it's done
  xmlHttp.onreadystatechange = updatePage;

  // Send the request
  xmlHttp.send(null);
}
</code></pre></td></tr></tbody></table><br /><p>其中大部分代码意义都很明确。开始的代码使用基本 JavaScript 代码获取几个表单字段的值。然后设置一个 PHP 脚本作为链接的目标。要注意脚本 URL 的指定方式，city 和 state（来自表单）使用简单的 GET 参数附加在 URL 之后。</p><p>然后打开一个连接，这是您第一次看到使用 <code>XMLHttpRequest</code>。其中指定了连接方法（GET）和要连接的 URL。最后一个参数如果设为 <code>true</code>，那么将请求一个异步连接（这就是 Ajax 的由来）。如果使用 <code>false</code>，那么代码发出请求后将等待服务器返回的响应。如果设为 <code>true</code>，当服务器在后台处理请求的时候用户仍然可以使用表单（甚至调用其他 JavaScript 方法）。</p><p><code>xmlHttp</code>（要记住，这是 <code>XMLHttpRequest</code> 对象实例）的 <code>onreadystatechange</code> 属性可以告诉服务器在运行<i>完成</i> 后（可能要用五分钟或者五个小时）做什么。因为代码没有等待服务器，必须让服务器知道怎么做以便您能作出响应。在这个示例中，如果服务器处理完了请求，一个特殊的名为 <code>updatePage()</code> 的方法将被触发。</p><p>最后，使用值 <code>null</code> 调用 <code>send()</code>。因为已经在请求 URL 中添加了要发送给服务器的数据（city 和 state），所以请求中不需要发送任何数据。这样就发出了请求，服务器按照您的要求工作。</p><p>如果没有发现任何新鲜的东西，您应该体会到这是多么简单明了！除了牢牢记住 Ajax 的异步特性外，这些内容都相当简单。应该感激 Ajax 使您能够专心编写漂亮的应用程序和界面，而不用担心复杂的 HTTP 请求/响应代码。</p><p>清单 5 中的代码说明了 Ajax 的易用性。数据是简单的文本，可以作为请求 URL 的一部分。用 GET 而不是更复杂的 POST 发送请求。没有 XML 和要添加的内容头部，请求体中没有要发送的数据；换句话说，这就是 Ajax 的乌托邦。</p><p>不用担心，随着本系列文章的展开，事情会变得越来越复杂。您将看到如何发送 POST 请求、如何设置请求头部和内容类型、如何在消息中编码 XML、如何增加请求的安全性，可以做的工作还有很多！暂时先不用管那些难点，掌握好基本的东西就行了，很快我们就会建立一整套的 Ajax 工具库。</p><p><a name="IDA1IYW"><span class="smalltitle">处理响应</span></a></p><p>现在要面对服务器的响应了。现在只要知道两点：</p><ul><li>什么也不要做，直到 <code>xmlHttp.readyState</code> 属性的值等于 4。 
</li><li>服务器将把响应填充到 <code>xmlHttp.responseText</code> 属性中。 </li></ul><p>其中的第一点，即就绪状态，将在下一篇文章中详细讨论，您将进一步了解 HTTP 请求的阶段，可能比您设想的还多。现在只要检查一个特定的值（4）就可以了（下一期文章中还有更多的值要介绍）。第二点，使用 <code>xmlHttp.responseText</code> 属性获得服务器的响应，这很简单。清单 6 中的示例方法可供服务器根据 清单 5 中发送的数据调用。</p><br /><a name="code6"><b>清单 6. 处理服务器响应</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section">
function updatePage() {
  if (xmlHttp.readyState == 4) {
    var response = xmlHttp.responseText;
    document.getElementById("zipCode").value = response;
  }
}
</code></pre></td></tr></tbody></table><br /><p>这些代码同样既不难也不复杂。它等待服务器调用，如果是就绪状态，则使用服务器返回的值（这里是用户输入的城市和州的 ZIP 编码）设置另一个表单字段的值。于是包含 ZIP 编码的 <code>zipCode</code> 字段突然出现了，而用户<i>没有按任何按钮</i>！这就是前面所说的桌面应用程序的感觉。快速响应、动态感受等等，这些都只因为有了小小的一段 Ajax 代码。</p><p>细心的读者可能注意到 <code>zipCode</code> 是一个普通的文本字段。一旦服务器返回 ZIP 编码，<code>updatePage()</code> 方法就用城市/州的 ZIP 编码设置那个字段的值，用户就可以改写该值。这样做有两个原因：保持例子简单，说明有时候可能<i>希望</i> 用户能够修改服务器返回的数据。要记住这两点，它们对于好的用户界面设计来说很重要。</p><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/掌握%20Ajax，第%201%20部分%20Ajax%20简介.files/blue_rule.gif" width="100%" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><img height="16" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/掌握%20Ajax，第%201%20部分%20Ajax%20简介.files/u_bold.gif" width="16" border="0" /><br /></td><td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/xml/wa-ajaxintro1.html#main"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="IDAYKYW"><span class="atitle">连接 Web 表单</span></a></p><p>还有什么呢？实际上没有多少了。一个 JavaScript 方法捕捉用户输入表单的信息并将其发送到服务器，另一个 JavaScript 方法监听和处理响应，并在响应返回时设置字段的值。所有这些实际上都依赖于<i>调用</i> 第一个 JavaScript 方法，它启动了整个过程。最明显的办法是在 HTML 表单中增加一个按钮，但这是 2001 年的办法，您不这样认为吗？还是像 清单 7 这样利用 JavaScript 技术吧。</p><br /><a name="code7"><b>清单 7. 启动一个 Ajax 过程</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section">
&lt;form&gt;
 &lt;p&gt;City: &lt;input type="text" name="city" id="city" size="25" <span class="boldcode">onChange="callServer();"</span> /&gt;&lt;/p&gt;
 &lt;p&gt;State: &lt;input type="text" name="state" id="state" size="25" <span class="boldcode">onChange="callServer();"</span> /&gt;&lt;/p&gt;
 &lt;p&gt;Zip Code: &lt;input type="text" name="zipCode" id="city" size="5" /&gt;&lt;/p&gt;
&lt;/form&gt;
</code></pre></td></tr></tbody></table><br /><p>如果感觉这像是一段相当普通的代码，那就对了，正是如此！当用户在 city 或 state 字段中输入新的值时，<code>callServer()</code> 方法就被触发，于是 Ajax 开始运行了。有点儿明白怎么回事了吧？好，就是如此！<br /><br /><br /></p></td></tr><tr><td class="ArticleTeitle" valign="top" height="35"><p> </p></td></tr><tr><td class="ArticleTeitle" valign="top" height="25"><p align="right"><font color="#333333">来源</font><font color="#333333">： http://www-128.ibm.com/developerworks/cn/java/</font></p></td></tr></tbody></table></font><img src ="http://www.blogjava.net/wujun/aggbug/43403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wujun/" target="_blank">junmy</a> 2006-04-26 20:16 <a href="http://www.blogjava.net/wujun/archive/2006/04/26/43403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>