﻿<?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-城市猎人-文章分类-java</title><link>http://www.blogjava.net/sailor/category/33060.html</link><description>在一网情深的日子里，谁能说得清是苦是甜，只知道确定了就义无反顾</description><language>zh-cn</language><lastBuildDate>Sun, 06 Sep 2009 08:01:18 GMT</lastBuildDate><pubDate>Sun, 06 Sep 2009 08:01:18 GMT</pubDate><ttl>60</ttl><item><title>利用OPI读取Excle文件</title><link>http://www.blogjava.net/sailor/articles/293588.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Wed, 02 Sep 2009 05:44:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/293588.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/293588.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/293588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/293588.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/293588.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1、读取文件&nbsp;/**&nbsp;*//**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;导入方法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;request&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;&nbsp;&nbsp;&nbsp...&nbsp;&nbsp;<a href='http://www.blogjava.net/sailor/articles/293588.html'>阅读全文</a><img src ="http://www.blogjava.net/sailor/aggbug/293588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2009-09-02 13:44 <a href="http://www.blogjava.net/sailor/articles/293588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR 的 Converter 实现原理简单分析及应用 </title><link>http://www.blogjava.net/sailor/articles/292464.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Mon, 24 Aug 2009 15:12:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/292464.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/292464.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/292464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/292464.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/292464.html</trackback:ping><description><![CDATA[<p>我们在应用 DWR 调用远程方法时涉及到 JS 与 JAVA 之间参数和返回值的数据转换，例如：<br />
<br />
JS 的 123 与 Java 的 int&nbsp; 或 Integer、long 间的转换<br />
JS 的 "2009-06-23" 与 Java 的 java.util.Date 之间的转换<br />
JS 的 "[1,2,3]" 与 Java 的 int[] 间的转换<br />
JS 的 "{id:123, name: 'Unmi'}" 与 Java 的 Class Person{int id; String name} 间的转换<br />
<br />
或者更复杂的嵌套类型( "{id:123, name: 'Unmi', blogs:['http://unmi.blogjava.net','http://blog.csdn.net/kypfos']}" ) 与 Java 类型间的转换，等等。那么这一切是怎么进行的呢？其实我们见识过很多组件的类型映射，如 Java 的 PropertyEditor、Hibernate(UserType)、iBatis(TypeHandler) 的类型映射，Struts1/2 中 Form/Model 用的 Converter 等。<br />
<br />
这里我来稍稍分析 DWR 的 Converter 实现，以及说明如何定制自己的 Converter。本文所用 DWR 是 2.0.5 版。<br />
<br />
<strong>1. DWR 内置的 Converter 及应用类型</strong><br />
<br />
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="black" cellpadding="5" width="700" align="center">
    <tbody>
        <tr>
            <td><strong>名称</strong></td>
            <td><strong>应用类型</strong></td>
            <td><strong>转换器</strong></td>
        </tr>
        <tr>
            <td>null</td>
            <td>void，java.lang.Void</td>
            <td>NullConverter</td>
        </tr>
        <tr>
            <td>enum</td>
            <td>&nbsp;</td>
            <td>EnumConverter</td>
        </tr>
        <tr>
            <td>primitive</td>
            <td>boolean,byte,short,int,long,float,double,char,<br />
            java.lang.Boolean,java.lang.Byte,java.lang.Short,<br />
            java.lang.Integer,java.lang.Long,java.lang.Float,<br />
            java.lang.Double,java.lang.Character</td>
            <td>PrimitiveConverter</td>
        </tr>
        <tr>
            <td>bignumber</td>
            <td>java.math.BigInteger,java.math.BigDecimal</td>
            <td>BigNumberConverter</td>
        </tr>
        <tr>
            <td>string</td>
            <td>java.lang.String</td>
            <td>StringConverter</td>
        </tr>
        <tr>
            <td>array</td>
            <td>[Z,[B,[S,[I,[J,[F,[D,[C,[L*</td>
            <td>ArrayConverter</td>
        </tr>
        <tr>
            <td>map</td>
            <td>java.util.Map</td>
            <td>MapConverter</td>
        </tr>
        <tr>
            <td>collection</td>
            <td>java.util.Collection</td>
            <td>CollectionConverter</td>
        </tr>
        <tr>
            <td>date</td>
            <td>java.util.Date,java.sql.Date,java.sql.Time,<br />
            java.sql.Timestamp,java.util.Calendar</td>
            <td>DateConverter</td>
        </tr>
        <tr>
            <td>dom</td>
            <td>org.w3c.dom.Node,org.w3c.dom.Element,org.w3c.dom.Document</td>
            <td>DOMConverter</td>
        </tr>
        <tr>
            <td>dom4j</td>
            <td>org.dom4j.Document,org.dom4j.Element,org.dom4j.Node</td>
            <td>DOM4JConverter</td>
        </tr>
        <tr>
            <td>jdom</td>
            <td>org.jdom.Document,org.jdom.Element</td>
            <td>JDOMConverter</td>
        </tr>
        <tr>
            <td>xom</td>
            <td>nu.xom.Document,nu.xom.Element,nu.xom.Node</td>
            <td>XOMConverter</td>
        </tr>
        <tr>
            <td>servlet</td>
            <td>javax.servlet.ServletConfig,javax.servlet.ServletContext,<br />
            javax.servlet.http.HttpServletRequest,<br />
            javax.servlet.http.HttpServletResponse,<br />
            javax.servlet.http.HttpSession</td>
            <td>ServletConverter</td>
        </tr>
        <tr>
            <td>bean</td>
            <td>&nbsp;</td>
            <td>BeanConverter</td>
        </tr>
        <tr>
            <td>object</td>
            <td>&nbsp;</td>
            <td>ObjectConverter</td>
        </tr>
        <tr>
            <td>hibernate2</td>
            <td>&nbsp;</td>
            <td>H2BeanConverter</td>
        </tr>
        <tr>
            <td>hibernate3</td>
            <td>&nbsp;</td>
            <td>H3BeanConverter</td>
        </tr>
        <tr>
            <td>url</td>
            <td>java.net.URL</td>
            <td>URLConverter</td>
        </tr>
        <tr>
            <td>exception</td>
            <td>&nbsp;</td>
            <td>ExceptionConverter</td>
        </tr>
        <tr>
            <td>miniException</td>
            <td>java.lang.Throwable</td>
            <td>MinimalistExceptionConverter</td>
        </tr>
    </tbody>
</table>
</p>
<p><br />
它们是应用启动的时候，通过 org.directwebremoting.servlet.DwrServlet&nbsp;初始化 dwr-2.0.5.jar!/org/directwebremoting/dwr.xml 文件加载进来的。例如：<br />
<br />
&lt;converter id="date" class="org.directwebremoting.convert.DateConverter"/&gt;　注册了 date 转换器<br />
&lt;convert converter="date" match="java.util.Date"/&gt;　应用注册的 date 转换器应用到 java.util.Date 类型<br />
<br />
看到上面，你也许会惊讶一下，我们平时可能也就用下 bean 转换器，其他用内置就行。然而 DWR 确为我们考虑的很周到的，包括 hibernate 相关的，URL、Servlet、Dom 等相关类型的转换器。<br />
<br />
<strong>2. DWR 如何确定用哪个 Converter?<br />
</strong><br />
DWR 是根据方法参数来确定入口参数的 Converter、根据返回值类型确定传向 JS 的出口参数的 Converter。总之是以 Java 方法原型为基准来决定每一参数或返回值各自用哪个 Converter 来转换数据。<br />
<br />
在 BaseCallMarshaller.marshallInbound(HttpServletRequest request, HttpServletResponse response) 方法中，使用<br />
<br />
Class paramType = method.getParameterTypes()[j] 来获得参数的类型，然后从已加载的 Converter Map 中找到 Converter 名称，进而确定 Converter 类名。</p>
<p>而确定返回值类型就不是直接用反射的 method.getReturnType()。而是以反射方式调用方法后，根据具体返回值的类型来确定的。见：<br />
<br />
Replay DefaultRemoter.execute(Call) 方法中的<br />
Object reply = chain.doFilter(object, method, call.getParameters());　再进入到<br />
Object ExecuteAjaxFilter.doFilter(Object obj, Method method, Object[] params Ajax FilterChain){<br />
&nbsp;&nbsp;&nbsp; &nbsp; return method.invoke(obj, params);<br />
}<br />
<br />
就是根据上面的返回值，然后在<br />
<br />
DefaultConverterManager.convertOutbound(Object, OutboundContext) 方法中的<br />
<br />
Converter converter = getConverter(object); 　//根据返回值 object&nbsp; 确定该用的 Converter。<br />
<br />
<strong>3. DWR Converter 的调用</strong><br />
<br />
多留意下 DWR 自带的 Converter，可以看到所有的 Converter 直接或简接的 extends BaseV20Converter implements Converter，其实 BaseV20Converter(DWR 1.x 中对应为 BaseV10Converter) 本身就实现了 Converter。在 BaseV20Converter 抽象类中默认实现了 Converter 的方法<br />
<br />
public void setConverterManager(ConverterManager config)&nbsp;&nbsp;{&nbsp; }<br />
<br />
具体的 Converter 只要专心去实现接口 Converter 中的另两个方法:<br />
<br />
Object convertInbound(Class paramType, InboundVariable data, InboundContext inctx) throws MarshallException;<br />
OutboundVariable convertOutbound(Object data, OutboundContext outctx) throws MarshallException;<br />
<br />
运行时，它们相应的被 ConvertManager(默认为 DefaultConvertManager) 的<br />
Object convertInbound(Class paramType, InboundVariable iv, InboundContext inctx, TypeHintContext incc) throws MarshallException<br />
OutboundVariable convertOutbound(Object object, OutboundContext outctx) throws MarshallException<br />
来调用。<br />
<br />
DWR 对每个参数或返回值至少会应用一次 Converter，但对于复杂的类型会递归的调用 Converter，比如，要完成<br />
<br />
JS "{id:123, name: 'Unmi', blogs:['http://unmi.blogjava.net','http://blog.csdn.net/kypfos']}"&nbsp; 到 Java 的 Person{int id, String name, String[] blogs;} 的转换，就会使用到 bean-&gt;primitive-&gt;array 三个 Converter。<br />
<br />
<strong>4. 定制自己的 Converter</strong><br />
<br />
基本上 DWR&nbsp; 内置的 Converter 就够用的，但也有可能需要定定自己的 Converter。从 DWR 的 Converter 实现来看，一般会用两种方式：<br />
<br />
1) extends BaseV20Converter implements Converter，实现 Converter 的 converterInbound() 和 converterOutbound() 方法<br />
2) extends BasicObjectConverter implements Converter，或继承 BeanConverter，实现 BasicObjectConverter 的 getPropertyMapFromObject()，getPropertyMapFromObject() 和 createTypeHintContext() 方法。<br />
<br />
前一种方式，请参照 org.directwebremoting.convert.DateConverter 的源码实现：<br />
<br />
convertInbound() 由 JS 的字符串转换成要求的 Date、Time、Timestamp 或 Calender 对像。<br />
convertOubound() 把 Java 的类型转换成 JS 的 new Date() 类型，注意返回值的写法：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new SimpleOutboundVariable("new Date(" + millis + ")", outctx, true);</p>
<p>第二种继承 BasicObjectConverter 或是 BeanConverter 的做法，可参考 BeanConverter&nbsp; 的源码实现。表现在 JSON 和 Java 对象间的转换，要是引入解析 JSON 的 JAR 包或许能有不少帮助。<br />
<br />
定制 Converter 的内容讲的很少，主要是真有这方面的需要的时候请参考 DWR&nbsp;&nbsp;的相关源码，实际中理解各个接口方法参数的意义，及返回值的要求。对待开源组件还是要保持阅读源码的好习惯。<br />
<br />
好啦，自己的 Converter 写好，需要注册，需要应用。我们还是参考 DWR 的做法，写在自己的 dwr.xml 中。例如定制了 com.unmi.dwr.converter.SpecialConverter，要对 com.unmi.model.SpecialObject 进行出入类型的转换，就这么写：<br />
<br />
&lt;converter id="special" class="com.unmi.dwr.converter.SpecialConverter"/&gt;　注册了&nbsp;special 转换器<br />
&lt;convert converter="special" match="com.unmi.model.SpecialObject"/&gt;　应用注册的 special 转换器应用到 com.unmi.model.SpecialObject &nbsp;类型<br />
<br />
<strong>5. 小结</strong><br />
<br />
用 DWR&nbsp;其实也有段时日了，未曾系统的学，总是遇一问题、扫除一个，不免也会去找找相关更系统的资料。然而着下此篇的动机是上周六在书城翻了下 《 DWR 实战》，它实际讲 DWR 本身的较少。最后我第一个想了解了是 DWR 能完成 JS 与 Java 间什么类型的转换，第一手的资料网上也没搜索到，于是进到源码中去，亲身历练，也更加深了印象。<br />
<br />
读者也许和我一样目的，只想看看内置的转换器有哪些，能转换哪些类型，那就只需看最为抢眼的那张表格吧。需要定制 Converter 应该很少，就像我们很少定制 Struts 的 Converter、Hibernate 的 UserType 和 iBatis 的 TypeHandler 一样。因此也就对定制 DWR 的 Converter 所用篇幅不多。<br />
<br />
对待开源，自己总有个习惯就是必须有相关的源代码伴随在它身边。开源组件的使用一般不难，碰到问题，既然源码都掌握了，我想总能从源码中找出原因来。尚且，对这样的知名组件越发深入，就更能嚼出许多味多。<br />
<br />
<br />
参考：DWR 2.0.5 的源代码，对 DWR 项目进行单步调试</p>
<p><br />
原文：<a href="http://www.blogjava.net/Unmi/archive/2009/06/23/283741.html">http://www.blogjava.net/Unmi/archive/2009/06/23/283741.html</a></p>
 <img src ="http://www.blogjava.net/sailor/aggbug/292464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2009-08-24 23:12 <a href="http://www.blogjava.net/sailor/articles/292464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>参考资料</title><link>http://www.blogjava.net/sailor/articles/292399.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Mon, 24 Aug 2009 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/292399.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/292399.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/292399.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/292399.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/292399.html</trackback:ping><description><![CDATA[1、J2EE介绍<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j2ee/"><font color="#000000">参考文件：</font>http://www.ibm.com/developerworks/cn/java/j2ee/</a> <br />
<br />
2、Cache技术――OSCache<br />
&nbsp;&nbsp;&nbsp;
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt; font-family: Arial">Cache</span><span style="font-size: 10pt; font-family: 宋体">是一种用于<span style="color: red">提高系统响应速度</span>、<span style="color: red">改善系统运行性能</span>的技术。尤其是在</span><span style="font-size: 10pt; font-family: Arial">Web</span><span style="font-size: 10pt; font-family: 宋体">应用中，通过缓存页面的输出结果，可以很显著的改善系统运行性能。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt; font-family: 宋体">OSCache标记库由OpenSymphony设计，它是一种开创性的缓存方案，它提供了在现有JSP页面之内实现内存缓存的功能。OSCache是个一个被广泛采用的高性能的J2EE缓存框架，OSCache还能应用于任何Java应用程序的普通的缓存解决方案。</span></p>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://aumy2008.blogbus.com/logs/36462858.html">参考文件：http://aumy2008.blogbus.com/logs/36462858.html</a>
<img src ="http://www.blogjava.net/sailor/aggbug/292399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2009-08-24 15:52 <a href="http://www.blogjava.net/sailor/articles/292399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet总结</title><link>http://www.blogjava.net/sailor/articles/287237.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Sat, 18 Jul 2009 03:57:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/287237.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/287237.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/287237.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/287237.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/287237.html</trackback:ping><description><![CDATA[&nbsp;
<p><strong>The Container initializes a servlet by loading the class, invoking the servlet&#8217;s no-arg constructor, and calling the servlet&#8217;s init() method.</strong></p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">1</span>&nbsp;The init() method (which the developer can override) is called only once in a servlet&#8217;s life, and always before the servlet can service any client requests.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">2</span>&nbsp;The init() method gives the servlet access to the Serv-letConf g and ServletContext objects, which the servlet needs to get information about the servlet conf guration and the web app.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">3</span>&nbsp;The Container ends a servlet&#8217;s life by calling its destroy() method.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">4</span>&nbsp;Most of a servlet&#8217;s life is spent running a service() method for a client request.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">5</span>&nbsp;Every request to a servlet runs in a separate thread! There is only one instance of any particular servlet class.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">6</span>&nbsp;Your servlet will almost always extend javax.servlet.http.HttpServlet, from which it inherits an implementation of the service() method that takes an HttpServletRequest and an HttpServletResponse.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">7</span>&nbsp;HttpServlet extends javax.servlet.GenericServlet—an abstract class that implements most of the basic servlet methods. </p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">8</span>&nbsp;GenericServlet implements the Servlet interface.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">9</span>&nbsp;Servlet classes (except those related to JSPs) are in one of two packages: javax.servlet or javax.servlet.http.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">10</span>&nbsp;You can override the init() method, and you must override at least one service method (doGet(), doPost(), etc.)</p>
<p><strong>The HttpServlet&#8217;s doGet() and doPost() methods take an HttpServletRequest and an HttpServletResponse.</strong></p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">1</span>&nbsp;The service() method determines whether doGet() or doPost() runs based on the HTTP Method (GET, POST, etc.) of the HTTP request.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">2</span>&nbsp;POST requests have a body; GET requests do not, although GET requests can&nbsp;have request parameters appended to the request URL (sometimes called &#8220;the query string&#8221;).</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">3</span>&nbsp;GET requests are inherently (according to the HTTP spec) idempotent. They should be able to run multiple times without causing any side effects on the server. GET requests shouldn&#8217;t change anything on the server. But you could write a bad, non-idempotent doGet() method.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">4</span>&nbsp;POST is inherently not idempotent, so it&#8217;s up to you to design and code your app in such a way that if the client sends a request twice by mistake, you can handle it.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">5</span>&nbsp;If an HTML form does not explicitly say &#8220;method=POST&#8221;, the request is sent as a GET, not a POST. If you do not have a doGet() in your servlet, the request will fail.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">6</span>&nbsp;You can get parameters from the request with the getParameter(&#8220;paramname&#8221;) method. The return value is always a String.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">7</span>&nbsp;If you have multiple parameter values for a given param-eter name, use the getParameterValues(&#8220;paramname&#8221;) method that returns a String array.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">8 </span>&nbsp;You can get other things from the request object including headers, cookies, a session, the query string, and an input stream<br />
<br />
Post与Get区别：<br />
1. Get用于从服务端获取数据，Post用于向服务器端提交数据；<br />
2. Get提交后，参数保留在浏览器地址栏，Post不会；<br />
3. Get提交时，URL会带参数，Post不会。因为URL是保存到http协议头部。而Post参数保存到http协议Body中<br />
4. Get容易产生重复提交，Post不会。<br />
<br />
&nbsp; </p>
<p><strong>You use the Response to send data back to the client.</strong></p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">1</span>&nbsp;The most common methods you&#8217;ll call on the response object (HttpServletResponse) are setContentType() and getWriter().</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">2</span>&nbsp;Be careful—many developers assume the method is getPrintWriter(), but it&#8217;s getWriter().</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">3</span>&nbsp;The getWriter() method lets you do character I/O to write HTML (or something else) to the stream.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">4</span>&nbsp;You can also use the response to set headers, send errors, and add cookies.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">5</span>&nbsp;In the real world, you&#8217;ll probably use a JSP to send most HTML responses, but you may still use a response stream to send binary data </p>
<p>(like a JAR f le, perhaps) to the client.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">6</span>&nbsp;The method you call on your response for getting a binary stream is getOutputStream().</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">7</span>&nbsp;The setContentType() method tells the browser how to handle the data coming in with the response. Typical content types are &#8220;text/html&#8221;, <span style="font-family: 宋体">&#8220;</span>application/pdf&#8221;, and &#8220;image/jpeg&#8221;.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">8</span>&nbsp;You don&#8217;t have to memorize content types (also known as MIME types).</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">9</span>&nbsp;You can set response headers using addHeader() or setHeader(). The difference depends on whether the header is already part of the response. If it is, setHeader() will replace the value, but addHeader will add an additional value to the existing response. If the header is not already part of the response, then setHeader() and addHeader() behave in exactly the same way.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">10</span>&nbsp;If you don&#8217;t want to respond to a request, you can redirect the request to a different URL. The browser takes care of sending the new request to the URL you provide. </p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">11</span>&nbsp;To redirect a request, call sendRedirect(aStringURL) on the response.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">12</span>&nbsp;You cannot call sendRedirect() after the response is committed! In other words, if you&#8217;ve already written something to the stream, it&#8217;s too late to do a redirect.</p>
<p><span style="font-family: 'Arial Unicode MS','sans-serif'">13</span>&nbsp;A request redirect is different from a request dispatch. A request dispatch (covered more in another chapter) happens on the server, while a redirect happens on the client. A request dispatch hands the request to another component on the server, usually within the same web app. A request redirect simply tells the browser to go a different URL</p>
<img src ="http://www.blogjava.net/sailor/aggbug/287237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2009-07-18 11:57 <a href="http://www.blogjava.net/sailor/articles/287237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BeanUtils日期转换</title><link>http://www.blogjava.net/sailor/articles/261673.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Tue, 24 Mar 2009 04:26:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/261673.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/261673.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/261673.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/261673.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/261673.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 经过一天测试，终于实现了BeanUtils从String类型到Timestamp成功转换。底层是如何实现的，还没彻底了解，先将解决方案记录下来，以后再去看底层如何实现。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、写一个日期转换器，这个转换器实现了Converter接口<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_46_953_Open_Image" onclick="this.style.display='none'; Codehighlighter1_46_953_Open_Text.style.display='none'; Codehighlighter1_46_953_Closed_Image.style.display='inline'; Codehighlighter1_46_953_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_46_953_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_46_953_Closed_Text.style.display='none'; Codehighlighter1_46_953_Open_Image.style.display='inline'; Codehighlighter1_46_953_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;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;DateConvert&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Converter&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_46_953_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_46_953_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;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Logger&nbsp;log&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Logger.getLogger(DateConvert.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<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;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;SimpleDateFormat&nbsp;df&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleDateFormat(</span><span style="color: #000000">"</span><span style="color: #000000">yyyy-MM-dd</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;HH:mm:ss</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;datePattern&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">yyyy-MM-dd</span><span style="color: #000000">"</span><span style="color: #000000">;<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_255_264_Open_Image" onclick="this.style.display='none'; Codehighlighter1_255_264_Open_Text.style.display='none'; Codehighlighter1_255_264_Closed_Image.style.display='inline'; Codehighlighter1_255_264_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_255_264_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_255_264_Closed_Text.style.display='none'; Codehighlighter1_255_264_Open_Image.style.display='inline'; Codehighlighter1_255_264_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">public</span><span style="color: #000000">&nbsp;DateConvert()&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_255_264_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_255_264_Open_Text"><span style="color: #000000">{&nbsp;<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;<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">&nbsp;<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="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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">public</span><span style="color: #000000">&nbsp;DateConvert(String&nbsp;datePattern)<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img id="Codehighlighter1_313_352_Open_Image" onclick="this.style.display='none'; Codehighlighter1_313_352_Open_Text.style.display='none'; Codehighlighter1_313_352_Closed_Image.style.display='inline'; Codehighlighter1_313_352_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_313_352_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_313_352_Closed_Text.style.display='none'; Codehighlighter1_313_352_Open_Image.style.display='inline'; Codehighlighter1_313_352_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="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_313_352_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_313_352_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">12</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;</span><span style="color: #0000ff">this</span><span style="color: #000000">.datePattern&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;datePattern;<br />
</span><span style="color: #008080">13</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">14</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img id="Codehighlighter1_358_407_Open_Image" onclick="this.style.display='none'; Codehighlighter1_358_407_Open_Text.style.display='none'; Codehighlighter1_358_407_Closed_Image.style.display='inline'; Codehighlighter1_358_407_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_358_407_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_358_407_Closed_Text.style.display='none'; Codehighlighter1_358_407_Open_Image.style.display='inline'; Codehighlighter1_358_407_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="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_358_407_Closed_Text">/**&nbsp;*/</span><span id="Codehighlighter1_358_407_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">16</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@type&nbsp;&nbsp;需要被转换的类型<br />
</span><span style="color: #008080">17</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;</span><span style="color: #808080">@value</span><span style="color: #008000">&nbsp;被转换的值<br />
</span><span style="color: #008080">18</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img id="Codehighlighter1_459_951_Open_Image" onclick="this.style.display='none'; Codehighlighter1_459_951_Open_Text.style.display='none'; Codehighlighter1_459_951_Closed_Image.style.display='inline'; Codehighlighter1_459_951_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_459_951_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_459_951_Closed_Text.style.display='none'; Codehighlighter1_459_951_Open_Image.style.display='inline'; Codehighlighter1_459_951_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">public</span><span style="color: #000000">&nbsp;Object&nbsp;convert(Class&nbsp;type,&nbsp;Object&nbsp;value)&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_459_951_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_459_951_Open_Text"><span style="color: #000000">{&nbsp;<br />
</span><span style="color: #008080">20</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;<br />
</span><span style="color: #008080">21</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;</span><span style="color: #0000ff">if</span><span style="color: #000000">(value</span><span style="color: #000000">==</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
</span><span style="color: #008080">22</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;<br />
</span><span style="color: #008080">23</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;<br />
</span><span style="color: #008080">24</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;</span><span style="color: #0000ff">if</span><span style="color: #000000">(((String)value).trim().length()</span><span style="color: #000000">==</span><span style="color: #000000">0</span><span style="color: #000000">)<br />
</span><span style="color: #008080">25</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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;<br />
</span><span style="color: #008080">26</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;<br />
</span><span style="color: #008080">27</span><span style="color: #000000"><img id="Codehighlighter1_603_853_Open_Image" onclick="this.style.display='none'; Codehighlighter1_603_853_Open_Text.style.display='none'; Codehighlighter1_603_853_Closed_Image.style.display='inline'; Codehighlighter1_603_853_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_603_853_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_603_853_Closed_Text.style.display='none'; Codehighlighter1_603_853_Open_Image.style.display='inline'; Codehighlighter1_603_853_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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(value&nbsp;</span><span style="color: #0000ff">instanceof</span><span style="color: #000000">&nbsp;String)&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_603_853_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_603_853_Open_Text"><span style="color: #000000">{&nbsp;<br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img id="Codehighlighter1_614_713_Open_Image" onclick="this.style.display='none'; Codehighlighter1_614_713_Open_Text.style.display='none'; Codehighlighter1_614_713_Closed_Image.style.display='inline'; Codehighlighter1_614_713_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_614_713_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_614_713_Closed_Text.style.display='none'; Codehighlighter1_614_713_Open_Image.style.display='inline'; Codehighlighter1_614_713_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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</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_614_713_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_614_713_Open_Text"><span style="color: #000000">{&nbsp;<br />
</span><span style="color: #008080">29</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">解析接收到字符串&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #008080">30</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&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">return</span><span style="color: #000000">&nbsp;TimestampUtil.parseTimestamp((String)value,datePattern);&nbsp;&nbsp; //自己写的封装，得到一个Timestamp实例<br />
</span><span style="color: #008080">31</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img id="Codehighlighter1_736_847_Open_Image" onclick="this.style.display='none'; Codehighlighter1_736_847_Open_Text.style.display='none'; Codehighlighter1_736_847_Closed_Image.style.display='inline'; Codehighlighter1_736_847_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_736_847_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_736_847_Closed_Text.style.display='none'; Codehighlighter1_736_847_Open_Image.style.display='inline'; Codehighlighter1_736_847_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;&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;(Exception&nbsp;ex)&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_736_847_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_736_847_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">33</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">发生解析异常</span><span style="color: #008000"><br />
</span><span style="color: #008080">34</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&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">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConversionException(</span><span style="color: #000000">"</span><span style="color: #000000">输入的日期类型不合乎</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;datePattern&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">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;value.getClass());&nbsp;<br />
</span><span style="color: #008080">35</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">36</span><span style="color: #000000"><img id="Codehighlighter1_860_946_Open_Image" onclick="this.style.display='none'; Codehighlighter1_860_946_Open_Text.style.display='none'; Codehighlighter1_860_946_Closed_Image.style.display='inline'; Codehighlighter1_860_946_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_860_946_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_860_946_Closed_Text.style.display='none'; Codehighlighter1_860_946_Open_Image.style.display='inline'; Codehighlighter1_860_946_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;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">else</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_860_946_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_860_946_Open_Text"><span style="color: #000000">{&nbsp;<br />
</span><span style="color: #008080">37</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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">其他异常&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #008080">38</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConversionException(</span><span style="color: #000000">"</span><span style="color: #000000">输入的不是字符类型</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;value.getClass());&nbsp;<br />
</span><span style="color: #008080">39</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;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">40</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">41</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、自己重写了一个BeanUtil，用于实现拷贝request传递来的参数到Model里面，里面注册了一个日期处理监听，这个组件还有待改进<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_22_1164_Open_Image" onclick="this.style.display='none'; Codehighlighter1_22_1164_Open_Text.style.display='none'; Codehighlighter1_22_1164_Closed_Image.style.display='inline'; Codehighlighter1_22_1164_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_22_1164_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_22_1164_Closed_Text.style.display='none'; Codehighlighter1_22_1164_Open_Image.style.display='inline'; Codehighlighter1_22_1164_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;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;BeanUtil&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_22_1164_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_22_1164_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="" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img id="Codehighlighter1_48_49_Open_Image" onclick="this.style.display='none'; Codehighlighter1_48_49_Open_Text.style.display='none'; Codehighlighter1_48_49_Closed_Image.style.display='inline'; Codehighlighter1_48_49_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_48_49_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_48_49_Closed_Text.style.display='none'; Codehighlighter1_48_49_Open_Image.style.display='inline'; Codehighlighter1_48_49_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;copyBean()</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_48_49_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_48_49_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000">;<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;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img id="Codehighlighter1_55_246_Open_Image" onclick="this.style.display='none'; Codehighlighter1_55_246_Open_Text.style.display='none'; Codehighlighter1_55_246_Closed_Image.style.display='inline'; Codehighlighter1_55_246_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_55_246_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_55_246_Closed_Text.style.display='none'; Codehighlighter1_55_246_Open_Image.style.display='inline'; Codehighlighter1_55_246_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&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_55_246_Closed_Text">/**&nbsp;*/</span><span id="Codehighlighter1_55_246_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;将request里的参数封装到一个Bean。如果bean里面有日期型，只是java.sql.Date，java.sql.TimeStamp类型<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;request<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;bean<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@throws</span><span style="color: #008000">&nbsp;IllegalAccessException<br />
</span><span style="color: #008080">10</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@throws</span><span style="color: #008000">&nbsp;InvocationTargetException<br />
</span><span style="color: #008080">11</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img id="Codehighlighter1_392_577_Open_Image" onclick="this.style.display='none'; Codehighlighter1_392_577_Open_Text.style.display='none'; Codehighlighter1_392_577_Closed_Image.style.display='inline'; Codehighlighter1_392_577_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_392_577_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_392_577_Closed_Text.style.display='none'; Codehighlighter1_392_577_Open_Image.style.display='inline'; Codehighlighter1_392_577_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;copyRequestPrameterToModel(HttpServletRequest&nbsp;request,&nbsp;Object&nbsp;bean)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IllegalAccessException,&nbsp;InvocationTargetException</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_392_577_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_392_577_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">13</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&nbsp;map&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getRequestPrameters(request);<br />
</span><span style="color: #008080">14</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;<br />
</span><span style="color: #008080">15</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">if</span><span style="color: #000000">(map&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
</span><span style="color: #008080">16</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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">17</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;<br />
</span><span style="color: #008080">18</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;ConvertUtils.register(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DateConvert(),&nbsp;java.sql.Timestamp.</span><span style="color: #0000ff">class</span><span style="color: #000000">);&nbsp;//注册监听<br />
</span><span style="color: #008080">19</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;BeanUtils.populate(bean,&nbsp;map);<br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">;<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img id="Codehighlighter1_583_653_Open_Image" onclick="this.style.display='none'; Codehighlighter1_583_653_Open_Text.style.display='none'; Codehighlighter1_583_653_Closed_Image.style.display='inline'; Codehighlighter1_583_653_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_583_653_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_583_653_Closed_Text.style.display='none'; Codehighlighter1_583_653_Open_Image.style.display='inline'; Codehighlighter1_583_653_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&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_583_653_Closed_Text">/**&nbsp;*/</span><span id="Codehighlighter1_583_653_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">23</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;从request中取出key和value封装到Map里<br />
</span><span style="color: #008080">24</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;request<br />
</span><span style="color: #008080">25</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000"><br />
</span><span style="color: #008080">26</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">27</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,Object</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getRequestPrameters(HttpServletRequest&nbsp;request)<br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img id="Codehighlighter1_739_1162_Open_Image" onclick="this.style.display='none'; Codehighlighter1_739_1162_Open_Text.style.display='none'; Codehighlighter1_739_1162_Closed_Image.style.display='inline'; Codehighlighter1_739_1162_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_739_1162_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_739_1162_Closed_Text.style.display='none'; Codehighlighter1_739_1162_Open_Image.style.display='inline'; Codehighlighter1_739_1162_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&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_739_1162_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_739_1162_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">29</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,Object</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;map&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,Object</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
</span><span style="color: #008080">30</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;<br />
</span><span style="color: #008080">31</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;Enumeration&nbsp;enuma&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.getParameterNames();<br />
</span><span style="color: #008080">32</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">while</span><span style="color: #000000">(enuma.hasMoreElements())<br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img id="Codehighlighter1_887_1142_Open_Image" onclick="this.style.display='none'; Codehighlighter1_887_1142_Open_Text.style.display='none'; Codehighlighter1_887_1142_Closed_Image.style.display='inline'; Codehighlighter1_887_1142_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_887_1142_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_887_1142_Closed_Text.style.display='none'; Codehighlighter1_887_1142_Open_Image.style.display='inline'; Codehighlighter1_887_1142_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="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_887_1142_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_887_1142_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">34</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;String&nbsp;key&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)enuma.nextElement();<br />
</span><span style="color: #008080">35</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;<br />
</span><span style="color: #008080">36</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;String&nbsp;value&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)request.getParameter(key);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获取value<br />
</span><span style="color: #008080">37</span><span style="color: #008000"><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;<br />
</span><span style="color: #008080">38</span><span style="color: #008000"><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;</span><span style="color: #008000">//</span><span style="color: #008000">如果值为空的话，就不插入map里</span><span style="color: #008000"><br />
</span><span style="color: #008080">39</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;value&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">.equals(value))<br />
</span><span style="color: #008080">40</span><span style="color: #000000"><img id="Codehighlighter1_1071_1090_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1071_1090_Open_Text.style.display='none'; Codehighlighter1_1071_1090_Closed_Image.style.display='inline'; Codehighlighter1_1071_1090_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_1071_1090_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1071_1090_Closed_Text.style.display='none'; Codehighlighter1_1071_1090_Open_Image.style.display='inline'; Codehighlighter1_1071_1090_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;&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_1071_1090_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1071_1090_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">41</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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">continue</span><span style="color: #000000">;<br />
</span><span style="color: #008080">42</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;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">43</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;<br />
</span><span style="color: #008080">44</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;map.put(key,&nbsp;request.getParameter(key));<br />
</span><span style="color: #008080">45</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">46</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;<br />
</span><span style="color: #008080">47</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;map;<br />
</span><span style="color: #008080">48</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">49</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;</p>
<img src ="http://www.blogjava.net/sailor/aggbug/261673.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2009-03-24 12:26 <a href="http://www.blogjava.net/sailor/articles/261673.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两种Date</title><link>http://www.blogjava.net/sailor/articles/261557.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Mon, 23 Mar 2009 10:08:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/261557.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/261557.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/261557.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/261557.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/261557.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 做毕业设计时，遇到了Date类型的问题：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在action层，我封装了一个BeanUtil类，用来拷贝form表单的参数到model，BeanUtil继承了BeanUtils。当表单有日期类型时，BeanUtils不会转化java.util.Date的类型。所以PO的日期类型是java.sql.Date。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据插入后，从数据库里取出的值，封装到一个List，然后转换成JsonArray对象，又出了问题，经过检查，发现JSON不能转化java.sql.Date的类型，只能转换java.util.Date类型的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这两个问题怎么综合解决，还没想好，先记下。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<img src ="http://www.blogjava.net/sailor/aggbug/261557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2009-03-23 18:08 <a href="http://www.blogjava.net/sailor/articles/261557.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Javarebel使用</title><link>http://www.blogjava.net/sailor/articles/248533.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Fri, 26 Dec 2008 11:34:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/248533.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/248533.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/248533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/248533.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/248533.html</trackback:ping><description><![CDATA[<p>Javarebel是一个Jvm插件，使用非常简单，只需要两步：</p>
<ul>
    <li>将javarebel.jar加入classpath（不建议将javarebel.jar放在WEB-INF/lib下，因为生产环境不需要它）
    <li>命令行中加入下面的启动参数<br />
    <code>java -noverify -javaagent:C:\libraries\javarebel.jar -Drebel.dirs=c:\workspace\project\classes</code> <br />
    <code>Drebel.dirs指向工程中.class文件的目录，不必指定具体的类名。另外，javarebel.jar的名字不能修改。</code></li>
</ul>
<p><code>在Myeclipse中使用：<br />
&nbsp;&nbsp;&nbsp;&nbsp;window-preference-Tomcat 6.x-JDK-Optional JDK arguments下设置如下：<br />
&nbsp;&nbsp;&nbsp;</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"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;-noverify&nbsp;-javaagent:D:/servers/javarebel-2.0-M1a/javarebel.jar</span></div>
</code><br />
<img src ="http://www.blogjava.net/sailor/aggbug/248533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2008-12-26 19:34 <a href="http://www.blogjava.net/sailor/articles/248533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java资源链接</title><link>http://www.blogjava.net/sailor/articles/246255.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Sun, 14 Dec 2008 11:28:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/246255.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/246255.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/246255.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/246255.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/246255.html</trackback:ping><description><![CDATA[导入导出Excel：http://maqianli.javaeye.com/category/48520
<img src ="http://www.blogjava.net/sailor/aggbug/246255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2008-12-14 19:28 <a href="http://www.blogjava.net/sailor/articles/246255.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cvs相关工具下载地址</title><link>http://www.blogjava.net/sailor/articles/246036.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Fri, 12 Dec 2008 13:17:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/246036.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/246036.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/246036.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/246036.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/246036.html</trackback:ping><description><![CDATA[<p><font face="Courier New" size="1">转载自:http://www.wujianrong.com/archives/2006/10/cvs.html</font></p>
<p><font face="Courier New" size="1">CVS服务器端：<br />
CVS 下载：http://www.march-hare.com/cvspro/<br />
CVS 下载地址：</font><a href="http://www.cvshome.org/"><font face="Courier New" color="#3f658c" size="1"><u>http://www.cvshome.org/</u></font></a><font face="Courier New" size="1"> (最新版本：hp:1.12.11,Linux and win32:1.11.17)<br />
cvsnt 下载地址：</font><a href="http://www.cvsnt.com/cvspro/"><font face="Courier New" color="#3f658c" size="1"><u>http://www.cvsnt.com/cvspro/</u></font></a><font face="Courier New" size="1"> (最新版本：2.0.58d) </font><br />
</p>
<p><font face="Courier New, Courier, Monospace" size="1">CVS客户端：<br />
TortoiseCVS 下载地址：</font><a href="http://www.tortoisecvs.org/"><font face="Courier New, Courier, Monospace" color="#3f658c" size="1"><u>http://www.tortoisecvs.org/</u></font></a><font face="Courier New, Courier, Monospace" size="1"> (最新版本：1.8.11)<br />
wincvs 下载地址：</font><a href="http://cvsgui.sourceforge.net/download.html"><font face="Courier New, Courier, Monospace" color="#3f658c" size="1"><u>http://cvsgui.sourceforge.net/download.html</u></font></a><font face="Courier New, Courier, Monospace" size="1"> (最新版本：1.3.20.3)<br />
Python 下载地址：</font><a href="http://www.python.org/download/"><font face="Courier New, Courier, Monospace" color="#3f658c" size="1"><u>http://www.python.org/download/</u></font></a><font face="Courier New, Courier, Monospace" size="1"> (最新版本：2.4)<br />
TCL 下载地址：</font><a href="http://www.activestate.com/Products/ActiveTCL/"><font face="Courier New, Courier, Monospace" color="#3f658c" size="1"><u>http://www.activestate.com/Products/ActiveTCL/</u></font></a><font face="Courier New, Courier, Monospace" size="1"> (最新版本：8.4.9.0)<br />
SmartCVS 下载地址：</font><a href="http://www.regnis.de/download.html"><font face="Courier New, Courier, Monospace" color="#3f658c" size="1"><u>http://www.regnis.de/download.html</u></font></a><font face="Courier New, Courier, Monospace" size="1"> (最新版本：3.0.6)</font></p>
<br />
<p><font face="Courier New, Courier, Monospace" size="1">CVSWEB 下载地址：</font><a href="http://www.freebsd.org/projects/cvsweb.html"><font face="Courier New, Courier, Monospace" color="#3f658c" size="1"><u>http://www.freebsd.org/projects/cvsweb.html</u></font></a><font face="Courier New, Courier, Monospace" size="1"> (最新版本：3.0.5)<br />
viewcvs 下载地址：</font><a href="http://viewcvs.sourceforge.net/"><font face="Courier New, Courier, Monospace" color="#3f658c" size="1"><u>http://viewcvs.sourceforge.net/</u></font></a><font face="Courier New, Courier, Monospace" size="1">(最新版本：0.9.2)<br />
CvsGraph 下载地址：</font><a href="http://www.akhphd.au.dk/%7Ebertho/cvsgraph/"><font face="Courier New, Courier, Monospace" color="#3f658c" size="1"><u>http://www.akhphd.au.dk/~bertho/cvsgraph/</u></font></a><font face="Courier New, Courier, Monospace" size="1">(最新版本:1.5.1)</font></p>
<br />
<p><font face="Courier New, Courier, Monospace" size="1">缺陷跟踪：<br />
CVSTrac 下载地址：</font><a href="http://www.cnpack.org/"><font face="Courier New, Courier, Monospace" color="#3f658c" size="1"><u>http://www.cnpack.org/</u></font></a><font face="Courier New, Courier, Monospace" size="1"> (</font><a href="http://www.cvstrac.org/"><font face="Courier New, Courier, Monospace" color="#3f658c" size="1"><u>http://www.cvstrac.org/</u></font></a><font face="Courier New, Courier, Monospace" size="1">)(最新版本：1.1.5)</font></p>
<br />
<p><br />
<font face="Courier New, Courier, Monospace" size="1">基于CVS的代码统计工具：按代码量，按开发者的统计表等：<br />
StatCVS 下载地址：</font><a href="http://sourceforge.net/projects/statcvs"><font face="Courier New, Courier, Monospace" color="#3f658c" size="1"><u>http://sourceforge.net/projects/statcvs</u></font></a><font face="Courier New, Courier, Monospace" size="1"> (最新版本：0.2.2)</font></p>
<br />
<p><br />
<font face="Courier New, Courier, Monospace" size="1">CVS权限管理（CVSACL is a patch for CVS）：<br />
cvsacl 下载地址：</font><a href="http://cvsacl.sourceforge.net/"><font face="Courier New, Courier, Monospace" color="#3f658c" size="1"><u>http://cvsacl.sourceforge.net/</u></font></a><font face="Courier New, Courier, Monospace" size="1">(最新版本：1.2.2)</font></p>
<br />
<p><font face="Courier New, Courier, Monospace" size="1">subversion服务器端：<br />
subversion 下载地址：</font><a href="http://subversion.tigris.org/project_packages.html#binary-packages"><font face="Courier New, Courier, Monospace" color="#3f658c" size="1"><u>http://subversion.tigris.org/project_packages.html#binary-packages</u></font></a><font face="Courier New, Courier, Monospace" size="1"> (最新版本：1.3.2)</font></p>
<br />
<p><font face="Courier New, Courier, Monospace" size="1">subversion客户端：<br />
tortoisesvn 下载地址：</font><a href="http://tortoisesvn.tigris.org/"><font face="Courier New, Courier, Monospace" color="#3f658c" size="1"><u>http://tortoisesvn.tigris.org/</u></font></a><font face="Courier New, Courier, Monospace" size="1"> (最新版本：1.4.0)<br />
rapidsvn 下载地址：</font><a href="http://rapidsvn.tigris.org/"><font face="Courier New, Courier, Monospace" color="#3f658c" size="1"><u>http://rapidsvn.tigris.org/</u></font></a><font face="Courier New, Courier, Monospace" size="1"> (最新版本：0.9.3)</font></p>
<img src ="http://www.blogjava.net/sailor/aggbug/246036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2008-12-12 21:17 <a href="http://www.blogjava.net/sailor/articles/246036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式总结</title><link>http://www.blogjava.net/sailor/articles/244885.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Sun, 07 Dec 2008 11:50:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/244885.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/244885.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/244885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/244885.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/244885.html</trackback:ping><description><![CDATA[<p>1、&nbsp; </p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">在表达式中有特殊意义，需要添加 """ 才能匹配该字符本身的字符汇总</span></p>
<p>
<table style="background: #f8f8f8; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; background: #f0f0f0; padding-bottom: 2.25pt; width: 41.25pt; padding-top: 2.25pt" width="55">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">字符</span></p>
            </td>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; background: #f0f0f0; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">说明</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">^</span></p>
            </td>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">匹配输入字符串的开始位置。要匹配 "^" 字符本身，请使用 ""^"</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">$</span></p>
            </td>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">匹配输入字符串的结尾位置。要匹配 "$" 字符本身，请使用 ""$"</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">( )</span></p>
            </td>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">标记一个子表达式的开始和结束位置。要匹配小括号，请使用 ""(" 和 "")"</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">[ ]</span></p>
            </td>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号，请使用 ""[" 和 ""]"</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">{ }</span></p>
            </td>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">修饰匹配次数的符号。要匹配大括号，请使用 ""{" 和 ""}"</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">.</span></p>
            </td>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">匹配除了换行符（"n）以外的任意一个字符。要匹配小数点本身，请使用 ""."</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">?</span></p>
            </td>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身，请使用 ""?"</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">+</span></p>
            </td>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">修饰匹配次数为至少 1 次。要匹配 "+" 字符本身，请使用 ""+"</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">*</span></p>
            </td>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身，请使用 ""*"</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">|</span></p>
            </td>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">左右两边表达式之间 "或" 关系。匹配 "|" 本身，请使用 ""|"</span></p>
            </td>
        </tr>
    </tbody>
</table>
<br />
比较{? + *}用法</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"><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_25_401_Open_Image" onclick="this.style.display='none'; Codehighlighter1_25_401_Open_Text.style.display='none'; Codehighlighter1_25_401_Closed_Image.style.display='inline'; Codehighlighter1_25_401_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_25_401_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_25_401_Closed_Text.style.display='none'; Codehighlighter1_25_401_Open_Image.style.display='inline'; Codehighlighter1_25_401_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">class</span><span style="color: #000000">&nbsp;DataMatcher&nbsp;</span><span id="Codehighlighter1_25_401_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_25_401_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_67_399_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_399_Open_Text.style.display='none'; Codehighlighter1_67_399_Closed_Image.style.display='inline'; Codehighlighter1_67_399_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_67_399_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_67_399_Closed_Text.style.display='none'; Codehighlighter1_67_399_Open_Image.style.display='inline'; Codehighlighter1_67_399_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_67_399_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_67_399_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;input&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">aab&nbsp;ab&nbsp;acb&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;regex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">e.+?d</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;regex1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">a*b</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;regex2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">a+b</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;regex3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">a?b</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pattern&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Pattern.compile(regex1);<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Matcher&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p.matcher(input);<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><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;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img id="Codehighlighter1_298_396_Open_Image" onclick="this.style.display='none'; Codehighlighter1_298_396_Open_Text.style.display='none'; Codehighlighter1_298_396_Closed_Image.style.display='inline'; Codehighlighter1_298_396_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_298_396_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_298_396_Closed_Text.style.display='none'; Codehighlighter1_298_396_Open_Image.style.display='inline'; Codehighlighter1_298_396_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(m.find())</span><span id="Codehighlighter1_298_396_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_298_396_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><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;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">match:&nbsp;'</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;m.group()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">'&nbsp;start:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;m.start()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;m.end());<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&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 src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<p><br />
regex1 result:<br />
</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"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">aab</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000"><br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">ab</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000"><br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">b</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">9</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">10</span></div>
<p><br />
<br />
regex2 result<br />
</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"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">aab</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000"><br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">ab</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">6</span></div>
<p><br />
<br />
regex3 result<br />
</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"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">ab</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000"><br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">ab</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000"><br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">b</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">9</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">10</span></div>
<p><br />
<br />
{.}的用法<br />
</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"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">String&nbsp;regex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">a.*?b</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />String&nbsp;input&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">eaab&nbsp;ab&nbsp;eb&nbsp;acb&nbsp;acsd&nbsp;df&nbsp;ad</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
result:<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"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">aab</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000"><br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">ab</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">7</span><span style="color: #000000"><br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">acb</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">11</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">14</span></div>
<br />
<br />
{|}的用法<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">String&nbsp;input&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">eaab&nbsp;ab&nbsp;eb&nbsp;acb&nbsp;acsd&nbsp;df&nbsp;ad</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />String&nbsp;regex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">(a.*?)(b|d)</span><span style="color: #000000">"</span><span style="color: #000000">;</span></div>
<br />
result:<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"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">aab</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000"><br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">ab</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">7</span><span style="color: #000000"><br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">acb</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">11</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000"><br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">acsd</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">15</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">19</span><span style="color: #000000"><br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">ad</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">23</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">25</span></div>
<br />
{[]}用法<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">String&nbsp;input&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">a&nbsp;b&nbsp;c&nbsp;da&nbsp;ab</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />String&nbsp;regex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">[ab]</span><span style="color: #000000">"</span><span style="color: #000000">;</span></div>
<br />
result:<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"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">a</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">b</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000"><br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">a</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">7</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">8</span><span style="color: #000000"><br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">a</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">9</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000"><br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />match:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">b</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;start:&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">&nbsp;end:&nbsp;</span><span style="color: #000000">11</span></div>
<br />
<img src ="http://www.blogjava.net/sailor/aggbug/244885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2008-12-07 19:50 <a href="http://www.blogjava.net/sailor/articles/244885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>类加载器</title><link>http://www.blogjava.net/sailor/articles/235266.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Sun, 19 Oct 2008 00:31:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/235266.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/235266.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/235266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/235266.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/235266.html</trackback:ping><description><![CDATA[来源：网络<br />
&nbsp;
<p style="text-align: center" align="center"><strong><span style="font-size: 22pt; font-family: 宋体">类加载器</span></strong></p>
<p style="text-indent: 21pt">Java<span style="font-family: 宋体">中类的查找与装载出现的问题总是会时不时出现在</span>Java<span style="font-family: 宋体">程序员面前，这并不是什么丢脸的事情，相信没有一个</span>Java<span style="font-family: 宋体">程序员没遇到过</span>ClassNotException,<span style="font-family: 宋体">因此不要为被人瞅见自己也犯这样的错误而觉得不自然，但是在如果出现了</span>ClassNotFoundException<span style="font-family: 宋体">后异常后一脸的茫然，那我想你该了解一下</span>java<span style="font-family: 宋体">的类装载的体制了，同时为了进行下面的关于类装载器之间的隔离性的讨论，我们先简单介绍一下类装载的体系结构。</span></p>
<p><strong>1. Java</strong><strong><span style="font-family: 宋体">类装载体系结构</span></strong></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">装载类的过程非常简单：查找类所在位置，并将找到的</span>Java<span style="font-family: 宋体">类的字节码装入内存，生成对应的</span>Class<span style="font-family: 宋体">对象。</span>Java<span style="font-family: 宋体">的类装载器专门用来实现这样的过程，</span>JVM<span style="font-family: 宋体">并不止有一个类装载器，事实上，如果你愿意的话，你可以让</span>JVM<span style="font-family: 宋体">拥有无数个类装载器，当然这除了测试</span>JVM<span style="font-family: 宋体">外，我想不出还有其他的用途。你应该已经发现到了这样一个问题，类装载器自身也是一个类，它也需要被装载到内存中来，那么这些类装载器由谁来装载呢，总得有个根吧？没错，确实存在这样的根，它就是神龙见首不见尾的</span><strong><span style="color: red">Bootstrap ClassLoader</span></strong>. <span style="font-family: 宋体">为什么说它神龙见首不见尾呢，因为你根本无法在</span>Java<span style="font-family: 宋体">代码中抓住哪怕是它的一点点的尾巴，尽管你能时时刻刻体会到它的存在，<strong><em><u><span style="color: #0070c0">因为</span></u></em></strong></span><strong><em><u><span style="color: #0070c0">java</span></u></em></strong><strong><em><u><span style="color: #0070c0; font-family: 宋体">的运行环境所需要的所有类库，都由它来装载</span></u></em></strong><span style="font-family: 宋体">，而它本身是</span>C++<span style="font-family: 宋体">写的程序，可以独立运行</span>,<span style="font-family: 宋体">可以说是</span>JVM<span style="font-family: 宋体">的运行起点</span>,<span style="font-family: 宋体">伟大吧。在</span>Bootstrap<span style="font-family: 宋体">完成它的任务后，会生成一个</span><strong><span style="color: red">AppClassLoader</span></strong>(<span style="font-family: 宋体">实际上之前系统还会使用扩展类装载器</span>ExtClassLoader<span style="font-family: 宋体">，它用于装载</span>Java<span style="font-family: 宋体">运行环境扩展包中的类</span>),<span style="font-family: 宋体">这个类装载器才是我们经常使用的，可以调用</span>ClassLoader.getSystemClassLoader() <span style="font-family: 宋体">来获得，我们假定程序中没有使用类装载器相关操作设定或者自定义新的类装载器，那么我们编写的所有</span>java<span style="font-family: 宋体">类通通会由它来装载，值得尊敬吧。</span>AppClassLoader<span style="font-family: 宋体">查找类的区域就是耳熟能详的</span>Classpath<span style="font-family: 宋体">，也是初学者必须跨过的门槛，有没有灵光一闪的感觉，我们按照它的类查找范围给它取名为类路径类装载器。还是先前假定的情况，当</span>Java<span style="font-family: 宋体">中出现新的类，</span>AppClassLoader<span style="font-family: 宋体">首先在类传递给它的父类类装载器，也就是</span>Extion ClassLoader<span style="font-family: 宋体">，询问它是否能够装载该类，如果能，那</span>AppClassLoader<span style="font-family: 宋体">就不干这活了，同样</span>Extion ClassLoader<span style="font-family: 宋体">在装载时，也会先问问它的父类装载器。我们可以看出类装载器实际上是一个树状的结构图，每个类装载器有自己的父亲，类装载器在装载类时，总是先让自己的父类装载器装载</span>(<span style="font-family: 宋体">多么尊敬长辈</span>),<span style="font-family: 宋体">如果父类装载器无法装载该类时，自己就会动手装载，如果它也装载不了，那么对不起，它会大喊一声：</span>Exception<span style="font-family: 宋体">，</span>class not found<span style="font-family: 宋体">。有必要提一句，当由直接使用类路径装载器装载类失败抛出的是</span>NoClassDefFoundException<span style="font-family: 宋体">异常。如果使用自定义的类装载器</span>loadClass<span style="font-family: 宋体">方法或者</span>ClassLoader<span style="font-family: 宋体">的</span>findSystemClass<span style="font-family: 宋体">方法装载类，如果你不去刻意改变，那么抛出的是</span>ClassNotFoundException<span style="font-family: 宋体">。</span></p>
<p><span style="font-family: 宋体">我们简短总结一下上面的讨论：</span></p>
<p>1.JVM<span style="font-family: 宋体">类装载器的体系结构可以看作是树状结构。</span></p>
<p>2.<span style="font-family: 宋体">父类装载器优先装载。在父类装载器装载失败的情况下再装载，如果都装载失败则抛出</span>ClassNotFoundException<span style="font-family: 宋体">或者</span>NoClassDefFoundError<span style="font-family: 宋体">异常。</span></p>
<p><span style="font-family: 宋体">那么我们的类在什么情况下被装载的呢？</span></p>
<p>2. <span style="font-family: 宋体">类如何被装载</span></p>
<p><span style="font-family: 宋体">在</span>java2<span style="font-family: 宋体">中，</span>JVM<span style="font-family: 宋体">是如何装载类的呢，可以分为两种类型，一种是<strong>隐式的类装载</strong>，一种是<strong>显式的类装载</strong>。</span></p>
<p>2.1 <span style="font-family: 宋体">隐式的类装载</span></p>
<p><span style="font-family: 宋体">隐式的类装载是编码中最常用得方式：</span></p>
<p>A b = new A();</p>
<p><span style="font-family: 宋体">如果程序运行到这段代码时还没有</span>A<span style="font-family: 宋体">类，那么</span>JVM<span style="font-family: 宋体">会请求装载当前类的类装器来装载类。问题来了，我把代码弄得复杂一点点，但依旧没有任何难度，请思考</span>JVM<span style="font-family: 宋体">得装载次序：</span></p>
<p>package test;</p>
<p>Public class A{</p>
<p>&nbsp;&nbsp;&nbsp; public void static main(String args[]){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B b <span style="font-family: 宋体">＝</span> new B();</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>class B{C c;}</p>
<p>class C{}</p>
<p><span style="font-family: 宋体">揭晓答案，类装载的次序为</span>A-&gt;B<span style="font-family: 宋体">，而类</span>C<span style="font-family: 宋体">根本不会被</span>JVM<span style="font-family: 宋体">理会</span>,<span style="font-family: 宋体">先不要惊讶，仔细想想，这不正是我们最需要得到的结果。我们仔细了解一下</span>JVM<span style="font-family: 宋体">装载顺序。当使用</span>Java A<span style="font-family: 宋体">命令运行</span>A<span style="font-family: 宋体">类时，</span>JVM<span style="font-family: 宋体">会首先要求类路径类装载器</span>(AppClassLoader)<span style="font-family: 宋体">装载</span>A<span style="font-family: 宋体">类，但是这时只装载</span>A<span style="font-family: 宋体">，不会装载</span>A<span style="font-family: 宋体">中出现的其他类</span>(B<span style="font-family: 宋体">类</span>)<span style="font-family: 宋体">，接着它会调用</span>A<span style="font-family: 宋体">中的</span>main<span style="font-family: 宋体">函数，直到运行语句</span>b <span style="font-family: 宋体">＝</span> new B()<span style="font-family: 宋体">时，</span>JVM<span style="font-family: 宋体">发现必须装载</span>B<span style="font-family: 宋体">类程序才能继续运行，于是类路径类装载器会去装载</span>B<span style="font-family: 宋体">类，虽然我们可以看到</span>B<span style="font-family: 宋体">中有有</span>C<span style="font-family: 宋体">类的声明，但是并不是实际的执行语句，所以并不去装载</span>C<span style="font-family: 宋体">类，也就是说</span>JVM<span style="font-family: 宋体">按照运行时的有效执行语句，来决定是否需要装载新类，从而装载尽可能少的类，这一点和编译类是不相同的。</span></p>
<p>2.2 <span style="font-family: 宋体">显式的类装载</span></p>
<p><span style="font-family: 宋体">使用显示的类装载方法很多，我们都装载类</span>test.A<span style="font-family: 宋体">为例。</span></p>
<p><span style="font-family: 宋体">使用</span>Class<span style="font-family: 宋体">类的</span>forName<span style="font-family: 宋体">方法。它可以指定装载器，也可以使用装载当前类的装载器。例如：</span></p>
<p style="tab-stops: center 207.65pt">Class.forName("test.A");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p><span style="font-family: 宋体">它的效果和</span></p>
<p>Class.forName("test.A",true,this.getClass().getClassLoader());</p>
<p><span style="font-family: 宋体">是一样的。</span></p>
<p><span style="font-family: 宋体">使用类路径类装载装载</span>.</p>
<p>ClassLoader.getSystemClassLoader().loadClass("test.A");</p>
<p><span style="font-family: 宋体">使用当前进程上下文的使用的类装载器进行装载，这种装载类的方法常常被有着复杂类装载体系结构的系统所使用。</span></p>
<p>Thread.currentThread().getContextClassLoader().loadClass("test.A")</p>
<p><span style="font-family: 宋体">使用自定义的类装载器装载类</span></p>
<p>public class MyClassLoader extends URLClassLoader{</p>
<p>public MyClassLoader() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(new URL[0]);</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>MyClassLoader myClassLoader = new MyClassLoader();</p>
<p>myClassLoader.loadClass("test.A");</p>
<p>MyClassLoader<span style="font-family: 宋体">继承了</span>URLClassLoader<span style="font-family: 宋体">类，这是</span>JDK<span style="font-family: 宋体">核心包中的类装载器，在没有指定父类装载器的情况下，类路径类装载器就是它的父类装载器，</span>MyClassLoader<span style="font-family: 宋体">并没有增加类的查找范围，因此它和类路径装载器有相同的效果。</span></p>
<p><span style="font-family: 宋体">我们已经知道</span>Java<span style="font-family: 宋体">的类装载器体系结构为树状，多个类装载器可以指定同一个类装载器作为自己的父类，每个子类装载器就是树状结构的一个分支，当然它们又可以个有子类装载器类装载器，类装载器也可以没有父类装载器，这时</span>Bootstrap<span style="font-family: 宋体">类装载器将作为它的隐含父类，实际上</span>Bootstrap<span style="font-family: 宋体">类装载器是所有类装载器的祖先，也是树状结构的根。这种树状体系结构，以及父类装载器优先的机制，为我们编写自定义的类装载器提供了便利，同时可以让程序按照我们希望的方式进行类的装载。例如某个程序的类装载器体系结构图如下：</span></p>
<p><span style="font-family: 宋体">图</span>2<span style="font-family: 宋体">：某个程序的类装载器的结构</span></p>
<p><span style="font-family: 宋体">解释一下上面的图，</span>ClassLoaderA<span style="font-family: 宋体">为自定义的类装载器，它的父类装载器为类路径装载器，它有两个子类装载器</span>ClassLoaderAA<span style="font-family: 宋体">和</span>ClassLaderAB<span style="font-family: 宋体">，</span>ClassLoaderB<span style="font-family: 宋体">为程序使用的另外一个类装载器，它没有父类装载器，但有一个子类装载器</span>ClassLoaderBB<span style="font-family: 宋体">。你可能会说，见鬼，我的程序怎么会使用这么复杂的类装载器结构。为了进行下面的讨论，暂且委屈一下。</span></p>
<p>3. <span style="font-family: 宋体">奇怪的隔离性</span></p>
<p><span style="font-family: 宋体">我们不难发现，图</span>2<span style="font-family: 宋体">中的类装载器</span>AA<span style="font-family: 宋体">和</span>AB<span style="font-family: 宋体">，</span> AB<span style="font-family: 宋体">和</span>BB<span style="font-family: 宋体">，</span>AA<span style="font-family: 宋体">和</span>B<span style="font-family: 宋体">等等位于不同分支下，他们之间没有父子关系，我不知道如何定义这种关系，姑且称他们位于不同分支下。两个位于不同分支的类装载器具有隔离性，这种隔离性使得在分别使用它们装载同一个类，也会在内存中出现两个</span>Class<span style="font-family: 宋体">类的实例。因为被具有隔离性的类装载器装载的类不会共享内存空间，使得使用一个类装载器不可能完成的任务变得可以轻而易举，例如类的静态变量可能同时拥有多个值（虽然好像作用不大），因为就算是被装载类的同一静态变量，它们也将被保存不同的内存空间，又例如程序需要使用某些包，但又不希望被程序另外一些包所使用，很简单，编写自定义的类装载器。类装载器的这种隔离性在许多大型的软件应用和服务程序得到了很好的应用。下面是同一个类静态变量为不同值的例子。</span></p>
<p>package test;</p>
<p>public class A {</p>
<p>&nbsp;public static void main( String[] args ) {</p>
<p>&nbsp;&nbsp;&nbsp; try {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 宋体">定义两个类装载器</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyClassLoader aa= new MyClassLoader();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyClassLoader bb = new MyClassLoader();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 宋体">用类装载器</span>aa<span style="font-family: 宋体">装载</span>testb.B<span style="font-family: 宋体">类</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class clazz=aa.loadClass("testb. B");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constructor constructor= </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clazz.getConstructor(new Class[]{Integer.class});</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object object = </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; constructor.newInstance(new Object[]{new Integer(1)});</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method method = </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; clazz.getDeclaredMethod("printB",new Class[0]);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 宋体">用类装载器</span>bb<span style="font-family: 宋体">装载</span>testb.B<span style="font-family: 宋体">类</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class clazz2=bb.loadClass("testb. B");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constructor constructor2 = </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clazz2.getConstructor(new Class[]{Integer.class});</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object object2 = </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; constructor2.newInstance(new Object[]{new Integer(2)});</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method method2 = </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; clazz2.getDeclaredMethod("printB",new Class[0]);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 宋体">显示</span>test.B<span style="font-family: 宋体">中的静态变量的值</span> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method.invoke( object,new Object[0]);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method2.invoke( object2,new Object[0]);</p>
<p>&nbsp;&nbsp;&nbsp; } catch ( Exception e ) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;}</p>
<p>}</p>
<p>//Class B <span style="font-family: 宋体">必须位于</span>MyClassLoader<span style="font-family: 宋体">的查找范围内，</span></p>
<p>//<span style="font-family: 宋体">而不应该在</span>MyClassLoader<span style="font-family: 宋体">的父类装载器的查找范围内。</span></p>
<p>package testb;</p>
<p>public class B {</p>
<p>&nbsp;&nbsp;&nbsp; static int b ;</p>
<p>&nbsp;&nbsp;&nbsp; public B(Integer testb) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b = testb.intValue();</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void printB() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("my static field b is ", b);</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>public class MyClassLoader extends URLClassLoader{</p>
<p>&nbsp;private static File file = new File("c:""classes ");</p>
<p>&nbsp;//<span style="font-family: 宋体">该路径存放着</span>class B<span style="font-family: 宋体">，但是没有</span>class A</p>
<p>&nbsp;public MyClassLoader() {</p>
<p>&nbsp;&nbsp;&nbsp; super(getUrl());</p>
<p>&nbsp;}</p>
<p>&nbsp;public static URL[] getUrl() {</p>
<p>&nbsp;&nbsp;&nbsp; try {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new URL[]{file.toURL()};</p>
<p>&nbsp;&nbsp;&nbsp; } catch ( MalformedURLException e ) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new URL[0];</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;}</p>
<p>}</p>
<p><span style="font-family: 宋体">程序的运行结果为：</span></p>
<p>my static field b is 1</p>
<p>my static field b is 2</p>
<p><span style="font-family: 宋体">程序的结果非常有意思，从编程者的角度，我们甚至可以把不在同一个分支的类装载器看作不同的</span>java<span style="font-family: 宋体">虚拟机，因为它们彼此觉察不到对方的存在。程序在使用具有分支的类装载的体系结构时要非常小心，弄清楚每个类装载器的类查找范围，尽量避免父类装载器和子类装载器的类查找范围中有相同类名的类（包括包名和类名），下面这个例子就是用来说明这种情况可能带来的问题。</span></p>
<p><span style="font-family: 宋体">假设有相同名字却不同版本的接口</span> A<span style="font-family: 宋体">，</span></p>
<p><span style="font-family: 宋体">版本</span> 1<span style="font-family: 宋体">：</span></p>
<p>package test;</p>
<p>Intefer Same{ public String getVersion(); }</p>
<p><span style="font-family: 宋体">版本</span> 2<span style="font-family: 宋体">：</span></p>
<p>Package test;</p>
<p>Intefer Same{ public String getName(); }</p>
<p><span style="font-family: 宋体">接口</span>A<span style="font-family: 宋体">两个版本的实现：</span></p>
<p><span style="font-family: 宋体">版本</span>1<span style="font-family: 宋体">的实现</span></p>
<p>package test;</p>
<p>public class Same1Impl implements Same {</p>
<p>public String getVersion(){ return "A version 1";}</p>
<p>}</p>
<p><span style="font-family: 宋体">版本</span>2<span style="font-family: 宋体">的实现</span></p>
<p>public class Same 2Impl implements Same {</p>
<p>public String getName(){ return "A version 2";}</p>
<p>}</p>
<p><span style="font-family: 宋体">我们依然使用图</span>2<span style="font-family: 宋体">的类装载器结构，首先将版本</span>1<span style="font-family: 宋体">的</span>Same<span style="font-family: 宋体">和</span>Same<span style="font-family: 宋体">的实现类</span>Same1Impl<span style="font-family: 宋体">打成包</span>same1.jar<span style="font-family: 宋体">，将版本</span>2<span style="font-family: 宋体">的</span>Same<span style="font-family: 宋体">和</span>Same<span style="font-family: 宋体">的实现类</span>Same1Impl<span style="font-family: 宋体">打成包</span>same2.jar<span style="font-family: 宋体">。现在，做这样的事情，把</span>same1.jar<span style="font-family: 宋体">放入类装载器</span>ClassLoaderA<span style="font-family: 宋体">的类查找范围中，把</span>same2.jar<span style="font-family: 宋体">放入类装器</span>ClassLoaderAB<span style="font-family: 宋体">的类查找范围中。当你兴冲冲的运行下面这个看似正确的程序。</span></p>
<p><span style="font-family: 宋体">实际上这个错误的是由父类载器优先装载的机制造成，当类装载器</span>ClassLoaderAB<span style="font-family: 宋体">在装载</span>Same2Impl<span style="font-family: 宋体">类时发现必须装载接口</span>test.Same<span style="font-family: 宋体">，于是按规定请求父类装载器装载，父类装载器发现了版本</span>1<span style="font-family: 宋体">的</span>test.Same<span style="font-family: 宋体">接口并兴冲冲的装载，但是却想不到</span>Same2Impl<span style="font-family: 宋体">所希望的是版本</span>2 <span style="font-family: 宋体">的</span>test.Same<span style="font-family: 宋体">，后面的事情可想而知了，异常被抛出。</span></p>
<p><span style="font-family: 宋体">我们很难责怪</span>Java<span style="font-family: 宋体">中暂时并没有提供区分版本的机制，如果使用了比较复杂的类装载器体系结构，在出现了某个包或者类的多个版本时，应特别注意。</span></p>
<p><span style="font-family: 宋体">掌握和灵活运用</span>Java<span style="font-family: 宋体">的类装载器的体系结构，对程序的系统设计，程序的实现，已经程序的调试，都有相当大的帮助。希望以上的内容能够对您有所帮助。</span></p>
<img src ="http://www.blogjava.net/sailor/aggbug/235266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2008-10-19 08:31 <a href="http://www.blogjava.net/sailor/articles/235266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中文字符串按拼音排序 代码(转) </title><link>http://www.blogjava.net/sailor/articles/215381.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Thu, 17 Jul 2008 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/215381.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/215381.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/215381.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/215381.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/215381.html</trackback:ping><description><![CDATA[<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.text.Collator;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Arrays;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Comparator;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_106_536_Open_Image" onclick="this.style.display='none'; Codehighlighter1_106_536_Open_Text.style.display='none'; Codehighlighter1_106_536_Closed_Image.style.display='inline'; Codehighlighter1_106_536_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_106_536_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_106_536_Closed_Text.style.display='none'; Codehighlighter1_106_536_Open_Image.style.display='inline'; Codehighlighter1_106_536_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SortPinyin&nbsp;</span><span id="Codehighlighter1_106_536_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_106_536_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_113_142_Open_Image" onclick="this.style.display='none'; Codehighlighter1_113_142_Open_Text.style.display='none'; Codehighlighter1_113_142_Closed_Image.style.display='inline'; Codehighlighter1_113_142_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_113_142_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_113_142_Closed_Text.style.display='none'; Codehighlighter1_113_142_Open_Image.style.display='inline'; Codehighlighter1_113_142_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_113_142_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">/**&nbsp;*/</span><span id="Codehighlighter1_113_142_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;args<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_187_533_Open_Image" onclick="this.style.display='none'; Codehighlighter1_187_533_Open_Text.style.display='none'; Codehighlighter1_187_533_Closed_Image.style.display='inline'; Codehighlighter1_187_533_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_187_533_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_187_533_Closed_Text.style.display='none'; Codehighlighter1_187_533_Open_Image.style.display='inline'; Codehighlighter1_187_533_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_187_533_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_187_533_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Comparator&nbsp;cmp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Collator.getInstance(java.util.Locale.CHINA);<br />
<img id="Codehighlighter1_326_380_Open_Image" onclick="this.style.display='none'; Codehighlighter1_326_380_Open_Text.style.display='none'; Codehighlighter1_326_380_Closed_Image.style.display='inline'; Codehighlighter1_326_380_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_326_380_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_326_380_Closed_Text.style.display='none'; Codehighlighter1_326_380_Open_Image.style.display='inline'; Codehighlighter1_326_380_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;arr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_326_380_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_326_380_Open_Text"><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">,</span><span style="color: #000000">"</span><span style="color: #000000">张A</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">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">王五</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">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">F-16</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">12345</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">}</span></span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Arrays.sort(arr,&nbsp;cmp);<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&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;arr.length;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(arr[i]);<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span>
<img src ="http://www.blogjava.net/sailor/aggbug/215381.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2008-07-17 09:48 <a href="http://www.blogjava.net/sailor/articles/215381.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>