﻿<?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-nighty-随笔分类-Java</title><link>http://www.blogjava.net/nighty/category/31702.html</link><description>折腾的年华</description><language>zh-cn</language><lastBuildDate>Thu, 28 Apr 2011 10:15:27 GMT</lastBuildDate><pubDate>Thu, 28 Apr 2011 10:15:27 GMT</pubDate><ttl>60</ttl><item><title>扩展commons dbutils的JavaBean转换方式</title><link>http://www.blogjava.net/nighty/archive/2011/04/26/349050.html</link><dc:creator>寒武纪</dc:creator><author>寒武纪</author><pubDate>Tue, 26 Apr 2011 08:41:00 GMT</pubDate><guid>http://www.blogjava.net/nighty/archive/2011/04/26/349050.html</guid><wfw:comment>http://www.blogjava.net/nighty/comments/349050.html</wfw:comment><comments>http://www.blogjava.net/nighty/archive/2011/04/26/349050.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nighty/comments/commentRss/349050.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nighty/services/trackbacks/349050.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引言：最近又用到dbutils，之前一直用Map映射的方式取出select的结果再手工做转换。有写过一篇文章说MapHandler方式的一个缺陷：<a title="关于commons dbutils组件的一个小缺陷分析" href="http://www.blogjava.net/nighty/archive/2011/02/12/344155.html">关于commons dbutils组件的一个小缺陷分析</a>&nbsp;，用这种方式，在项目不大的情况下，写一些Map到JavaBean的转换代码工作量不大，但是在数据库表过多并且表中的字段过多的情况下，这种重复的setter感觉有点烦。于是又重新思考了BeanHandler和BeanListHandler的情况，dbutils底层映射用的反射，性能上肯定有损失，不过在大多数项目规模不是很大的情况下，这点损失可以忽略，带来的代码减少却是比较可观。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 问题在哪里？先看一段官方的示例代码：<br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #000000">QueryRunner&nbsp;run&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QueryRunner(dataSource);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Use&nbsp;the&nbsp;BeanHandler&nbsp;implementation&nbsp;to&nbsp;convert&nbsp;the&nbsp;first<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;ResultSet&nbsp;row&nbsp;into&nbsp;a&nbsp;Person&nbsp;JavaBean.</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #000000">ResultSetHandler</span><span style="color: #000000">&lt;</span><span style="color: #000000">Person</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;h&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BeanHandler</span><span style="color: #000000">&lt;</span><span style="color: #000000">Person</span><span style="color: #000000">&gt;</span><span style="color: #000000">(Person.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Execute&nbsp;the&nbsp;SQL&nbsp;statement&nbsp;with&nbsp;one&nbsp;replacement&nbsp;parameter&nbsp;and<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;return&nbsp;the&nbsp;results&nbsp;in&nbsp;a&nbsp;new&nbsp;Person&nbsp;object&nbsp;generated&nbsp;by&nbsp;the&nbsp;BeanHandler.</span><span style="color: #008000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #000000">Person&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;run.query(<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">SELECT&nbsp;*&nbsp;FROM&nbsp;Person&nbsp;WHERE&nbsp;name=?</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;h,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">John&nbsp;Doe</span><span style="color: #000000">"</span><span style="color: #000000">);</span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里有个地方有约束，就是要求示例中的JavaBean类Person中的字段定义要和数据库的字段定义一致。Java的命名习惯一般是骆峰写法，例如userId，那么数据库中就必须定义为userId，而问题在于：有时候我们需要数据库中字段的定义格式与JavaBean的命名不一样，比如数据库定义为：user_id，而JavaBean则定义为userId<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看源代码可能有点费时间，在官方的example页面的最下面果然有一段关于自定义BeanProcessor的指引。摘录出来：<br />
<hr />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #3366ff">BasicRowProcessor uses a BeanProcessor to convert ResultSet columns into JavaBean properties. You can subclass and override processing steps to handle datatype mapping specific to your application. The provided implementation delegates datatype conversion to the JDBC driver. <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BeanProcessor maps columns to bean properties as documented in the BeanProcessor.toBean() javadoc. Column names must match the bean's property names case insensitively. For example, the firstname column would be stored in the bean by calling its setFirstName() method. However, many database column names include characters that either can't be used or are not typically used in Java method names. You can do one of the following to map these columns to bean properties: <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. Alias the column names in the SQL so they match the Java names: select social_sec# as socialSecurityNumber from person <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. Subclass BeanProcessor and override the mapColumnsToProperties() method to strip out the offending characters. </span><br />
<hr />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大概意思就是提供二种方式：一种就是最直接的，用as关键字把colName重命名，另一种方式就是继承BeanProcessor类，重写mapColumnsToProperties()方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那当然是第二种方式更加具有代表性。尝试了一下。代码如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_55_1274_Open_Image" onclick="this.style.display='none'; Codehighlighter1_55_1274_Open_Text.style.display='none'; Codehighlighter1_55_1274_Closed_Image.style.display='inline'; Codehighlighter1_55_1274_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" /><img style="display: none" id="Codehighlighter1_55_1274_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_55_1274_Closed_Text.style.display='none'; Codehighlighter1_55_1274_Open_Image.style.display='inline'; Codehighlighter1_55_1274_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CustomBeanProcessor&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;BeanProcessor&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_55_1274_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_55_1274_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">[]&nbsp;mapColumnsToProperties(ResultSetMetaData&nbsp;rsmd,<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img id="Codehighlighter1_185_930_Open_Image" onclick="this.style.display='none'; Codehighlighter1_185_930_Open_Text.style.display='none'; Codehighlighter1_185_930_Closed_Image.style.display='inline'; Codehighlighter1_185_930_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_185_930_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_185_930_Closed_Text.style.display='none'; Codehighlighter1_185_930_Open_Image.style.display='inline'; Codehighlighter1_185_930_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertyDescriptor[]&nbsp;props)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;SQLException&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_185_930_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_185_930_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;cols&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rsmd.getColumnCount();<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;columnToProperty[]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">[cols&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Arrays.fill(columnToProperty,&nbsp;PROPERTY_NOT_FOUND);<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img id="Codehighlighter1_381_894_Open_Image" onclick="this.style.display='none'; Codehighlighter1_381_894_Open_Text.style.display='none'; Codehighlighter1_381_894_Closed_Image.style.display='inline'; Codehighlighter1_381_894_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_381_894_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_381_894_Closed_Text.style.display='none'; Codehighlighter1_381_894_Open_Image.style.display='inline'; Codehighlighter1_381_894_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;col&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;col&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;cols;&nbsp;col</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_381_894_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_381_894_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;columnName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rsmd.getColumnLabel(col);&nbsp;<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img id="Codehighlighter1_506_572_Open_Image" onclick="this.style.display='none'; Codehighlighter1_506_572_Open_Text.style.display='none'; Codehighlighter1_506_572_Closed_Image.style.display='inline'; Codehighlighter1_506_572_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_506_572_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_506_572_Closed_Text.style.display='none'; Codehighlighter1_506_572_Open_Image.style.display='inline'; Codehighlighter1_506_572_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;columnName&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;columnName.length())&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_506_572_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_506_572_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;columnName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rsmd.getColumnName(col);<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;columnName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;colNameConvent(columnName);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;在这里进行数据库表columnName的特殊处理</span><span style="color: #008000"><br />
</span><span style="color: #008080">16</span><span style="color: #008000"><img id="Codehighlighter1_706_884_Open_Image" onclick="this.style.display='none'; Codehighlighter1_706_884_Open_Text.style.display='none'; Codehighlighter1_706_884_Closed_Image.style.display='inline'; Codehighlighter1_706_884_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_706_884_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_706_884_Closed_Text.style.display='none'; Codehighlighter1_706_884_Open_Image.style.display='inline'; Codehighlighter1_706_884_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;props.length;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_706_884_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_706_884_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /><br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img id="Codehighlighter1_778_870_Open_Image" onclick="this.style.display='none'; Codehighlighter1_778_870_Open_Text.style.display='none'; Codehighlighter1_778_870_Closed_Image.style.display='inline'; Codehighlighter1_778_870_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_778_870_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_778_870_Closed_Text.style.display='none'; Codehighlighter1_778_870_Open_Image.style.display='inline'; Codehighlighter1_778_870_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(columnName.equalsIgnoreCase(props[i].getName()))&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_778_870_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_778_870_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;columnToProperty[col]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;<br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;columnToProperty;<br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /><br />
</span><span style="color: #008080">27</span><span style="color: #000000"><img id="Codehighlighter1_934_989_Open_Image" onclick="this.style.display='none'; Codehighlighter1_934_989_Open_Text.style.display='none'; Codehighlighter1_934_989_Closed_Image.style.display='inline'; Codehighlighter1_934_989_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_934_989_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_934_989_Closed_Text.style.display='none'; Codehighlighter1_934_989_Open_Image.style.display='inline'; Codehighlighter1_934_989_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_934_989_Closed_Text">/**&nbsp;*/</span><span id="Codehighlighter1_934_989_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">28</span><span style="color: #008000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;数据库列名重新约定<br />
</span><span style="color: #008080">29</span><span style="color: #008000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;columnName<br />
</span><span style="color: #008080">30</span><span style="color: #008000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000"><br />
</span><span style="color: #008080">31</span><span style="color: #008000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img id="Codehighlighter1_1041_1272_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1041_1272_Open_Text.style.display='none'; Codehighlighter1_1041_1272_Closed_Image.style.display='inline'; Codehighlighter1_1041_1272_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_1041_1272_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1041_1272_Closed_Text.style.display='none'; Codehighlighter1_1041_1272_Open_Image.style.display='inline'; Codehighlighter1_1041_1272_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;colNameConvent(String&nbsp;columnName)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1041_1272_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1041_1272_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;strs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;columnName.split(</span><span style="color: #000000">"</span><span style="color: #000000">_</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">34</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;conventName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
</span><span style="color: #008080">35</span><span style="color: #000000"><img id="Codehighlighter1_1151_1206_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1151_1206_Open_Text.style.display='none'; Codehighlighter1_1151_1206_Closed_Image.style.display='inline'; Codehighlighter1_1151_1206_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_1151_1206_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1151_1206_Closed_Text.style.display='none'; Codehighlighter1_1151_1206_Open_Image.style.display='inline'; Codehighlighter1_1151_1206_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;strs.length;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1151_1206_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1151_1206_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">36</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conventName&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;StringUtils.capitalize(strs[i]);<br />
</span><span style="color: #008080">37</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">38</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringUtils.uncapitalize(conventName);<br />
</span><span style="color: #008080">39</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;conventName;<br />
</span><span style="color: #008080">40</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">41</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意mapColumnsToProperties方法的逻辑是从父类的方法中直接复制出来的，然后在第15行那里变了个戏法，这里的columnName就是从数据库中读出来的，自定义一个private方法用于转换命名，这里你就可以添加自己的命名约束。例如上面就是把 user_id 转化为Java的骆峰写法：userId<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;再深入一层思考，你可以在这里进行更多扩展，以便让自己可以选择不同的命名转换方式。定义了这个Processor之后，下面看看如何调用：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #000000">Connection&nbsp;conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ConnectionManager.getInstance().getConnection();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />QueryRunner&nbsp;qr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QueryRunner();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />CustomBeanProcessor&nbsp;convert&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CustomBeanProcessor();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />RowProcessor&nbsp;rp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BasicRowProcessor(convert);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />BeanHandler</span><span style="color: #000000">&lt;</span><span style="color: #000000">User</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;bh&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BeanHandler</span><span style="color: #000000">&lt;</span><span style="color: #000000">User</span><span style="color: #000000">&gt;</span><span style="color: #000000">(User.</span><span style="color: #0000ff">class</span><span style="color: #000000">,&nbsp;rp);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />User&nbsp;u&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;qr.query(conn,&nbsp;sql,&nbsp;bh,&nbsp;params);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />DbUtils.close(conn);</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是不是非常灵活？如果是想返回List结果的，就把BeanHandler替换成BeanListHander类，还可以再进一步封装这些操作，抽象到公共模块中去，让外部直接传入sql语句和Class就能直接返回想要的结果，当然你得增加泛型的定义。同样举一个封装的例子：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;selectBeanList(Connection&nbsp;conn,&nbsp;String&nbsp;sql,&nbsp;Class</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;type,<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_118_443_Open_Image" onclick="this.style.display='none'; Codehighlighter1_118_443_Open_Text.style.display='none'; Codehighlighter1_118_443_Closed_Image.style.display='inline'; Codehighlighter1_118_443_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" /><img style="display: none" id="Codehighlighter1_118_443_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_118_443_Closed_Text.style.display='none'; Codehighlighter1_118_443_Open_Image.style.display='inline'; Codehighlighter1_118_443_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;params)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_118_443_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_118_443_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(</span><span style="color: #000000">"</span><span style="color: #000000">select&nbsp;sql:[</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;sql&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">]</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryRunner&nbsp;qr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QueryRunner();<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomBeanProcessor&nbsp;convert&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CustomBeanProcessor();<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RowProcessor&nbsp;rp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BasicRowProcessor(convert);<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSetHandler</span><span style="color: #000000">&lt;</span><span style="color: #000000">List</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;bh&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BeanListHandler</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">(type,&nbsp;rp);<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;list&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;qr.query(conn,&nbsp;sql,&nbsp;bh,&nbsp;params);<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;list;<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 至于为什么扩展这个方法就可以实现这个逻辑就得去跟源代码看它的内部实现，用了一些JavaBean的处理和反映的技巧来做的。具体就不说。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总结：commons组件都设计得非常好，可扩展性和实用性都非常高。虽然上面举例实现了转换逻辑的替换，但是仍然需要开发人员在设计数据库的时候和写JavaBean时都要严格做好规范，避免产生不必要的问题。这方面Ruby On Rails就直接内部实现，动态语言的优点特别能体现，同时强制你在设计时必须用这种方式，典型的约定优于配置原则。当然，在dbutils里你愿意二种字段名都一样也无可厚非。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缺点：BeanProcessor是不支持关联查询的，所以上面的方式也只能局限于单表的转换，这点就不如myBatis和Hibernate，当然用这二个就引入了一些复杂性，如何权衡需要自己衡量，哪个用得好都一样。本人就不喜欢myBatis那种把SQL写到XML中的方式，见过太复杂的SQL最终在XML里面变得面目全非，如果是接手别人的代码，是很痛苦的，而且你无法避免只修改XML而不改Java，既然二者都要改，那直接写Java里又有什么区别？简单就是美。格式和注释写好一点同样很容易理解！ 
<img src ="http://www.blogjava.net/nighty/aggbug/349050.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nighty/" target="_blank">寒武纪</a> 2011-04-26 16:41 <a href="http://www.blogjava.net/nighty/archive/2011/04/26/349050.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于commons dbutils组件的一个小缺陷分析</title><link>http://www.blogjava.net/nighty/archive/2011/02/12/344155.html</link><dc:creator>寒武纪</dc:creator><author>寒武纪</author><pubDate>Sat, 12 Feb 2011 09:33:00 GMT</pubDate><guid>http://www.blogjava.net/nighty/archive/2011/02/12/344155.html</guid><wfw:comment>http://www.blogjava.net/nighty/comments/344155.html</wfw:comment><comments>http://www.blogjava.net/nighty/archive/2011/02/12/344155.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/nighty/comments/commentRss/344155.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nighty/services/trackbacks/344155.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 非常喜欢这种轻量级的JDBC封装，比起Hibernate和iBatis，可以非常自由和灵活地运用和自行二次封装，由于dbutils的BeanHandler转换方式采取了反射技术，在性能上肯定有所损失，所以项目中基本上都使用MapHandler方式来转换数据，当然就是自己写的代码多一点，也无所谓。一般的查询、子查询、联合查询、包括视图查询等等都很正常，但是发现一个比较小的问题，就是在使用聚合函数的场所，例如：select user_type, count(*) as count from `user` group by user_type这种类型查询的时候，MapHandler方式不起作用，as列都变成key为空串的K-V对，导致有许多地方使用map.get("")代码的情况出现，这种写法当然是不太好的，容易出问题。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 鉴于前面没有时间了解，就都粗略使用了上面那种粗暴的map.get("")来处理，最好的情况是让dbutils组件能自动识别到as类型的列名。于是有空了就专门看了看它的源代码，发现最主要的一段代码如下：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_67_374_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_374_Open_Text.style.display='none'; Codehighlighter1_67_374_Closed_Image.style.display='inline'; Codehighlighter1_67_374_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_67_374_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_67_374_Closed_Text.style.display='none'; Codehighlighter1_67_374_Open_Image.style.display='inline'; Codehighlighter1_67_374_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;Object</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;toMap(ResultSet&nbsp;rs)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;SQLException&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_67_374_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_67_374_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;Object</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CaseInsensitiveHashMap();<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSetMetaData&nbsp;rsmd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rs.getMetaData();<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;cols&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rsmd.getColumnCount();<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img id="Codehighlighter1_270_344_Open_Image" onclick="this.style.display='none'; Codehighlighter1_270_344_Open_Text.style.display='none'; Codehighlighter1_270_344_Closed_Image.style.display='inline'; Codehighlighter1_270_344_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_270_344_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_270_344_Closed_Text.style.display='none'; Codehighlighter1_270_344_Open_Image.style.display='inline'; Codehighlighter1_270_344_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;cols;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_270_344_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_270_344_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.put(rsmd.getColumnName(i),&nbsp;rs.getObject(i));<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;result;<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CaseInsensitiveHashMap是dbutils自定义的一个Map，忽略键大小写的K-V字典，但是key使用的是ResultSetMetaData.getColumnName()，我想问题大概出在这里，于是认真翻了翻java的api文档（开发做久了容易遗忘基础），果然，原来<strong>getColumnName()</strong>是：<span style="color: #ff0000">获取指定列的名称；</span>而as关键字之后，使列名称变成用于显示的意义，这个时候应该使用<strong>getColumnLabel</strong>()：<span style="color: #339966">获取用于打印输出和显示的指定列的建议标题。建议标题通常由 SQL <code>AS</code> 子句来指定。如果未指定 SQL <code>AS</code>，则从 <code>getColumnLabel</code> 返回的值将和 <code>getColumnName</code> 方法返回的值相同</span>。自己手动试验了一下，果然如所料，问题就出在这里。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所以呢，如果想要dbutils在自动转换Map及MapList时能识别聚合函数的列名，那么最好的做法就是重载这种方式，懒一点的，你就干脆修改上面那段代码，让它判断是否使用了as关键字。个人暂时搞不清楚官方为什么没有考虑这一步，有时间再思考一下！
<img src ="http://www.blogjava.net/nighty/aggbug/344155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nighty/" target="_blank">寒武纪</a> 2011-02-12 17:33 <a href="http://www.blogjava.net/nighty/archive/2011/02/12/344155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>将Apache Roller部署到MyEclipse上面</title><link>http://www.blogjava.net/nighty/archive/2009/11/22/303255.html</link><dc:creator>寒武纪</dc:creator><author>寒武纪</author><pubDate>Sun, 22 Nov 2009 13:04:00 GMT</pubDate><guid>http://www.blogjava.net/nighty/archive/2009/11/22/303255.html</guid><wfw:comment>http://www.blogjava.net/nighty/comments/303255.html</wfw:comment><comments>http://www.blogjava.net/nighty/archive/2009/11/22/303255.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/nighty/comments/commentRss/303255.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nighty/services/trackbacks/303255.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 都说roller在国外是二次开发博客系统的首选，但是下载源代码之后发现是它是基于netbeans项目结构开发的。平时用习惯了Eclipse，所以想搬到MyEclipse上面，但没有想到居然那么不容易，折腾了整整一天，才最终跑起来。网上的参考信息太少，大概都是那二三篇的转贴，全部结合起来就差不多可以解决，借此总结一下，希望用到的朋友有参考作用！&nbsp;&nbsp;<a href='http://www.blogjava.net/nighty/archive/2009/11/22/303255.html'>阅读全文</a><img src ="http://www.blogjava.net/nighty/aggbug/303255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nighty/" target="_blank">寒武纪</a> 2009-11-22 21:04 <a href="http://www.blogjava.net/nighty/archive/2009/11/22/303255.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>httpClient3.1中文参数GET请求的解决方法</title><link>http://www.blogjava.net/nighty/archive/2008/07/16/215143.html</link><dc:creator>寒武纪</dc:creator><author>寒武纪</author><pubDate>Wed, 16 Jul 2008 02:31:00 GMT</pubDate><guid>http://www.blogjava.net/nighty/archive/2008/07/16/215143.html</guid><wfw:comment>http://www.blogjava.net/nighty/comments/215143.html</wfw:comment><comments>http://www.blogjava.net/nighty/archive/2008/07/16/215143.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/nighty/comments/commentRss/215143.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nighty/services/trackbacks/215143.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 最近一个程序出了点问题，对于中文参数的GET请求，服务器无法解析出正确的参数。刚好服务器的那端是另一个项目组负责，是异构系统，当初测试的时候也是走流程化，涉及到很多工作上的协调就比较麻烦，测试也不充分，像赶鸭子上架一样就上线了，催说是项目紧急。当然这是话外，不多废话。<br />
&nbsp;&nbsp;&nbsp; httpClient的GetMethod类加入参数的方法是如下：
<table cellspacing="0" cellpadding="3" width="100%" summary="" border="1">
    <tbody>
        <tr class="TableRowColor" bgcolor="white">
            <td valign="top" align="right" width="1%">void</td>
            <td><code><strong><a href="mk:@MSITStore:D:\开源项目\Jakarta\httpclient\commons-httpclient-3.1\apidocs.chm::/org/apache/commons/httpclient/HttpMethodBase.html#setQueryString(org.apache.commons.httpclient.NameValuePair[])">setQueryString</a></strong>(<a title="class in org.apache.commons.httpclient" href="mk:@MSITStore:D:\开源项目\Jakarta\httpclient\commons-httpclient-3.1\apidocs.chm::/org/apache/commons/httpclient/NameValuePair.html">NameValuePair</a>[]&nbsp;params)</code> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sets the query string of this HTTP method.</td>
        </tr>
        <tr class="TableRowColor" bgcolor="white">
            <td valign="top" align="right" width="1%"><font size="-1"><code>&nbsp;void</code></font></td>
            <td><code><strong><a href="mk:@MSITStore:D:\开源项目\Jakarta\httpclient\commons-httpclient-3.1\apidocs.chm::/org/apache/commons/httpclient/HttpMethodBase.html#setQueryString(java.lang.String)">setQueryString</a></strong>(<a title="class or interface in java.lang" href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html">String</a>&nbsp;queryString)</code> <br />
            </td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp; 跟踪一下httpClient的GetMethod的源代码，继承自HttpMethodBase，源码如下：<br />
&nbsp;&nbsp;
<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 id="Codehighlighter1_47_84_Open_Image" onclick="this.style.display='none'; Codehighlighter1_47_84_Open_Text.style.display='none'; Codehighlighter1_47_84_Closed_Image.style.display='inline'; Codehighlighter1_47_84_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_47_84_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_47_84_Closed_Text.style.display='none'; Codehighlighter1_47_84_Open_Image.style.display='inline'; Codehighlighter1_47_84_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setQueryString(String&nbsp;queryString)&nbsp;</span><span id="Codehighlighter1_47_84_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"  alt="" /></span><span id="Codehighlighter1_47_84_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.queryString&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;queryString;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_142_276_Open_Image" onclick="this.style.display='none'; Codehighlighter1_142_276_Open_Text.style.display='none'; Codehighlighter1_142_276_Closed_Image.style.display='inline'; Codehighlighter1_142_276_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_142_276_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_142_276_Closed_Text.style.display='none'; Codehighlighter1_142_276_Open_Image.style.display='inline'; Codehighlighter1_142_276_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setQueryString(NameValuePair[]&nbsp;params)&nbsp;</span><span id="Codehighlighter1_142_276_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"  alt="" /></span><span id="Codehighlighter1_142_276_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;LOG.trace(</span><span style="color: #000000">"</span><span style="color: #000000">enter&nbsp;HttpMethodBase.setQueryString(NameValuePair[])</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;queryString&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;EncodingUtil.formUrlEncode(params,&nbsp;</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/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
&nbsp;&nbsp; EncodingUtil是httpClient定义的一个编码工具类，由于默认设置的是UTF-8，所以对于一些系统可能就无法识别。可以在外部这样更改：<br />
method.setQueryString(EncodingUtil.formUrlEncode(pair, "GB2312"));另外，<span style="color: red">注意请求头也要修改为对应的一致编码方式</span>，method.addRequestHeader("Content-type" , "text/html; charset=GB2312");如果这二个编码不一致，就会引起乱码。<br />
&nbsp;&nbsp; 刚开始的时候尝试过都使用一致的UTF-8，但是发现还是乱码，这应该是服务器的原因。IE默认的就是采用操作系统Windows的中文编码去进行Encoder的，服务器原先基本上都为IE服务的，所以改为GB2312就能正常识别得到。<br />
&nbsp;&nbsp; 另外，上面提到的EncodingUtil这个工具是从apache的另一个组件codec包装而来的，而非SUN的URLEncoder。有兴趣的可以研读一下源代码。
<img src ="http://www.blogjava.net/nighty/aggbug/215143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nighty/" target="_blank">寒武纪</a> 2008-07-16 10:31 <a href="http://www.blogjava.net/nighty/archive/2008/07/16/215143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>httpclient3.1使用小结</title><link>http://www.blogjava.net/nighty/archive/2008/06/11/207121.html</link><dc:creator>寒武纪</dc:creator><author>寒武纪</author><pubDate>Wed, 11 Jun 2008 07:18:00 GMT</pubDate><guid>http://www.blogjava.net/nighty/archive/2008/06/11/207121.html</guid><wfw:comment>http://www.blogjava.net/nighty/comments/207121.html</wfw:comment><comments>http://www.blogjava.net/nighty/archive/2008/06/11/207121.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/nighty/comments/commentRss/207121.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nighty/services/trackbacks/207121.html</trackback:ping><description><![CDATA[<p>Jakarta的httpclient3.1是最新版本，项目中需要用程序模拟浏览器的GET和POST动作。在使用过程中遇到不少问题。<br />
1. 带附件的POST提交<br />
&nbsp;&nbsp;&nbsp; 最开始都是使用MultipartPostMethod这个类，现在已经废弃这个类了。API说明：<strong>Deprecated.</strong>&nbsp;<em>Use <a title="class in org.apache.commons.httpclient.methods.multipart" href="mk:@MSITStore:D:\开源项目\Jakarta\httpclient\commons-httpclient-3.1\apidocs.chm::/org/apache/commons/httpclient/methods/multipart/MultipartRequestEntity.html"><code>MultipartRequestEntity</code></a> in conjunction with <a title="class in org.apache.commons.httpclient.methods" href="mk:@MSITStore:D:\开源项目\Jakarta\httpclient\commons-httpclient-3.1\apidocs.chm::/org/apache/commons/httpclient/methods/PostMethod.html"><code>PostMethod</code></a> instead.</em>&nbsp;&nbsp; 使用PostMethod可以实现的功能，就没有必要再弄一个MultipartPostMethod了。下面是一段最简单的示例：</p>
<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"  alt="" /><span style="color: #000000">PostMethod&nbsp;post&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PostMethod();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NameValuePair[]&nbsp;pairs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;NameValuePair[</span><span style="color: #000000">2</span><span style="color: #000000">];<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pairs[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;NameValuePair(</span><span style="color: #000000">"</span><span style="color: #000000">para1</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">value1</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pairs[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;NameValuePair(</span><span style="color: #000000">"</span><span style="color: #000000">para2</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">value2</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post.setRequestBody(pairs);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpClient&nbsp;client&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HttpClient();<br />
<img id="Codehighlighter1_262_297_Open_Image" onclick="this.style.display='none'; Codehighlighter1_262_297_Open_Text.style.display='none'; Codehighlighter1_262_297_Closed_Image.style.display='inline'; Codehighlighter1_262_297_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_262_297_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_262_297_Closed_Text.style.display='none'; Codehighlighter1_262_297_Open_Image.style.display='inline'; Codehighlighter1_262_297_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_262_297_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"  alt="" /></span><span id="Codehighlighter1_262_297_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.executeMethod(post);<br />
<img id="Codehighlighter1_323_351_Open_Image" onclick="this.style.display='none'; Codehighlighter1_323_351_Open_Text.style.display='none'; Codehighlighter1_323_351_Closed_Image.style.display='inline'; Codehighlighter1_323_351_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_323_351_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_323_351_Closed_Text.style.display='none'; Codehighlighter1_323_351_Open_Image.style.display='inline'; Codehighlighter1_323_351_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(HttpException&nbsp;e)&nbsp;</span><span id="Codehighlighter1_323_351_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"  alt="" /></span><span id="Codehighlighter1_323_351_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
<img id="Codehighlighter1_375_403_Open_Image" onclick="this.style.display='none'; Codehighlighter1_375_403_Open_Text.style.display='none'; Codehighlighter1_375_403_Closed_Image.style.display='inline'; Codehighlighter1_375_403_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_375_403_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_375_403_Closed_Text.style.display='none'; Codehighlighter1_375_403_Open_Image.style.display='inline'; Codehighlighter1_375_403_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(IOException&nbsp;e)&nbsp;</span><span id="Codehighlighter1_375_403_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"  alt="" /></span><span id="Codehighlighter1_375_403_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
&nbsp;&nbsp; 这是针对一般的form形式的提交，而且这个form里面不带附件的。如果带附件，那么这种方法就不起作用，附件上传的参数和普通参数无法一同在服务器获取到。<font size="-1">org.apache.commons.httpclient.methods.multipart </font>这个包就是为处理文件上传这种多形式参数的情况的。最主要的类是Part（代表一种post object），它有二个比较重要的子类：FilePart和StringPart，一个是文件的参数，另一个就是普通的文本参数。它的典型使用方法如下：<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"  alt="" /><span style="color: #000000">String&nbsp;url&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">http://localhost:8080/HttpTest/Test</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostMethod&nbsp;postMethod&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PostMethod(url);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringPart&nbsp;sp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringPart(</span><span style="color: #000000">"</span><span style="color: #000000">TEXT</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">testValue</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FilePart&nbsp;fp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FilePart(</span><span style="color: #000000">"</span><span style="color: #000000">file</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">test.txt</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(</span><span style="color: #000000">"</span><span style="color: #000000">./temp/test.txt</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_348_355_Open_Image" onclick="this.style.display='none'; Codehighlighter1_348_355_Open_Text.style.display='none'; Codehighlighter1_348_355_Closed_Image.style.display='inline'; Codehighlighter1_348_355_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_348_355_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_348_355_Closed_Text.style.display='none'; Codehighlighter1_348_355_Open_Image.style.display='inline'; Codehighlighter1_348_355_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MultipartRequestEntity&nbsp;mrp</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MultipartRequestEntity(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Part[]</span><span id="Codehighlighter1_348_355_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"  alt="" /></span><span id="Codehighlighter1_348_355_Open_Text"><span style="color: #000000">{sp,&nbsp;fp}</span></span><span style="color: #000000">,&nbsp;postMethod<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getParams());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;postMethod.setRequestEntity(mrp);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">执行postMethod</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpClient&nbsp;httpClient&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HttpClient();<br />
<img id="Codehighlighter1_530_575_Open_Image" onclick="this.style.display='none'; Codehighlighter1_530_575_Open_Text.style.display='none'; Codehighlighter1_530_575_Closed_Image.style.display='inline'; Codehighlighter1_530_575_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_530_575_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_530_575_Closed_Text.style.display='none'; Codehighlighter1_530_575_Open_Image.style.display='inline'; Codehighlighter1_530_575_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_530_575_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"  alt="" /></span><span id="Codehighlighter1_530_575_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpClient.executeMethod(postMethod);<br />
<img id="Codehighlighter1_601_629_Open_Image" onclick="this.style.display='none'; Codehighlighter1_601_629_Open_Text.style.display='none'; Codehighlighter1_601_629_Closed_Image.style.display='inline'; Codehighlighter1_601_629_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_601_629_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_601_629_Closed_Text.style.display='none'; Codehighlighter1_601_629_Open_Image.style.display='inline'; Codehighlighter1_601_629_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(HttpException&nbsp;e)&nbsp;</span><span id="Codehighlighter1_601_629_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"  alt="" /></span><span id="Codehighlighter1_601_629_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
<img id="Codehighlighter1_653_681_Open_Image" onclick="this.style.display='none'; Codehighlighter1_653_681_Open_Text.style.display='none'; Codehighlighter1_653_681_Closed_Image.style.display='inline'; Codehighlighter1_653_681_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_653_681_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_653_681_Closed_Text.style.display='none'; Codehighlighter1_653_681_Open_Image.style.display='inline'; Codehighlighter1_653_681_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(IOException&nbsp;e)&nbsp;</span><span id="Codehighlighter1_653_681_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"  alt="" /></span><span id="Codehighlighter1_653_681_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
&nbsp;&nbsp;&nbsp; 在第二行PostMethod postMethod = new PostMethod();后面，有人说需要使用postMehtod.setRequestHeader("Content-type", "multipart/form-data"); Content-type的请求类型进行更改。但是我在使用过程没有加上这一句，查了一下httpCleint的默认Content-type是application/octet-stream。应该是没有影响的。对于MIME类型的请求，httpclient建议全用MulitPartRequestEntity进行包装，就是上面的用法。<br />
<br />
2.&nbsp; 参数中文的处理问题<br />
&nbsp;&nbsp;&nbsp; httpclient的默认编码都是ISO-8859-1，那肯定就无法支持中文参数了。引用一下这篇文章：<a href="http://thinkbase.net/w/main/Wiki?HttpClient+POST+%E7%9A%84+UTF-8+%E7%BC%96%E7%A0%81%E9%97%AE%E9%A2%98">http://thinkbase.net/w/main/Wiki?HttpClient+POST+%E7%9A%84+UTF-8+%E7%BC%96%E7%A0%81%E9%97%AE%E9%A2%98</a> ，按照作者的说法，就可以正常解决中文编码的问题。其中最关键的是修改EncodingUtil这个类的一个方法实现。另外，FilePart和StringPart的构造方法都有一个带编码指定的参数，为了减少问题的出现，建议所有的都带上统一的编码，包括postMethod.getParams()。示例如下：<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"  alt="" /><span style="color: #000000">String&nbsp;url&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">http://localhost:8080/HttpTest/Test</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostMethod&nbsp;postMethod&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PostMethod(url);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringPart&nbsp;sp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringPart(</span><span style="color: #000000">"</span><span style="color: #000000">TEXT</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">testValue</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">GB2312</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FilePart&nbsp;fp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FilePart(</span><span style="color: #000000">"</span><span style="color: #000000">file</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">test.txt</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(</span><span style="color: #000000">"</span><span style="color: #000000">./temp/test.txt</span><span style="color: #000000">"</span><span style="color: #000000">),&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">GB2312</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;postMethod.getParams().setContentCharset(</span><span style="color: #000000">"</span><span style="color: #000000">GB2312</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img id="Codehighlighter1_435_442_Open_Image" onclick="this.style.display='none'; Codehighlighter1_435_442_Open_Text.style.display='none'; Codehighlighter1_435_442_Closed_Image.style.display='inline'; Codehighlighter1_435_442_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_435_442_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_435_442_Closed_Text.style.display='none'; Codehighlighter1_435_442_Open_Image.style.display='inline'; Codehighlighter1_435_442_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MultipartRequestEntity&nbsp;mrp</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MultipartRequestEntity(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Part[]</span><span id="Codehighlighter1_435_442_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"  alt="" /></span><span id="Codehighlighter1_435_442_Open_Text"><span style="color: #000000">{sp,&nbsp;fp}</span></span><span style="color: #000000">,&nbsp;postMethod<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getParams());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;postMethod.setRequestEntity(mrp);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">执行postMethod</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpClient&nbsp;httpClient&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HttpClient();<br />
<img id="Codehighlighter1_617_662_Open_Image" onclick="this.style.display='none'; Codehighlighter1_617_662_Open_Text.style.display='none'; Codehighlighter1_617_662_Closed_Image.style.display='inline'; Codehighlighter1_617_662_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_617_662_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_617_662_Closed_Text.style.display='none'; Codehighlighter1_617_662_Open_Image.style.display='inline'; Codehighlighter1_617_662_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_617_662_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"  alt="" /></span><span id="Codehighlighter1_617_662_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpClient.executeMethod(postMethod);<br />
<img id="Codehighlighter1_688_716_Open_Image" onclick="this.style.display='none'; Codehighlighter1_688_716_Open_Text.style.display='none'; Codehighlighter1_688_716_Closed_Image.style.display='inline'; Codehighlighter1_688_716_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_688_716_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_688_716_Closed_Text.style.display='none'; Codehighlighter1_688_716_Open_Image.style.display='inline'; Codehighlighter1_688_716_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(HttpException&nbsp;e)&nbsp;</span><span id="Codehighlighter1_688_716_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"  alt="" /></span><span id="Codehighlighter1_688_716_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
<img id="Codehighlighter1_740_768_Open_Image" onclick="this.style.display='none'; Codehighlighter1_740_768_Open_Text.style.display='none'; Codehighlighter1_740_768_Closed_Image.style.display='inline'; Codehighlighter1_740_768_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_740_768_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_740_768_Closed_Text.style.display='none'; Codehighlighter1_740_768_Open_Image.style.display='inline'; Codehighlighter1_740_768_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(IOException&nbsp;e)&nbsp;</span><span id="Codehighlighter1_740_768_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"  alt="" /></span><span id="Codehighlighter1_740_768_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
<img src ="http://www.blogjava.net/nighty/aggbug/207121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nighty/" target="_blank">寒武纪</a> 2008-06-11 15:18 <a href="http://www.blogjava.net/nighty/archive/2008/06/11/207121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Java命令行交互方式</title><link>http://www.blogjava.net/nighty/archive/2008/05/23/202314.html</link><dc:creator>寒武纪</dc:creator><author>寒武纪</author><pubDate>Fri, 23 May 2008 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/nighty/archive/2008/05/23/202314.html</guid><wfw:comment>http://www.blogjava.net/nighty/comments/202314.html</wfw:comment><comments>http://www.blogjava.net/nighty/archive/2008/05/23/202314.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/nighty/comments/commentRss/202314.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nighty/services/trackbacks/202314.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 普通的程序交互方式有命令行和GUI形式。对于GUI样式，交互的设计可以多种多样，但是Java做命令行交互，似乎存在着一些不足。<br />
&nbsp;&nbsp; 命令行交互是传统的交互方式，如果程序有时候需要在Unix或是Linux等系统上运动时，以这种方式出现的可能性就比较大。命令行包括<br />
&nbsp;&nbsp; 输入和回显问题，一般是以行结束，或是以某个结束符为终命令终止标识。System.out 和System.err就用于标准的输出和错误输出，System.in用于标准的输入接受，一般情况下都是指键盘。<br />
&nbsp;&nbsp; 如果接受参数输入，一般的程序结构如下：<br />
&nbsp;&nbsp;
<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"  alt="" /><span style="color: #000000">BufferedReader&nbsp;in&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BufferedReader(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;InputStreamReader(System.in));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">==Please&nbsp;input&nbsp;password==：</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />String&nbsp;pass&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;in.readLine();</span></div>
&nbsp;&nbsp; 输入的时候显示屏自动进行输入回显。这个时候如果遇到输入密码等敏感数据的时候，就无法用*或是#这样的符号进行回显屏蔽，容易暴露安全问题。<br />
&nbsp;&nbsp; 解决的可能想法：<br />
&nbsp;&nbsp; 1.&nbsp; 通过监听键盘事件，对输入的回显进行截获取，把回显进行屏蔽，但是监听器如何知道何时是输入密码，何时是输入普通数据？比较难以控制，而且这种监听应该是线程化的，可能会存在一些意想不到的问题。<br />
&nbsp;&nbsp; 2.&nbsp; 如果用纯Java难以实现，那么是否可以使用其它语言的功能进行补充，比如JNI，或是Windows下面的Dos脚本，Linux平台的Shell脚本来进行补充。不过这样就不太平台无关了。<br />
&nbsp;&nbsp; 3.&nbsp; 可能sun发现了这个不足之处，从1.6版本开始，增加了一个java.io.Console类，代表与当前 Java 虚拟机关联的基于字符的控制台设备，这个Console是对原来System.in这种不足的补充，提供了像<code><strong><a href="mk:@MSITStore:D:\jdk6.ZH_cn.chm::/j2se6/api/java/io/Console.html#readPassword()">readPassword</a></strong>()</code>等这样的实用方法，具体请参考API文档，就是专门用于对敏感信息的读取。但是这是基于Java1.6的，如果有些场景受限制，不能使用1.6，那么还是无法解决上面的问题。后来查阅了一下Console类的实现方式，想直接把它的实现方式移植到1.4.xx上是比较难的，因为用到了一些高版本的新特性。使用Console要注意的是：虚拟机是否具有控制台取决于底层平台，还取决于调用虚拟机的方式。如果虚拟机从一个交互式命令行开始启动，且没有重定向标准输入和输出流，那么其控制台将存在，并且通常连接到键盘并从虚拟机启动的地方显示。如果虚拟机是自动启动的（例如，由后台作业调度程序启动），那么它通常没有控制台。如果你在Eclipse里面启动程序调用Console，那么通常是没有控制台，还是得从外部的命令行方式才能调用得到。<br />
&nbsp;&nbsp; 总体想一下，感觉应该还是从第2点出发，牺牲掉一点通用性，这样才能满足这种功能需求。
<img src ="http://www.blogjava.net/nighty/aggbug/202314.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nighty/" target="_blank">寒武纪</a> 2008-05-23 09:41 <a href="http://www.blogjava.net/nighty/archive/2008/05/23/202314.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>