﻿<?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-javaGrowing-随笔分类-jsp学习</title><link>http://www.blogjava.net/juhongtao/category/6041.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 20 Dec 2007 06:45:24 GMT</lastBuildDate><pubDate>Thu, 20 Dec 2007 06:45:24 GMT</pubDate><ttl>60</ttl><item><title>request.getParameter("变量名")获取的字符串中原来的加号变成了空格，url传值   </title><link>http://www.blogjava.net/juhongtao/archive/2007/12/19/168639.html</link><dc:creator>javaGrowing</dc:creator><author>javaGrowing</author><pubDate>Wed, 19 Dec 2007 01:02:00 GMT</pubDate><guid>http://www.blogjava.net/juhongtao/archive/2007/12/19/168639.html</guid><wfw:comment>http://www.blogjava.net/juhongtao/comments/168639.html</wfw:comment><comments>http://www.blogjava.net/juhongtao/archive/2007/12/19/168639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/juhongtao/comments/commentRss/168639.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/juhongtao/services/trackbacks/168639.html</trackback:ping><description><![CDATA[今天我在调程序时，遇到了见郁闷的事，我用ajax从前台显示页面传字符串变量给处理页面，出现了件怪事，我想传的内容是abc+，但接收以后用System.out.println()输出是abc空格。反复测试好几遍，都是这个结果，真是令人郁闷。在网上搜了搜，找到了原因。<br />原因：   url中有些字符被转义，比如空格被编码成加号，于是传的参数明明是加号，获取的值却成了空格。如何解决呢？如果是通过url传递参数，应该对其进行必要的编码。<br />解决办法：<br />         在javascript中加入   function URLencode(sStr) <br />{<br />    return escape(sStr).replace(/\+/g, '%2B').replace(/\"/g,'%22').replace(/\'/g, '%27').replace(/\//g,'%2F');<br />}<br />对字符串进行处理.如：var str=URLencode("abc+")<br /><img src ="http://www.blogjava.net/juhongtao/aggbug/168639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/juhongtao/" target="_blank">javaGrowing</a> 2007-12-19 09:02 <a href="http://www.blogjava.net/juhongtao/archive/2007/12/19/168639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP文件下载及出现getOutputStream() has already been called for this response的解决方法(转载)</title><link>http://www.blogjava.net/juhongtao/archive/2006/11/10/80386.html</link><dc:creator>javaGrowing</dc:creator><author>javaGrowing</author><pubDate>Fri, 10 Nov 2006 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/juhongtao/archive/2006/11/10/80386.html</guid><wfw:comment>http://www.blogjava.net/juhongtao/comments/80386.html</wfw:comment><comments>http://www.blogjava.net/juhongtao/archive/2006/11/10/80386.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/juhongtao/comments/commentRss/80386.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/juhongtao/services/trackbacks/80386.html</trackback:ping><description><![CDATA[一、采用RequestDispatcher的方式进行<br /><br />1、web.xml文件中增加<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">mime-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">extension</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">doc</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">extension</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">mime-type</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">application/vnd.ms-word</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">mime-type</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">mime-mapping</span><span style="COLOR: #0000ff">&gt;</span></div><br /><br /><br />2、程序如下：<br /><br />    
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">&lt;%@page language="java" import="java.net.*" pageEncoding="gb2312"%&gt;<br />&lt;%<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"> <br />response.setContentType(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">application/x-download</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置为下载application/x-download</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">    String filenamedownload </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/系统解决方案.doc</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">即将下载的文件的相对路径</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">    String filenamedisplay </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">系统解决方案.doc</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">下载文件时显示的文件保存名称</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">    filenamedisplay </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> URLEncoder.encode(filenamedisplay,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">UTF-8</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    response.addHeader(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Content-Disposition</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">attachment;filename=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> filenamedisplay);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_370_600_Open_Image" onclick="this.style.display='none'; Codehighlighter1_370_600_Open_Text.style.display='none'; Codehighlighter1_370_600_Closed_Image.style.display='inline'; Codehighlighter1_370_600_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_370_600_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_370_600_Closed_Text.style.display='none'; Codehighlighter1_370_600_Open_Image.style.display='inline'; Codehighlighter1_370_600_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span id="Codehighlighter1_370_600_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_370_600_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        RequestDispatcher dispatcher </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> application.getRequestDispatcher(filenamedownload);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(dispatcher </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_502_562_Open_Image" onclick="this.style.display='none'; Codehighlighter1_502_562_Open_Text.style.display='none'; Codehighlighter1_502_562_Closed_Image.style.display='inline'; Codehighlighter1_502_562_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_502_562_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_502_562_Closed_Text.style.display='none'; Codehighlighter1_502_562_Open_Image.style.display='inline'; Codehighlighter1_502_562_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_502_562_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_502_562_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            dispatcher.forward(request,response);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        response.flushBuffer();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(Exception e)<br /><img id="Codehighlighter1_629_664_Open_Image" onclick="this.style.display='none'; Codehighlighter1_629_664_Open_Text.style.display='none'; Codehighlighter1_629_664_Closed_Image.style.display='inline'; Codehighlighter1_629_664_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_629_664_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_629_664_Closed_Text.style.display='none'; Codehighlighter1_629_664_Open_Image.style.display='inline'; Codehighlighter1_629_664_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span id="Codehighlighter1_629_664_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_629_664_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        e.printStackTrace();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">finally</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_682_693_Open_Image" onclick="this.style.display='none'; Codehighlighter1_682_693_Open_Text.style.display='none'; Codehighlighter1_682_693_Closed_Image.style.display='inline'; Codehighlighter1_682_693_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_682_693_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_682_693_Closed_Text.style.display='none'; Codehighlighter1_682_693_Open_Image.style.display='inline'; Codehighlighter1_682_693_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span id="Codehighlighter1_682_693_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_682_693_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />%&gt;</span></div><br /><br /><br />二、采用文件流输出的方式下载<br /><br />1、web.xml文件中增加<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">mime-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">extension</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">doc</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">extension</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">mime-type</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">application/vnd.ms-word</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">mime-type</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">mime-mapping</span><span style="COLOR: #0000ff">&gt;</span></div><br /><br /><br />2、程序如下：<br /><br />    
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">&lt;%@page language="java" contentType="application/x-msdownload" import="java.io.*,java.net.*" pageEncoding="gb2312"%&gt;<br />&lt;%<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><span style="COLOR: #008000">//</span><span style="COLOR: #008000">关于文件下载时采用文件流输出的方式处理：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">加上response.reset()，并且所有的％&gt;后面不要换行，包括最后一个；<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">因为Application Server在处理编译jsp时对于％&gt;和&lt;％之间的内容一般是原样输出，而且默认是PrintWriter，<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">而你却要进行流输出：ServletOutputStream，这样做相当于试图在Servlet中使用两种输出机制，<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">就会发生：getOutputStream() has already been called for this response的错误<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">详细请见《More Java Pitfill》一书的第二部分 Web层Item 33：试图在Servlet中使用两种输出机制 270<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">而且如果有换行，对于文本文件没有什么问题，但是对于其它格式，比如AutoCAD、Word、Excel等文件<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">下载下来的文件中就会多出一些换行符0x0d和0x0a，这样可能导致某些格式的文件无法打开，有些也可以正常打开。</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    response.reset();</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">可以加也可以不加</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">    response.setContentType(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">application/x-download</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置为下载application/x-download<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> /../../退WEB-INF/classes两级到应用的根目录下去，注意Tomcat与WebLogic下面这一句得到的路径不同，WebLogic中路径最后没有/</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">    System.out.println(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.getClass().getClassLoader().getResource(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">).getPath());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    String filenamedownload </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.getClass().getClassLoader().getResource(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">).getPath() </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/../../系统解决方案.doc</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    String filenamedisplay </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">系统解决方案.doc</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">系统解决方案.txt</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">    filenamedisplay </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> URLEncoder.encode(filenamedisplay,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">UTF-8</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    response.addHeader(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Content-Disposition</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">attachment;filename=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> filenamedisplay);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    OutputStream output </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    FileInputStream fis </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_1165_1442_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1165_1442_Open_Text.style.display='none'; Codehighlighter1_1165_1442_Closed_Image.style.display='inline'; Codehighlighter1_1165_1442_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1165_1442_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1165_1442_Closed_Text.style.display='none'; Codehighlighter1_1165_1442_Open_Image.style.display='inline'; Codehighlighter1_1165_1442_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span id="Codehighlighter1_1165_1442_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1165_1442_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        output  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> response.getOutputStream();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        fis </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileInputStream(filenamedownload);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] b </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">1024</span><span style="COLOR: #000000">];<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">((i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> fis.read(b)) </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_1367_1412_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1367_1412_Open_Text.style.display='none'; Codehighlighter1_1367_1412_Closed_Image.style.display='inline'; Codehighlighter1_1367_1412_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1367_1412_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1367_1412_Closed_Text.style.display='none'; Codehighlighter1_1367_1412_Open_Image.style.display='inline'; Codehighlighter1_1367_1412_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_1367_1412_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1367_1412_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            output.write(b, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, i);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        output.flush();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(Exception e)<br /><img id="Codehighlighter1_1471_1544_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1471_1544_Open_Text.style.display='none'; Codehighlighter1_1471_1544_Closed_Image.style.display='inline'; Codehighlighter1_1471_1544_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1471_1544_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1471_1544_Closed_Text.style.display='none'; Codehighlighter1_1471_1544_Open_Image.style.display='inline'; Codehighlighter1_1471_1544_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span id="Codehighlighter1_1471_1544_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1471_1544_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Error!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        e.printStackTrace();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">finally</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_1562_1763_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1562_1763_Open_Text.style.display='none'; Codehighlighter1_1562_1763_Closed_Image.style.display='inline'; Codehighlighter1_1562_1763_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1562_1763_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1562_1763_Closed_Text.style.display='none'; Codehighlighter1_1562_1763_Open_Image.style.display='inline'; Codehighlighter1_1562_1763_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span id="Codehighlighter1_1562_1763_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1562_1763_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(fis </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_1596_1655_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1596_1655_Open_Text.style.display='none'; Codehighlighter1_1596_1655_Closed_Image.style.display='inline'; Codehighlighter1_1596_1655_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1596_1655_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1596_1655_Closed_Text.style.display='none'; Codehighlighter1_1596_1655_Open_Image.style.display='inline'; Codehighlighter1_1596_1655_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_1596_1655_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1596_1655_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            fis.close();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            fis </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(output </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_1692_1757_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1692_1757_Open_Text.style.display='none'; Codehighlighter1_1692_1757_Closed_Image.style.display='inline'; Codehighlighter1_1692_1757_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1692_1757_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1692_1757_Closed_Text.style.display='none'; Codehighlighter1_1692_1757_Open_Image.style.display='inline'; Codehighlighter1_1692_1757_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_1692_1757_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1692_1757_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            output.close();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            output </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />%&gt;</span></div><br /><img src ="http://www.blogjava.net/juhongtao/aggbug/80386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/juhongtao/" target="_blank">javaGrowing</a> 2006-11-10 14:25 <a href="http://www.blogjava.net/juhongtao/archive/2006/11/10/80386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>禁用jsp页面缓存</title><link>http://www.blogjava.net/juhongtao/archive/2006/11/08/79846.html</link><dc:creator>javaGrowing</dc:creator><author>javaGrowing</author><pubDate>Wed, 08 Nov 2006 06:42:00 GMT</pubDate><guid>http://www.blogjava.net/juhongtao/archive/2006/11/08/79846.html</guid><wfw:comment>http://www.blogjava.net/juhongtao/comments/79846.html</wfw:comment><comments>http://www.blogjava.net/juhongtao/archive/2006/11/08/79846.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/juhongtao/comments/commentRss/79846.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/juhongtao/services/trackbacks/79846.html</trackback:ping><description><![CDATA[
		<p>response.setHeader("Cache-Control","no-cache"); //HTTP 1.1</p>
		<p> response.setHeader("Pragma","no-cache"); //HTTP 1.0</p>
		<p> response.setDateHeader ("Expires", 0); //prevents caching at the proxy server</p>
<img src ="http://www.blogjava.net/juhongtao/aggbug/79846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/juhongtao/" target="_blank">javaGrowing</a> 2006-11-08 14:42 <a href="http://www.blogjava.net/juhongtao/archive/2006/11/08/79846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javabean实现文件上传</title><link>http://www.blogjava.net/juhongtao/archive/2006/11/03/78900.html</link><dc:creator>javaGrowing</dc:creator><author>javaGrowing</author><pubDate>Fri, 03 Nov 2006 05:12:00 GMT</pubDate><guid>http://www.blogjava.net/juhongtao/archive/2006/11/03/78900.html</guid><wfw:comment>http://www.blogjava.net/juhongtao/comments/78900.html</wfw:comment><comments>http://www.blogjava.net/juhongtao/archive/2006/11/03/78900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/juhongtao/comments/commentRss/78900.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/juhongtao/services/trackbacks/78900.html</trackback:ping><description><![CDATA[请求分析 <br />　　要实现文件上载，我们必须先了解上载文件的HTTP请求。下面这个简单的应用示范了如何上载文件以及把HTTP请求的原始数据写入文件。 
<table style="MARGIN: 10px 7px 3px 0px" cellspacing="0" cellpadding="0" align="left" border="0"><tbody><tr><td><span id="ad_pcdog_big" twffan="done"></span></td></tr></tbody></table>用文本编辑器查看该文件即可了解请求的格式，在此基础上我们就可以提取出上载文件的名字、文件内容以及原本混合在一起的其他信息。 <br /><br />　　这个简单的应用是开发真正文件上载JavaBean的准备工作。它由三个文件构成：HTML文件main.html，JSP页面Jsp1.jsp，JavaBean文件SimpleBean.java。 <br /><br />　　main.html提供一个表单，用户从这里选择文件并把文件上载到服务器。main.html的代码如下： <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;文件上载&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;form action="jsp1.jsp" enctype="MULTIPART/FORM-DATA" method=post&gt; <br />作者: &lt;input type="text" name="author" /&gt; <br />&lt;br /&gt; <br />公司: &lt;input type="text" name="company" /&gt; <br />&lt;br /&gt; <br />选择要上载的文件 &lt;input type="file" name="filename" /&gt; <br />&lt;br /&gt; <br />&lt;input type="submit" value="上载" /&gt; <br />&lt;/form&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br /><br />　　可以看到，&lt;form&gt;标记有一个enctype属性，属性值是"MULTIPART/FORM-DATA"。包括提交按钮在内，表单里面共有4个输入元素。前面两个输入元素是普通的text元素，即author和company。第三个输入元素的type属性是file，这个输入元素就是用来选择文件的元素。 <br /><br />　　表单的action属性值是Jsp1.jsp，这意味着请求（包括上载的文件）将发送给Jsp1.jsp文件。Jsp1.jsp简单地调用名为SimpleBean的JavaBean。 <br />&lt;jsp:useBean id="TheBean" scope="page" class="SimpleBean " /&gt; <br />&lt;% <br />TheBean.doUpload(request); <br />%&gt; <br /><br />下面是SimpleBean的实现代码： <br />import java.io.*; <br />import javax.servlet.http.HttpServletRequest; <br />import javax.servlet.http.HttpServletResponse; <br />import javax.servlet.ServletInputStream; <br /><br />public class FileUploadBean { <br />public void doUpload(HttpServletRequest request) throws <br />IOException { <br />PrintWriter pw = new PrintWriter( <br />new BufferedWriter(new FileWriter("Demo.out"))); <br />ServletInputStream in = request.getInputStream(); <br />int i = in.read(); <br />while (i != -1) { <br />pw.print((char) i); <br />i = in.read(); <br />} <br />pw.close(); <br />} <br />} <br /><br />这个JavaBean把HttpServletRequest对象的表单原始数据写入Demo.out文件。应用的用户界面由main.html文件提供，如下图所示。 <br /><br />　　我们选择上载的文件是abisco.html。选择上载HTML文件是为了便于观察上载后的格式，因为HTML文件本质上是文本文件，我们可以方便地浏览其内容。abisco.html文件的内容如下： <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;Abisco&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;/html&gt; <br />　　点击“上载”按钮之后，表单就发送给了Jsp1.jsp文件，一起发送的还有abisco.html文件。Jsp1.jsp文件不会向浏览器发送任何应答内容，但它会生成一个Demo.out文件。 <br />　　打开Demo.out文件，我们可以看到如下内容： <br />-----------------------------7d15340138 <br />Content-Disposition: form-data; name="Author" <br />A. Christie <br />-----------------------------7d15340138 <br />Content-Disposition: form-data; name="Company" <br />Abisco <br />-----------------------------7d15340138 <br />Content-Disposition: form-data; name="Filename"; filename="C:123dataabisco.html" <br />Content-Type: text/html <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;Abisco&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;/html&gt; <br />-----------------------------7d15340138-- <br />　　可以看到，HTTP请求体内包含了所有的表单输入，包括上载的文件。这些输入数据的分隔由一个分隔符实现。分隔符由一系列的“-”字符和一个随机数字构成。在上面的例子中，分隔符为“-----------------------------7d15340138”。最后一个分隔符结束请求体，这个分隔符的后面多出两个“-”符号。 <br /><br />　　对于非文件类型的输入数据，分隔符后面跟着下面这行内容：Content-Disposition: form-data; name=inputName。其中inputName是表单元素的名字。例如：Content-Disposition: form-data; name="Author"。在这行内容的后面，紧跟着两个连续的回车换行符和表单元素值。 <br /><br />　　而对于文件型输入域，分隔符的后面有两行内容。第一行内容包含输入元素的名字以及上载文件在客户端的完整路径，如上例中这行内容是“Content-Disposition: form-data; name="Filename"; filename="C:123dataabisco.html"”。这行内容指出文件输入元素的名字是filename，文件的路径是“C:123dataabisco.html”。注意Windows浏览器会设置文件路径，而Unix/Linux以及Mac浏览器只发送文件名字。 <br /><br />　　第二行包含了文件的内容类型，因此它的具体内容和上载的文件有关。本例中第二行的内容是“Content-Type: text/html”。 <br /><br />　　和非文件输入元素一样，文件内容在两个连续的回车换行符之后正式开始。 <br /><br />上载文件 <br />　　众所周知，JavaBean是Java平台的软件组件，下面要实现的上载功能就是用JavaBean实现，所以它可以方便地应用到任何需要文件上载功能的应用之中。 <br /><br />代码清单如下： <br />package com.brainysoftware.web; <br />import javax.servlet.http.HttpServletRequest; <br />import javax.servlet.ServletInputStream; <br />import java.util.Dictionary; <br />import java.util.Hashtable; <br />import java.io.PrintWriter; <br />import java.io.BufferedWriter; <br />import java.io.FileWriter; <br />import java.io.IOException; <br /><br />public class FileUploadBean { <br />private String savePath, filepath, filename, contentType; <br />private Dictionary fields; <br /><br />public String getFilename() { <br />return filename; <br />} <br /><br />public String getFilepath() { <br />return filepath; <br />} <br /><br />public void setSavePath(String savePath) { <br />this.savePath = savePath; <br />} <br /><br />public String getContentType() { <br />return contentType; <br />} <br /><br />public String getFieldValue(String fieldName) { <br />if (fields == null || fieldName == null) <br />return null; <br />return (String) fields.get(fieldName); <br />} <br /><br />private void setFilename(String s) { <br />if (s==null) <br />return; <br />int pos = s.indexOf("filename=""); <br />if (pos != -1) { <br />filepath = s.substring(pos+10, s.length()-1); <br />// Windows浏览器发送完整的文件路径和名字 <br />// 但Linux/Unix和Mac浏览器只发送文件名字 <br />pos = filepath.lastIndexOf("\"); <br />if (pos != -1) <br />filename = filepath.substring(pos + 1); <br />else <br />filename = filepath; <br />} <br />} <br /><br />private void setContentType(String s) { <br />if (s==null) <br />return; <br />int pos = s.indexOf(": "); <br />if (pos != -1) <br />contentType = s.substring(pos+2, s.length()); <br />} <br /><br />public void doUpload(HttpServletRequest request) throws IOException { <br />ServletInputStream in = request.getInputStream(); <br />byte[] line = new byte[128]; <br />int i = in.readLine(line, 0, 128); <br />if (i &lt; 3) <br />return; <br />int boundaryLength = i - 2; <br />String boundary = new String(line, 0, boundaryLength); //-2丢弃换行字符 <br />fields = new Hashtable(); <br /><br />while (i != -1) { <br />String newLine = new String(line, 0, i); <br />if (newLine.startsWith("Content-Disposition: form-data; name="")) { <br />if (newLine.indexOf("filename="") != -1) { <br />setFilename(new String(line, 0, i-2)); <br />if (filename==null) <br />return; <br /><br />//文件内容 <br />i = in.readLine(line, 0, 128); <br />setContentType(new String(line, 0, i-2)); <br />i = in.readLine(line, 0, 128); <br /><br />//空行 <br />i = in.readLine(line, 0, 128); <br />newLine = new String(line, 0, i); <br />PrintWriter pw = new PrintWriter(new BufferedWriter(new <br />FileWriter((savePath==null? "" : savePath) + filename))); <br />while (i != -1 &amp;&amp; !newLine.startsWith(boundary)) { <br />// 文件内容的最后一行包含换行字符 <br /><br />// 因此我们必须检查当前行是否是最 <br /><br />// 后一行 <br />i = in.readLine(line, 0, 128); <br />if ((i==boundaryLength+2 || i==boundaryLength+4) <br />&amp;&amp; (new String(line, 0, i).startsWith(boundary))) <br />pw.print(newLine.substring(0, newLine.length()-2)); <br />else <br />pw.print(newLine); <br />newLine = new String(line, 0, i); <br />} <br />pw.close(); <br />} <br />else { <br />// 普通表单输入元素 <br />// 获取输入元素名字 <br />int pos = newLine.indexOf("name=""); <br />String fieldName = newLine.substring(pos+6, newLine.length()-3); <br />i = in.readLine(line, 0, 128); <br />i = in.readLine(line, 0, 128); <br />newLine = new String(line, 0, i); <br />StringBuffer fieldValue = new StringBuffer(128); <br />while (i != -1 &amp;&amp; !newLine.startsWith(boundary)) { <br />// 最后一行包含换行字符 <br />// 因此我们必须检查当前行是否是最后一行 <br />i = in.readLine(line, 0, 128); <br />if ((i==boundaryLength+2 || i==boundaryLength+4) <br />&amp;&amp; (new String(line, 0, i).startsWith(boundary))) <br />fieldValue.append(newLine.substring(0, newLine.length()-2)); <br />else <br />fieldValue.append(newLine); <br />newLine = new String(line, 0, i); <br />} <br />fields.put(fieldName, fieldValue.toString()); <br />} <br />} <br />i = in.readLine(line, 0, 128); <br />} <br />} <br />} <br />　　代码的第一行是包声明，如果你不想让该类从属于任何包，可以删除这行代码。接下来的几行代码声明了该JavaBean所要引用的各个类和接口。 <br />　　FileUploadBean类有5个私有的属性（域），6个公用的方法，2个私有的方法。 <br /><br />属性 <br />FileUploadBean类的5个域都是私有的，它们是： <br />private String savePath <br /><br />该域指定了文件上载后保存到服务器的哪一个路径。savePath的值用setSavePath方法设置。这个值应该在调用doUpload方法之前设置；如没有设置，上载后的文件将保存到服务器的默认目录。 <br /><br />private String filepath <br />该域指定了上载文件在客户端的完整路径。filepath的值由doUpload方法设置，在JSP页面或者Servlet中调用getFilepath方法可以获取filepath域的值。对于非Windows下的浏览器，该值等于filename。 <br /><br />private String filename <br />该域是上载文件的名字。filename的值由setFilename方法设置。在JSP或者Servlet中调用getFilename方法可以获取filename域的值。 <br /><br />private String contentType <br />该域是上载文件的内容类型。contentType的值由doUpload方法设置，你可以用getContentType方法获得contentType域的值。 <br /><br />private Dictionary fields <br />fields域保存了用户在表单中输入数据的名字/值对。调用getFieldValue方法可以获取表单输入元素的值。 <br /><br />方法 <br />　　前面四个public类型的方法用于返回FileUploadBean对象的私有域，它们是：getFilepath，getFilename，getContentType以及getFieldValue。 <br /><br />public String getFilepath() <br />返回filepath私有域的值。 <br /><br />public String getFilename() <br />返回filename私有域的值。 <br /><br />public String getContentType() <br />返回contentType私有域的值。 <br /><br />public String getFieldValue(String fieldName) <br />返回HTML表单中指定输入元素的值，元素的名字通过fieldName参数指定。 <br /><br />public void setSavePath(String savePath) <br />用该方法指定服务器上保存上载文件的目录的名字。 <br /><br />public void doUpload(HttpServletRequest request) throws IOException <br />doUpload是FileUploadBean类中最重要的一个方法。它的任务有二个：第一，它从HTML表单提取出输入域的名字和值并保存到Dictionary对象；第二，doUpload方法提取出上载的文件，把这个文件保存到savePath指定的路径，并分别把文件的名字、路径、内容类型赋给filename、filepath和contentType域。 <br /><br />private void setContentType(String s) <br />由doUpload方法调用。setContentType方法从原始字节数据提取出上载文件的内容类型。 <br /><br />private void setFilename(String s) <br />由doUpload方法调用。setFilename方法从原始字节数据提取出文件路径和名字。 <br />　　doUpload方法的参数是Servlet/JSP容器创建的HttpServletRequest对象。HttpServletRequest对象描述了程序为了提取出HTML表单元素名字-值对以及上载文件必须处理的HTTP请求。doUpload方法首先通过HttpServletRequest对象的getInputStream方法获得ServletInputStream对象。 <br /><br />　　如前所述，每一个表单元素由分界符和一组回车换行符分隔。因此，我们可以一行一行地读入HttpServletRequest对象的内容。下面这行代码定义了一个名为line的byte数组： <br />byte[] line = new byte[128]; <br /><br />　　然后，我们用ServletInputStream对象的readLine方法读入HttpServletRequest对象内容的第一行： <br />int i = in.readLine(line, 0, 128); <br /><br />　　第一行应该是分界符，而且如果没有错误的话，它的长度应该大于3。如果它的长度小于3，我们可以认为出现了错误，doUpload方法应该立即返回： <br />if (i &lt; 3) <br />return; <br /><br />　　分界符和分界符的长度都非常重要，从本文后面你可以看到这一点。分界符由一组回车换行符结束，因此它的实际长度要比readLine方法返回的字节数少2。 <br /><br />int boundaryLength = i - 2; <br />　　丢弃byte数组line的最后2个回车换行符即可获得分界符： <br /><br />String boundary = new String(line, 0, boundaryLength); <br />　　接下来，fields域被实例化成Hashtable对象。这个Hashtable对象将用来保存HTML表单元素的名字/值对。 <br /><br />fields = new Hashtable(); <br />　　由于已经有了分界符，接下来我们就可以开始提取出表单元素的值。具体方法是用一个while循环按行读入HttpServletRequest对象的内容，直至遇到内容结束readLine方法返回-1为止。所有的表单元素都以分界符开始，后面跟上“Content-Disposition”行，这一行由下面这些字符开始： <br /><br />Content-Disposition: form-data; name= <br />　　表单元素有两种类型：文件，非文件（普通的表单元素，如TEXT或者HIDDEN元素）。这两种表单元素的区别在于文件元素包含字符串“filename="filename"”。由此，我们可以利用该信息把文件和非文件的表单输入元素区别开来，代码如下： <br />if (newLine.startsWith("Content-Disposition: form-data; name="")) { <br />if (newLine.indexOf("filename="") != -1) { <br /><br />// 文件型表单输入元素 <br />// 这里加上提取文件的代码 <br />. . . <br />} <br />else { <br />// 普通表单输入元素 <br />// 这里加上提取表单元素的代码 <br />. . . <br />} <br />} <br /><br />　　现在，我们首先来看看提取文件内容的代码。 <br />　　文件路径包含在“Content-Disposition”的后面。为提取文件路径和文件名字，doUpload方法调用了setFilename私有方法。setFilename方法提取出文件路径和文件名字信息，然后把它们赋值给filepath和filename域。调用setFilename方法之后，filename域应该不再是null。如果此时filename域仍旧是null，则说明遇到了问题，doUpload方法直接返回。 <br /><br />if (filename==null) <br />return; <br /><br />　　“Content-Disposition”行之后的下一行是内容类型行。因此，doUpload方法接着调用readLine方法，然后调用setContentType私有方法。setContentType方法和setFilename方法相似，它从原始字节数据中提取出上载文件的内容类型并保存到contentType域。 <br /><br />　　紧接内容类型行的下一行是空行，因此程序再调用了一次readLine方法。 <br /><br />i = in.readLine(line, 0, 128); <br />　　接下来开始了真正的文件内容。我们先应该做好通过PrintWriter对象把文件写入磁盘的准备。 <br /><br />PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(( savePath==null? "" : savePath ) + filename))); <br /><br />　　上载文件保存到哪个位置取决于savePath域是否已经设置。如果savePath域没有设置，它的值是null，则文件将被保存到默认目录；如果savePath域已经设置，它的值不是null，则上载的文件被保存到它所指定的目录。 <br /><br />　　然后我们就可以提取文件的内容。具体方法是使用while循环，每次循环读入一行内容并通过PrintWriter的输出方法把它写入磁盘。但我们知道，文件的最后一行包含两个回车换行符号，所以保存到磁盘的字节数据不应该包含这两个字符。因此，如果读入的行不是文件的最后一行，我们把所有读到的字节数据写入磁盘；如果读入的行已经是文件的最后一行，写入磁盘的字节数据要减去最后两个字符。 <br /><br />　　然而，我们并不知道文件的大小，我们只知道紧接文件内容的下一行又是一个分界符；或者，如果文件是最后一个HTML表单元素，接下来的一行是分界符加上两个短划线字符。因此，只要检查下一行内容是否是分界符，我们就知道了何时应该结束while循环。这就是前面说分界符很重要的原因，在这里我们必须用到分界符。 <br /><br />　　虽然我们可以读取下一行内容然后用startsWith方法检查它是否是一个分界符，然而，由于字符串操作的开销非常大，为了减少字符串操作，我们比较readLine读入的字节数组的长度。后者应该等于boundaryLength + 2；或者，如果它是HttpServletRequest对象中的最后一行，由于多出了最后两个短划线字符，它应该等于boundaryLength + 4。由于一行内容即使不是分界符也可以和分界符一样长，当长度匹配之后我们又将它与分界符比较。这就是前面提到boundaryLength很重要的原因了。 <br /><br />　　整个处理过程的实现代码如下： <br />while (i != -1 &amp;&amp; !newLine.startsWith(boundary)) { <br />i = in.readLine(line, 0, 128); <br />if ((i==boundaryLength+2 || i==boundaryLength+4) &amp;&amp; (new String(line, 0, i).startsWith(boundary))) <br />pw.print(newLine.substring(0, newLine.length()-2)); <br />else pw.print(newLine); <br /><br />newLine = new String(line, 0, i); <br />} <br /><br />　　把文件内容保存到磁盘之后，我们关闭了PrintWriter。 <br />pw.close(); <br />非文件的表单元素也可以用类似的方法提取。不同之处在于，此时我们不再把数据写入磁盘，而是把名字-值对保存到Dictionary对象。 <br /><br />fields.put(fieldName, fieldValue.toString()); <br /><br />应用实例 <br />　　编译好Bean之后，我们就可以从Servlet或者JSP页面中使用它了。可能你在Tomcat之类的Servlet/JSP环境下使用Bean，部署Bean最简单的方法是把class文件压缩成jar文件，然而把jar文件放到Tomcat的lib目录下。要让Tomcat装入jar文件，你必须重新启动Tomcat。 <br /><br />　　下面是一个HTML文件和一个JSP文件，它们示范了这个Bean的应用。HTML文件包含一个表单以及几个输入元素： <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;文件上载&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;form action=jsp1.jsp enctype="MULTIPART/FORM-DATA" method=post&gt; <br />作者: &lt;input type=text name=author&gt; <br />&lt;br&gt; <br />公司: &lt;input type=text name=company&gt; <br />&lt;br&gt; <br />说明: &lt;textarea name=comment&gt;&lt;/textarea&gt; <br />&lt;br&gt; <br />选择要上载的文件&lt;input type=file name=filename&gt; <br />&lt;br&gt; <br />文件描述: &lt;input type=text name=description&gt; <br />&lt;br&gt; <br />&lt;input type=submit value="Upload"&gt; <br />&lt;/form&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br /><br />　　用户提交上述表单之后，该HTTP请求将由Jsp1.jsp处理。Jsp1.jsp运用FileUpload这个Bean来处理请求。Jsp1.jsp的代码如下： <br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;jsp:useBean id="TheBean" scope="page" <br />class="com.brainysoftware.web.FileUploadBean" /&gt; <br />&lt;% <br />TheBean.doUpload(request); <br />out.println("Filename:" + TheBean.getFilename()); <br />out.println("&lt;BR&gt;内容类型:" + TheBean.getContentType()); <br />out.println("&lt;BR&gt;作者:" + TheBean.getFieldValue("Author")); <br />out.println("&lt;BR&gt;公司:" + TheBean.getFieldValue("Company")); <br />out.println("&lt;BR&gt;说明:" + TheBean.getFieldValue("Comment")); <br />%&gt;<img src ="http://www.blogjava.net/juhongtao/aggbug/78900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/juhongtao/" target="_blank">javaGrowing</a> 2006-11-03 13:12 <a href="http://www.blogjava.net/juhongtao/archive/2006/11/03/78900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用XMLHTTP Request Object获取服务器数据 </title><link>http://www.blogjava.net/juhongtao/archive/2006/07/29/60703.html</link><dc:creator>javaGrowing</dc:creator><author>javaGrowing</author><pubDate>Sat, 29 Jul 2006 03:46:00 GMT</pubDate><guid>http://www.blogjava.net/juhongtao/archive/2006/07/29/60703.html</guid><wfw:comment>http://www.blogjava.net/juhongtao/comments/60703.html</wfw:comment><comments>http://www.blogjava.net/juhongtao/archive/2006/07/29/60703.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/juhongtao/comments/commentRss/60703.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/juhongtao/services/trackbacks/60703.html</trackback:ping><description><![CDATA[在Web客户端使用xmlhttp对象，可以十分方便的和服务器交换数据，我们可以获取和发送任何类型的数据，甚至二进制数据到服务器上。xmlhttp技术同时也是目前大多数无刷新页面使用的和服务器交换数据的方式，这种方式比以往的隐藏iframe的方法要方便和经济的多。 <br /><br />    同时让我们高兴得是xmlhttp并不是IE特有的东西，虽然目前还不是<a href="http://www.w3.org/">W3C</a>的标准，不过IE, Netscape/Mozilla, 和Safari都支持。在IE中我们使用new ActiveXObject('MSXML2.XMLHTTP')或者new ActiveXObject("Microsoft.XMLHTTP")来获得的xmlhttp对象实例，使用前者还是后者和客户端机器安装的MSXML版本有关。在Netscape/Mozilla和Safari中，使用new XMLHttpRequest()来获得xmlhttp对象实例。比如在IE中，我们通常这样使用： 
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" /><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> xmlhttp </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;  <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" /></span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">  <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />{  <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />    xmlhttp </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ActiveXObject(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MSXML2.XMLHTTP</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);  <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />}  <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" /></span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(e)  <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />{  <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">  <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />    {  <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />        xmlhttp </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ActiveXObject(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Microsoft.XMLHTTP</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);  <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />    }  <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(e2){}  <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />} </span></div></div><p></p><p><br />    使用xmlhttp对象其实是并不是什么困难的事，它一共就6个方法8个属性。不过它最主要的是提供了两种执行模式：同步模式和异步模式。同步模式可以比较精确的控制程序流程，可是如果服务器的Response太慢，browser会有死掉失去相应的问题；而使用异步模式由于是事件触发方式控制流程，会给程序运行带来一些不可与预计的问题，因为你不知道客户端等待服务器Response的过程中，用户会在browser里做什么操作<img height="19" src="http://www.cnblogs.com/Emoticons/emsad.gif" width="19" align="absMiddle" border="0" />。  <br /><br />    下面是一个同步方式获取服务器数据的简单示例： </p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" /><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> GetRemoteData(url) <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />{ <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />    </span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> xmlhttp </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ActiveXObject(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Microsoft.XMLHTTP</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">); <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />    {   <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />         <font style="BACKGROUND-COLOR: highlight" color="highlighttext">xmlhttp.open</font>('GET', url, </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">); <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />         </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( xmlhttp.status </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">200</span><span style="COLOR: #000000"> ) <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />         { <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />             </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> xmlhttp.responseText; <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />         } <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />         </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> '';  <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />    } <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(e) <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />    { <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />         </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> ''; <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />    } <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />}</span></div></div><p><br />    XMLHTTP对象的属性和方法列表(来自IXMLHTTPRequest接口)： 
</p><table style="WIDTH: 100%; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="2" border="0"><tbody><tr><td width="20">   </td><td><table style="BORDER-COLLAPSE: collapse" bordercolor="#000080" cellspacing="0" cellpadding="2" width="90%" border="2"><tbody><tr><td><strong>Name</strong></td><td><strong>Type</strong></td><td><strong>Description</strong></td></tr><tr><td>onreadystatechange </td><td>N/A</td><td>指定当就绪状态发生改变时调用的事件处理函数，仅用于异步操作  </td></tr><tr><td>readyState </td><td>Long</td><td>异步操作的状态：未初始化(0)，正在加载(1)，已加载(2)，交互(3)，已完成(4)</td></tr><tr><td>responseBody </td><td>Variant</td><td>将响应信息正文作为unsigned byte数组返回</td></tr><tr><td>responseStream </td><td>Variant</td><td>将响应信息正文作为一个ADO Stream对象返回</td></tr><tr><td>responseText </td><td>String</td><td>将响应信息正文作为一个文本字符串返回</td></tr><tr><td>responseXML </td><td>Object</td><td>通过XMLDom将响应信息正文解析为XMLDocument对象</td></tr><tr><td>status </td><td>Long</td><td>服务器返回的HTTP状态码</td></tr><tr><td>statusText </td><td>String</td><td>服务器HTTP响应行状态</td></tr></tbody></table></td></tr></tbody></table><table style="WIDTH: 100%; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="2" border="0"><tbody><tr><td width="20">   </td><td><table style="WIDTH: 90%; BORDER-COLLAPSE: collapse" bordercolor="#000080" cellspacing="0" cellpadding="2" border="2"><tbody><tr><td width="50%"><strong>Name</strong></td><td width="50%"><strong>Desciption</strong></td></tr><tr><td>abort</td><td>取消当前 HTTP 请求</td></tr><tr><td>getAllResponseHeaders</td><td>从响应信息中检索所有的标头字段</td></tr><tr><td>getResponseHeader</td><td>从响应信息正文中获得一个 HTTP 标头值</td></tr><tr><td>open(method, url, boolAsync, bstrUser, bstrPassword)</td><td>打开一个与 HTTP 服务器的连接</td></tr><tr><td>send(varBody)</td><td>设定一个请求的标头字段</td></tr><tr><td>setRequestHeader(bstrHeader, bstrValue)</td><td>向 HTTP 服务器发送请求。可包含正文。</td></tr></tbody></table></td></tr></tbody></table><br />    这里面显然就open方法比较麻烦，带了一大堆参数，它们的含义分别是： 
<table style="WIDTH: 100%; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="2" border="0"><tbody><tr><td width="20">   </td><td><table style="BORDER-COLLAPSE: collapse" bordercolor="#000080" cellspacing="0" cellpadding="2" width="90%" border="2"><tbody><tr><td width="18%"><strong>Parameter</strong></td><td width="82%"><strong>Description</strong></td></tr><tr><td width="18%">method</td><td width="82%">HTTP的通信方式，比如GET, HEAD, POST, PUT, DELETE, CONNECT等</td></tr><tr><td width="18%">url</td><td width="82%">接收数据的服务器的URL地址，URL可带QueryString</td></tr><tr><td width="18%">boolAsync</td><td width="82%">一个布尔标识，说明请求是否为异步的。如果是异步通信方式，客户端就不等待服务器的响应；如果是同步方式，客户机会等到服务器返回消息后才去执行其它操作</td></tr><tr><td width="18%">bstrUser</td><td width="82%">用户ID，用于服务器身份验证</td></tr><tr><td width="18%">bstrPassword</td><td width="82%">用户密码，用于服务器身份验证</td></tr></tbody></table></td></tr></tbody></table><br />    异步通讯的示例： <div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" /><span style="COLOR: #000000"><font style="BACKGROUND-COLOR: highlight" color="highlighttext">xmlhttp.open</font>(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">GET</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">default.aspx</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">); <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />xmlhttp.onreadystatechange </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">() <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />{ <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( xmlhttp.readyState</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000"> ) <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />    { <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />        alert(xmlhttp.responseText); <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />    } <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />} <br /><img height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" width="11" align="top" />xmlhttp.send(</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);</span></div></div><p><br />    其实使用xmlhttp就这么简单，复杂的是服务器端数据的组织方式，而且需要开发人员同时熟悉Client和Server端的开发，才能事半功倍。可是好像说了半天这个玩意儿和xml没有什么关系啊，怎么叫xmlhttp呢？我们注意到response的数据类型中有一个responseXML，不过它解析返回的XMLDocument属于<a href="http://dev.csdn.net/article/64/article/69/article/68/article/68/article/68/68424.shtm">XMLDOM</a>的内容了，和使用xmlhttp来和服务器通讯的关系并不大，以后再来细说。 </p><img src ="http://www.blogjava.net/juhongtao/aggbug/60703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/juhongtao/" target="_blank">javaGrowing</a> 2006-07-29 11:46 <a href="http://www.blogjava.net/juhongtao/archive/2006/07/29/60703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>servlet 获取out对象</title><link>http://www.blogjava.net/juhongtao/archive/2006/06/14/52865.html</link><dc:creator>javaGrowing</dc:creator><author>javaGrowing</author><pubDate>Wed, 14 Jun 2006 15:15:00 GMT</pubDate><guid>http://www.blogjava.net/juhongtao/archive/2006/06/14/52865.html</guid><wfw:comment>http://www.blogjava.net/juhongtao/comments/52865.html</wfw:comment><comments>http://www.blogjava.net/juhongtao/archive/2006/06/14/52865.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/juhongtao/comments/commentRss/52865.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/juhongtao/services/trackbacks/52865.html</trackback:ping><description><![CDATA[
		<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="color: rgb(0, 0, 0);">javax.servlet.jsp.JspWriter out;<br />　javax.servlet.jsp.PageContext pageContext </span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);">
						<br />
						<br />　　javax.servlet.jsp.JspFactory.getDefaultFactory().getPageContext(</span>
				<span style="color: rgb(0, 0, 255);">this</span>
				<span style="color: rgb(0, 0, 0);">, request, response, </span>
				<span style="color: rgb(0, 0, 255);">null</span>
				<span style="color: rgb(0, 0, 0);">, </span>
				<span style="color: rgb(0, 0, 255);">true</span>
				<span style="color: rgb(0, 0, 0);">, </span>
				<span style="color: rgb(0, 0, 0);">8192</span>
				<span style="color: rgb(0, 0, 0);">, </span>
				<span style="color: rgb(0, 0, 255);">true</span>
				<span style="color: rgb(0, 0, 0);">);<br /><br />　out </span>
				<span style="color: rgb(0, 0, 0);">=</span>
				<span style="color: rgb(0, 0, 0);"> pageContext.getOut();<br /></span>
		</div>
		<br />
<img src ="http://www.blogjava.net/juhongtao/aggbug/52865.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/juhongtao/" target="_blank">javaGrowing</a> 2006-06-14 23:15 <a href="http://www.blogjava.net/juhongtao/archive/2006/06/14/52865.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Jakarta Commons组件beanutils、dbutils简化JDBC数据库操作（一） </title><link>http://www.blogjava.net/juhongtao/archive/2005/12/29/25961.html</link><dc:creator>javaGrowing</dc:creator><author>javaGrowing</author><pubDate>Thu, 29 Dec 2005 14:41:00 GMT</pubDate><guid>http://www.blogjava.net/juhongtao/archive/2005/12/29/25961.html</guid><wfw:comment>http://www.blogjava.net/juhongtao/comments/25961.html</wfw:comment><comments>http://www.blogjava.net/juhongtao/archive/2005/12/29/25961.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/juhongtao/comments/commentRss/25961.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/juhongtao/services/trackbacks/25961.html</trackback:ping><description><![CDATA[<FONT face=Arial size=2>关键字：beanutils、dbutils、JDBC&nbsp;数据库<BR>摘要：本文简单介绍了Jakarta&nbsp;Commons旗下beanutils、dbutils在基于JDBC&nbsp;API数据库存取操作中的运用。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虽然现在出现了很多ORM框架，可是还是有很多朋友也许还在使用JDBC，就像我现在一样，除了学习的时候在使用Hibernate、Spring类似这些优秀的框架，工作时一直都在使用JDBC。本文就简单介绍一下利用Jakarta&nbsp;Commons旗下beanutils、dbutils简化JDBC数据库操作，以抛砖引玉，希望对像我一样在使用JDBC的朋友有所帮助。<BR>&nbsp;&nbsp;&nbsp;&nbsp;下面就分两部分简单介绍beanutils、dbutils在基于JDBC&nbsp;API数据库存取操作中的运用。第一部分显介绍beanutils在JDBC数据库存取操作中的运用，第二部分介绍dbutils在JDBC数据库存取操作中的运用，最后看看他们的优缺点，谈谈本人在项目运用过程中对他们的一点心得体会，仅供参考，其中有错误的地方希望大虾不吝赐教，大家多多交流共同进步。<BR>一、Jakarta&nbsp;Commons&nbsp;beanutils<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Beanutils是操作Bean的锐利武器，其提过的BeanUtils工具类可以简单方便的读取或设置Bean的属性，利用Dyna系列，还可以在运行期创建Bean，符合懒人的习惯，正如LazyDynaBean，LazyDynaClass一样，呵呵。这些用法已经有很多文章提及，也可以参考apache的官方文档。<BR>对于直接利用JDBC&nbsp;API访问数据库时（这里针对的是返回结果集ResultSet的查询select），大多数都是采用两种方式，一种是取出返回的结果集的数据存于Map中，另一种方式是Bean里。针对第二种方式，Beanutils里提供了ResultSetDynaClass结合DynaBean以及RowSetDynaClass结合DynaBean来简化操作。下面用以个简单的例子展示一下beanutils的这两个类在JDBC数据库操作中的运用。<BR>请在本机建立数据库publish，我用的是MySQL，在publish数据库中建立表book,脚本如下：<BR>CREATE&nbsp;TABLE&nbsp;book(<BR>&nbsp;&nbsp;id&nbsp;int(11)&nbsp;NOT&nbsp;NULL&nbsp;auto_increment,<BR>&nbsp;&nbsp;title&nbsp;varchar(50)&nbsp;character&nbsp;set&nbsp;latin1&nbsp;NOT&nbsp;NULL,<BR>&nbsp;&nbsp;authors&nbsp;varchar(50)&nbsp;character&nbsp;set&nbsp;latin1&nbsp;default&nbsp;NULL,&nbsp;<BR>&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;&nbsp;(id)<BR>)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;然后用你喜欢的编辑器建立一个类BeanutilsJDBCTest，我们先用ResultSetDynaClass来处理，然后再用RowSetDynaClass来实现同样的类，之后看看他们之间有什么不同，用ResultSetDynaClass处理的源代码如下所示:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;然后用你喜欢的编辑器建立一个类BeanutilsJDBCTest，我们先用ResultSetDynaClass来处理，然后再用RowSetDynaClass来实现同样的类，之后看看他们之间有什么不同，用ResultSetDynaClass处理的源代码如下所示:<BR>package&nbsp;cn.qtone.test;<BR>import&nbsp;java.sql.Connection;<BR>import&nbsp;java.sql.DriverManager;<BR>import&nbsp;java.sql.ResultSet;<BR>import&nbsp;java.sql.Statement;<BR>import&nbsp;java.util.Iterator;&nbsp;<BR>import&nbsp;org.apache.commons.beanutils.DynaBean;<BR>import&nbsp;org.apache.commons.beanutils.PropertyUtils;<BR>import&nbsp;org.apache.commons.beanutils.ResultSetDynaClass;&nbsp;<BR>public&nbsp;class&nbsp;BeanutilsJDBCTest{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;=&nbsp;null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;st&nbsp;=&nbsp;null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName("com.mysql.jdbc.Driver");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;url&nbsp;=&nbsp;"jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&amp;characterEncoding=GBK";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con&nbsp;=&nbsp;DriverManager.getConnection(url,&nbsp;"root",&nbsp;"hyys");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st&nbsp;=&nbsp;con.createStatement();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs&nbsp;=&nbsp;st.executeQuery("select&nbsp;*&nbsp;from&nbsp;book");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSetDynaClass&nbsp;rsDynaClass&nbsp;=&nbsp;new&nbsp;ResultSetDynaClass(rs);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;itr&nbsp;=&nbsp;rsDynaClass.iterator();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("title-------------authors");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(itr.hasNext())&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DynaBean&nbsp;dBean&nbsp;=&nbsp;(DynaBean)&nbsp;itr.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(PropertyUtils.getSimpleProperty(dBean,"title")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"-------------"+&nbsp;PropertyUtils.getSimpleProperty(dBean,&nbsp;"authors"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;finally&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rs&nbsp;!=&nbsp;null)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(st&nbsp;!=&nbsp;null)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(con&nbsp;!=&nbsp;null)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}&nbsp;<BR>用RowSetDynaClass处理的源代码如下所示:&nbsp;<BR>package&nbsp;cn.qtone.test;&nbsp;<BR>import&nbsp;java.sql.Connection;<BR>import&nbsp;java.sql.DriverManager;<BR>import&nbsp;java.sql.ResultSet;<BR>import&nbsp;java.sql.Statement;<BR>import&nbsp;java.util.Iterator;<BR>import&nbsp;java.util.List;&nbsp;<BR>import&nbsp;org.apache.commons.beanutils.DynaBean;<BR>import&nbsp;org.apache.commons.beanutils.PropertyUtils;<BR>import&nbsp;org.apache.commons.beanutils.RowSetDynaClass;&nbsp;<BR>public&nbsp;class&nbsp;BeanutilsJDBCTest{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;rsDynaClass&nbsp;=&nbsp;rsTest();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("title&nbsp;-------------&nbsp;authors&nbsp;");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;itr&nbsp;=&nbsp;rsDynaClass.iterator();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(itr.hasNext())&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DynaBean&nbsp;dBean&nbsp;=&nbsp;(DynaBean)&nbsp;itr.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(PropertyUtils.getSimpleProperty(dBean,"name")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"-------------"+&nbsp;PropertyUtils.getSimpleProperty(dBean,&nbsp;"mobile"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO&nbsp;自动生成&nbsp;catch&nbsp;块<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;List&nbsp;rsTest()&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;=&nbsp;null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;st&nbsp;=&nbsp;null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName("com.mysql.jdbc.Driver");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;url&nbsp;=&nbsp;"jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&amp;characterEncoding=GBK";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con&nbsp;=&nbsp;DriverManager.getConnection(url,&nbsp;"root",&nbsp;"hyys");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st&nbsp;=&nbsp;con.createStatement();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs&nbsp;=&nbsp;st.executeQuery("select&nbsp;*&nbsp;from&nbsp;book");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RowSetDynaClass&nbsp;rsdc&nbsp;=&nbsp;new&nbsp;RowSetDynaClass(rs);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;rsdc.getRows();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;finally&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rs&nbsp;!=&nbsp;null)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(st&nbsp;!=&nbsp;null)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(con&nbsp;!=&nbsp;null)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}&nbsp;<BR>这两个方法输出的结果应该是一样的。但是很显然第二种方式比第一种方式要好，它把数据访问部分抽取出来放到一个方法中，显得简单清晰。<BR>其实在利用ResultSetDynaClass时，必须在ResultSet等数据库资源关闭之前，处理好那些数据，你不能在资源关闭之后使用DynaBean，否则就会抛出异常，异常就是说不能在ResultSet之后存取数据（具体的异常名我也忘了），当然你也可以采用以前的方式一个一个的把数据放到Map里，如果你一定要那样做，建议还是别用Beanutils，因为这没带给你什么好处。总之利用ResultSetDynaClass你的程序的扩展性非常部好。<BR>从第二中方式可以看出，利用RowSetDynaClass可以很好的解决上述ResultSetDynaClass遇到的问题，RowSetDynaClass的getRows()方法，把每一行封装在一个DynaBean对象里，然后，把说有的行放到一个List里，之后你就可以对返回的List里的每一个DynaBean进行处理，此外对于DynaBean你还可以采用标准的get/set方式处理，当然你也可以用PropertyUtils.&nbsp;getSimpleProperty(Object&nbsp;bean,&nbsp;String&nbsp;name)进行处理。<BR>从上面的分析中，你应该可以决定你应该使用ResultSetDynaClass还是RowSetDynaClass了。</FONT><BR><img src ="http://www.blogjava.net/juhongtao/aggbug/25961.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/juhongtao/" target="_blank">javaGrowing</a> 2005-12-29 22:41 <a href="http://www.blogjava.net/juhongtao/archive/2005/12/29/25961.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Jakarta Commons组件beanutils、dbutils简化JDBC数据库操作（二）</title><link>http://www.blogjava.net/juhongtao/archive/2005/12/29/25959.html</link><dc:creator>javaGrowing</dc:creator><author>javaGrowing</author><pubDate>Thu, 29 Dec 2005 14:39:00 GMT</pubDate><guid>http://www.blogjava.net/juhongtao/archive/2005/12/29/25959.html</guid><wfw:comment>http://www.blogjava.net/juhongtao/comments/25959.html</wfw:comment><comments>http://www.blogjava.net/juhongtao/archive/2005/12/29/25959.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/juhongtao/comments/commentRss/25959.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/juhongtao/services/trackbacks/25959.html</trackback:ping><description><![CDATA[<STRONG>二、Jakarta&nbsp;Commons&nbsp;dbutils：<BR></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;用JDBC&nbsp;API时最令人讨厌的就是异常处理，也很烦琐，而且很容易出错，本人曾考虑过利用模板进行处理，后来看到了dbutils，之后就采用那个dbutils，采用模板的方式各位朋友可以参考Spring，Spring的JdbcTemplate不灵活而强大，呵呵，说句闲话，实在太佩服Rod&nbsp;Johnson了，Rod&nbsp;Johnson真的很令人尊敬。<BR>&nbsp;&nbsp;&nbsp;&nbsp;Dbutils的QueryRunner把大多数与关闭资源相关的封装起来，另外，你也可以使用DbUtils进行关闭，当然DbUtils提供的功能当然不止这些，它提过了几个常用的静态方法，除了上述的关闭资源外，DbUtils.&nbsp;commitAndClose(Connection&nbsp;conn)还提供事务提及等操作。<BR>还是以一个例子来说说吧，毕竟我不是搞业务的，小嘴巴吧嗒吧哒不起来啊，呵呵。<BR>&nbsp;&nbsp;&nbsp;&nbsp;为了和采用Beanutils更好的进行对比，这个例子还是实现同样的功能，数据库同样采用前一篇文章中提到的publish。<BR>同样的，用你喜欢的编辑器建立一个类DbutilsJDBCTest，示例代码如下所示:<BR>package&nbsp;cn.qtone.test;<BR>import&nbsp;java.sql.Connection;<BR>import&nbsp;java.sql.DriverManager;<BR>import&nbsp;java.sql.SQLException;<BR>import&nbsp;java.util.List;<BR>import&nbsp;java.util.Map;<BR>import&nbsp;org.apache.commons.dbutils.DbUtils;<BR>import&nbsp;org.apache.commons.dbutils.QueryRunner;<BR>import&nbsp;org.apache.commons.dbutils.handlers.MapListHandler;<BR>public&nbsp;class&nbsp;DbutilsJDBCTest{<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;jdbcURL&nbsp;=&nbsp;"jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&amp;characterEncoding=GBK";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;jdbcDriver&nbsp;=&nbsp;"com.mysql.jdbc.Driver";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbUtils.loadDriver(jdbcDriver);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Username&nbsp;"root".&nbsp;Password&nbsp;"root"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;=&nbsp;DriverManager.getConnection(jdbcURL,&nbsp;"root",&nbsp;"root");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryRunner&nbsp;qRunner&nbsp;=&nbsp;new&nbsp;QueryRunner();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("***Using&nbsp;MapListHandler***");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//以下部分代码采用Map存储方式，可以采用Bean的方式代替进行处理<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;lMap&nbsp;=&nbsp;(List)&nbsp;qRunner.query(conn,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"select&nbsp;title,authors&nbsp;&nbsp;from&nbsp;books",&nbsp;new&nbsp;MapListHandler());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//以下是处理代码，可以抽取出来<BR>System.out.println("title&nbsp;-------------&nbsp;authors&nbsp;");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;lMap.size();&nbsp;i++)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;vals&nbsp;=&nbsp;(Map)&nbsp;lMap.get(i);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(vals.get("title")+"-------------"+&nbsp;vals.get("authors"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;ex)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;finally&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbUtils.closeQuietly(conn);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR>怎么样?是不是比采用Beanutils的ResultSetDynaTrial和RowSetDynaClass好多了？采用Beanutils令人难缠的是关闭那些资源以及处理那些异常，而这里采用Dbutils显然代码量减少了很多。<BR>上例在处理结果集时，它把数据库中的每一行映射成一个Map，其中列名作为Key，该列对应的值作为Value存放，查询的所有的数据一起放在一个List里，然后进行处理，当然，一个更明智的处理是直接返回List然后再单独进行处理。<BR>事实上上例返回的结果集中的每一行不必放在一个Map里，你可以放在一个Bean里，当然如果你真的很懒，你也可以使用Beanutils的LazyDynaClass和LazyDynaBean，不过也许没有必要那么做，至于原因请看下文。<BR><BR>如果使用Bean而不是用Map，那么，你也许需要建立一个Bean，如下：<BR>package&nbsp;cn.qtone.test;<BR>public&nbsp;class&nbsp;Book&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;id;<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;title;<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;authors&nbsp;;<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;StudentBean()&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getAuthors()&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;authors;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setAuthors(String&nbsp;authors)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.authors&nbsp;=&nbsp;authors;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getId()&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;id;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setId(int&nbsp;id)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.id&nbsp;=&nbsp;id;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getTitle()&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;title;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setTitle(String&nbsp;title)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.title&nbsp;=&nbsp;title;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR>然后简单修改一下DbutilsJDBCTest&nbsp;中的部分代码即可，代替之后的源代码如下：<BR><BR>package&nbsp;cn.qtone.test;<BR><BR>import&nbsp;java.sql.Connection;<BR>import&nbsp;java.sql.DriverManager;<BR>import&nbsp;java.sql.SQLException;<BR>import&nbsp;java.util.List;<BR>import&nbsp;java.util.Map;<BR>import&nbsp;org.apache.commons.dbutils.DbUtils;<BR>import&nbsp;org.apache.commons.dbutils.QueryRunner;<BR>import&nbsp;org.apache.commons.dbutils.handlers.BeanListHandler;<BR><BR>public&nbsp;class&nbsp;DbutilsJDBCTest{<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;jdbcURL&nbsp;=&nbsp;"jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&amp;characterEncoding=GBK";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;jdbcDriver&nbsp;=&nbsp;"com.mysql.jdbc.Driver";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbUtils.loadDriver(jdbcDriver);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Username&nbsp;"root".&nbsp;Password&nbsp;"root"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;=&nbsp;DriverManager.getConnection(jdbcURL,&nbsp;"root",&nbsp;"root");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryRunner&nbsp;qRunner&nbsp;=&nbsp;new&nbsp;QueryRunner();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("***Using&nbsp;BeanListHandler&nbsp;***");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//以下部分代码采用Map存储方式，可以采用Bean的方式代替进行处理<BR>List&nbsp;lBeans&nbsp;=&nbsp;(List)&nbsp;qRunner.query(conn,"&nbsp;select&nbsp;title,authors&nbsp;from&nbsp;books&nbsp;",&nbsp;new&nbsp;BeanListHandler(Book.class));<BR>&nbsp;&nbsp;&nbsp;&nbsp;//以下是处理代码，可以抽取出来<BR>System.out.println("title&nbsp;-------------&nbsp;authors&nbsp;");<BR>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;lBeans.size();&nbsp;i++)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Book&nbsp;vals&nbsp;=&nbsp;(Book)&nbsp;lBeans.get(i);&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(vals.getTitle&nbsp;()+"-------------"+&nbsp;vals.&nbsp;getAuthors&nbsp;());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;ex)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;finally&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbUtils.closeQuietly(conn);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR>&nbsp;&nbsp;&nbsp;&nbsp;这两种法输出的结果应该是一样的。两种处理方式都差不多，但我更愿意采用第一种，因为第一种少写一个bean，而且我测试过采用Map的方式即第一种方式性能要好的多，采用Bean性能比较低可能是因为采用反射的缘故，采用反射的东东性能和不采用反射的还是有点差距。也是这个原因，不推荐采用LazyDynaClass和LazyDynaBean，因为采用这二者是在运行期动态创建Bean类和Bean属性，然后再创建Bean对象的，其性能可想而知了（不过我没有测试过啊，所以我说这个话可说是没有根据的，感兴趣的朋友自己测试一下，记得告诉我结果哦，呵呵），除了MapListHandler以及BeanListHandler之外，DButils还提供了其他的Handler，如果这些不能满足你的需求，你也可以自己实现一个Handler。<BR>&nbsp;&nbsp;&nbsp;&nbsp;最后，也是最大的体会,也许是最大的收获吧，那就是:对于每一个项目,在根据每一个需求获取相应解决方案时,先寻找开源组件,看是否已经有满足某些功能需求的开源组件,如果没有,再考虑自主开发或者向第三方购买，否则尽量采用开源组件.<BR>&nbsp;&nbsp;&nbsp;&nbsp;请尽量享用开源的魅力，尽情的拥抱开源吧。<BR>&nbsp;&nbsp;&nbsp;&nbsp;好了，终于写完了，有什么问题请联系我，大家互相交流交流。<BR><img src ="http://www.blogjava.net/juhongtao/aggbug/25959.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/juhongtao/" target="_blank">javaGrowing</a> 2005-12-29 22:39 <a href="http://www.blogjava.net/juhongtao/archive/2005/12/29/25959.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>