<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[随风天涯]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[我的空间我做主……]]></description>
<link>http://hi.baidu.com/rover828</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[常用http状态码详解]]></title>
        <link><![CDATA[http://hi.baidu.com/rover828/blog/item/e0267f3179648f10eac4af44.html]]></link>
        <description><![CDATA[
		
		<p>完整的 HTTP 1.1规范说明书来自于RFC 2616，你可以在http://www.rfc-editor.org/在线查阅。HTTP 1.1的状态码被标记为新特性，因为许多浏览器只支持 HTTP 1.0。你应只把状态码发送给支持 HTTP 1.1的客户端，支持协议版本可以通过调用request.getRequestProtocol来检查。 <br>
<br>
本部分余下的内容会详细地介绍 HTTP 1.1中的状态码。这些状态码被分为五大类： <br>
<br>
100-199 用于指定客户端应相应的某些动作。 <br>
200-299 用于表示请求成功。 <br>
300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。 <br>
400-499 用于指出客户端的错误。 <br>
500-599 用于支持服务器错误。 <br>
<br>
HttpServletResponse中的常量代表关联不同标准消息的状态码。在servlet程序中，你会更多地用到这些常量的标识来使用状态码。例如：你一般会使用response.setStatus(response.SC_NO_CONTENT)而不是 response.setStatus(204)，因为后者不易理解而且容易导致错误。但是，你应当注意到服务器允许对消息轻微的改变，而客户端只注意状态码的数字值。所以服务器可能只返回 HTTP/1.1 200 而不是 HTTP/1.1 200 OK。 <br>
<br>
100 (Continue/继续)<br>
如果服务器收到头信息中带有100-continue的请求，这是指客户端询问是否可以在后续的请求中发送附件。在这种情况下，服务器用100(SC_CONTINUE)允许客户端继续或用417 (Expectation Failed)告诉客户端不同意接受附件。这个状态码是 HTTP 1.1中新加入的。 <br>
<br>
101 (Switching Protocols/转换协议)<br>
101 (SC_SWITCHING_PROTOCOLS)状态码是指服务器将按照其上的头信息变为一个不同的协议。这是 HTTP 1.1中新加入的。 <br>
<br>
200 (OK/正常)<br>
200 (SC_OK)的意思是一切正常。一般用于相应GET和POST请求。这个状态码对servlet是缺省的；如果没有调用setStatus方法的话，就会得到200。 <br>
<br>
201 (Created/已创建)<br>
201 (SC_CREATED)表示服务器在请求的响应中建立了新文档；应在定位头信息中给出它的URL。<br>
<br>
202 (Accepted/接受)<br>
202 (SC_ACCEPTED)告诉客户端请求正在被执行，但还没有处理完。 <br>
<br>
203 (Non-Authoritative Information/非官方信息)<br>
状态码203 (SC_NON_AUTHORITATIVE_INFORMATION)是表示文档被正常的返回，但是由于正在使用的是文档副本所以某些响应头信息可能不正确。这是 HTTP 1.1中新加入的。 <br>
<br>
204 (No Content/无内容)<br>
在并没有新文档的情况下，204 (SC_NO_CONTENT)确保浏览器继续显示先前的文档。这各状态码对于用户周期性的重载某一页非常有用，并且你可以确定先前的页面是否已经更新。例如，某个servlet可能作如下操作： <br>
int pageVersion =Integer.parseInt(request.getParameter(&quot;pageVersion&quot;));<br>
if (pageVersion &gt;;= currentVersion) {<br>
&nbsp;&nbsp;  response.setStatus(response.SC_NO_CONTENT);<br>
} else {<br>
&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  // Create regular page<br>
}<br>
但是，这种方法对通过刷新响应头信息或等价的HTML标记自动重载的页面起作用，因为它会返回一个204状态码停止以后的重载。但基于JavaScript脚本的自动重载在这种情况下仍然需要能够起作用。可以阅读本书7.2 ( HTTP 1.1 Response Headers and Their Meaning/HTTP 1.1响应头信息以及他们的意义)部分的详细讨论。 <br>
<br>
205 (Reset Content/重置内容)<br>
重置内容205 (SC_RESET_CONTENT)的意思是虽然没有新文档但浏览器要重置文档显示。这个状态码用于强迫浏览器清除表单域。这是 HTTP 1.1中新加入的。 <br>
<br>
206 (Partial Content/局部内容)<br>
206 (SC_PARTIAL_CONTENT)是在服务器完成了一个包含Range头信息的局部请求时被发送的。这是 HTTP 1.1中新加入的。 <br>
<br>
300 (Multiple Choices/多重选择)<br>
300 (SC_MULTIPLE_CHOICES)表示被请求的文档可以在多个地方找到，并将在返回的文档中列出来。如果服务器有首选设置，首选项将会被列于定位响应头信息中。 <br>
<br>
301 (Moved Permanently)<br>
301 (SC_MOVED_PERMANENTLY)状态是指所请求的文档在别的地方；文档新的URL会在定位响应头信息中给出。浏览器会自动连接到新的URL。 <br>
<br>
302 (Found/找到)<br>
与301有些类似，只是定位头信息中所给的URL应被理解为临时交换地址而不是永久的。注意：在 HTTP 1.0中，消息是临时移动(Moved Temporarily)的而不是被找到，因此HttpServletResponse中的常量是SC_MOVED_TEMPORARILY不是我们以为的SC_FOUND。 <br>
<br>
注意<br>
代表状态码302的常量是SC_MOVED_TEMPORARILY而不是SC_FOUND。 <br>
<br>
状态码302是非常有用的因为浏览器自动连接在定为响应头信息中给出的新URL。这非常有用，而且为此有一个专门的方法&mdash;&mdash;sendRedirect。使用response.sendRedirect(url)比调用response.setStatus(response.SC_MOVED_TEMPORARILY)和response.setHeader(&quot;Location&quot;, url)多几个好处。首先，response.sendRedirect(url)方法明显要简单和容易。第二，servlet自动建立一页保存这一连接以提供给那些不能自动转向的浏览器显示。最后，在servlet 2.2版本（J2EE中的版本）中，sendRedirect能够处理相对路径，自动转换为绝对路径。但是你只能在2.1版本中使用绝对路径。 <br>
<br>
如果你将用户转向到站点的另一页中，你要用 HttpServletResponse 中的 encodeURL 方法传送URL。这么做可预防不断使用基于URL重写的会话跟踪的情况。URL重写是一种在你的网站跟踪不使用 cookies 的用户的方法。这是通过在每一个URL尾部附加路径信息实现的，但是 servlet 会话跟踪API会自动的注意这些细节。会话跟踪在第九章讨论，并且养成使用 encodeURL 的习惯会使以后添加会话跟踪的功能更容易很多。 <br>
<br>
核心技巧<br>
如果你将用户转向到你的站点的其他页面，用 response.sendRedirect(response.encodeURL(url)) 的方式事先计划好会话跟踪(session tracking)要比只是调用 response.sendRedirect(url) 好的多。 <br>
<br>
这个状态码有时可以与301交换使用。例如，如果你错误的访问了http://host/~user（路径信息不完整），有些服务器就会回复301状态码而有些则回复302。从技术上说，如果最初的请求是GET浏览器只是被假定自动转向。如果想了解更多细节，请看状态码307的讨论。 <br>
<br>
303 (See Other/参见其他信息)<br>
这个状态码和 301、302 相似，只是如果最初的请求是 POST，那么新文档（在定位头信息中给出）药用 GET 找回。这个状态码是新加入 HTTP 1.1中的。 <br>
<br>
304 (Not Modified/为修正)<br>
当客户端有一个缓存的文档，通过提供一个 If-Modified-Since 头信息可指出客户端只希望文档在指定日期之后有所修改时才会重载此文档，用这种方式可以进行有条件的请求。304 (SC_NOT_MODIFIED)是指缓冲的版本已经被更新并且客户端应刷新文档。另外，服务器将返回请求的文档及状态码 200。servlet一般情况下不会直接设置这个状态码。它们会实现getLastModified方法并根据修正日期让默认服务方法处理有条件的请求。这个方法的例程已在2.8部分(An Example Using Servlet Initialization and Page Modification Dates/一个使用servlet初始化和页面修正日期的例子)给出。 <br>
<br>
305 (Use Proxy/使用代理)<br>
305 (SC_USE_PROXY)表示所请求的文档要通过定位头信息中的代理服务器获得。这个状态码是新加入 HTTP 1.1中的。 <br>
<br>
307 (Temporary Redirect/临时重定向)<br>
浏览器处理307状态的规则与302相同。307状态被加入到 HTTP 1.1中是由于许多浏览器在收到302响应时即使是原始消息为POST的情况下仍然执行了错误的转向。只有在收到303响应时才假定浏览器会在POST请求时重定向。添加这个新的状态码的目的很明确：在响应为303时按照GET和POST请求转向；而在307响应时则按照GET请求转向而不是POST请求。注意：由于某些原因在HttpServletResponse中还没有与这个状态对应的常量。该状态码是新加入HTTP 1.1中的。 <br>
<br>
注意<br>
在 HttpServletResponse 中没有 SC_TEMPORARY_REDIRECT 常量，所以你只能显示的使用307状态码。 <br>
<br>
400 (Bad Request/错误请求)<br>
400 (SC_BAD_REQUEST)指出客户端请求中的语法错误。 <br>
<br>
401 (Unauthorized/未授权)<br>
401 (SC_UNAUTHORIZED)表示客户端在授权头信息中没有有效的身份信息时访问受到密码保护的页面。这个响应必须包含一个WWW-Authenticate的授权信息头。例如，在本书4.5部分中的&ldquo;Restricting Access to Web Pages./限制访问Web页。&rdquo; <br>
<br>
403 (Forbidden/禁止)<br>
403 (SC_FORBIDDEN)的意思是除非拥有授权否则服务器拒绝提供所请求的资源。这个状态经常会由于服务器上的损坏文件或目录许可而引起。 <br>
<br>
404 (Not Found/未找到)<br>
404 (SC_NOT_FOUND)状态每个网络程序员可能都遇到过，他告诉客户端所给的地址无法找到任何资源。它是表示&ldquo;没有所访问页面&rdquo;的标准方式。这个状态码是常用的响应并且在HttpServletResponse类中有专门的方法实现它：sendError(&quot;message&quot;)。相对于setStatus使用sendError得好处是：服务器会自动生成一个错误页来显示错误信息。但是，Internet Explorer 5浏览器却默认忽略你发挥的错误页面并显示其自定义的错误提示页面，虽然微软这么做违反了 HTTP 规范。要关闭此功能，在工具菜单里，选择Internet选项，进入高级标签页，并确认&ldquo;显示友好的 HTTP 错误信息&rdquo;选项（在我的浏览器中是倒数第8各选项）没有被选。但是很少有用户知道此选项，因此这个特性被IE5隐藏了起来使用户无法看到你所返回给用户的信息。而其他主流浏览器及IE4都完全的显示服务器生成的错误提示页面。可以参考图6-3及6-4中的例子。 <br>
<br>
核心警告<br>
默认情况下，IE5忽略服务端生成的错误提示页面。 <br>
<br>
405 (Method Not Allowed/方法未允许)<br>
405 (SC_METHOD_NOT_ALLOWED)指出请求方法(GET, POST, HEAD, PUT, DELETE, 等)对某些特定的资源不允许使用。该状态码是新加入 HTTP 1.1中的。 <br>
<br>
406 (Not Acceptable/无法访问)<br>
406 (SC_NOT_ACCEPTABLE)表示请求资源的MIME类型与客户端中Accept头信息中指定的类型不一致。见本书7.2部分中的表7.1(HTTP 1.1 Response Headers and Their Meaning/HTTP 1.1响应头信息以及他们的意义)中对MIME类型的介绍。406是新加入 HTTP 1.1中的。 <br>
<br>
407 (Proxy Authentication Required/代理服务器认证要求)<br>
407 (SC_PROXY_AUTHENTICATION_REQUIRED)与401状态有些相似，只是这个状态用于代理服务器。该状态指出客户端必须通过代理服务器的认证。代理服务器返回一个Proxy-Authenticate响应头信息给客户端，这会引起客户端使用带有Proxy-Authorization请求的头信息重新连接。该状态码是新加入 HTTP 1.1中的。 <br>
<br>
408 (Request Timeout/请求超时)<br>
408 (SC_REQUEST_TIMEOUT)是指服务端等待客户端发送请求的时间过长。该状态码是新加入 HTTP 1.1中的。 <br>
<br>
409 (Conflict/冲突)<br>
该状态通常与PUT请求一同使用，409 (SC_CONFLICT)状态常被用于试图上传版本不正确的文件时。该状态码是新加入 HTTP 1.1中的。 <br>
<br>
410 (Gone/已经不存在)<br>
410 (SC_GONE)告诉客户端所请求的文档已经不存在并且没有更新的地址。410状态不同于404，410是在指导文档已被移走的情况下使用，而404则用于未知原因的无法访问。该状态码是新加入 HTTP 1.1中的。 <br>
<br>
411 (Length Required/需要数据长度)<br>
411 (SC_LENGTH_REQUIRED)表示服务器不能处理请求（假设为带有附件的POST请求），除非客户端发送Content-Length头信息指出发送给服务器的数据的大小。该状态是新加入 HTTP 1.1的。 <br>
<br>
412 (Precondition Failed/先决条件错误)<br>
412 (SC_PRECONDITION_FAILED)状态指出请求头信息中的某些先决条件是错误的。该状态是新加入 HTTP 1.1的。 <br>
<br>
413 (Request Entity Too Large/请求实体过大)<br>
413 (SC_REQUEST_ENTITY_TOO_LARGE)告诉客户端现在所请求的文档比服务器现在想要处理的要大。如果服务器认为能够过一段时间处理，则会包含一个Retry-After的响应头信息。该状态是新加入 HTTP 1.1的。 <br>
<br>
414 (Request URI Too Long/请求URI过长)<br>
414 (SC_REQUEST_URI_TOO_LONG)状态用于在URI过长的情况时。这里所指的&ldquo;URI&rdquo;是指URL中主机、域名及端口号之后的内容。例如：在URL--http://www.y2k-disaster.com:8080/we/look/silly/now/中URI是指/we/look/silly/now/。该状态是新加入 HTTP 1.1的。 <br>
<br>
415 (Unsupported Media Type/不支持的媒体格式)<br>
415 (SC_UNSUPPORTED_MEDIA_TYPE)意味着请求所带的附件的格式类型服务器不知道如何处理。该状态是新加入 HTTP 1.1的。 <br>
<br>
416 (Requested Range Not Satisfiable/请求范围无法满足)<br>
416表示客户端包含了一个服务器无法满足的Range头信息的请求。该状态是新加入 HTTP 1.1的。奇怪的是，在servlet 2.1版本API的HttpServletResponse中并没有相应的常量代表该状态。 <br>
<br>
注意<br>
在servlet 2.1的规范中，类HttpServletResponse并没有SC_REQUESTED_RANGE_NOT_SATISFIABLE 这样的常量，所以你只能直接使用416。在servlet 2.2版本之后都包含了此常量。 <br>
<br>
417 (Expectation Failed/期望失败)<br>
如果服务器得到一个带有100-continue值的Expect请求头信息，这是指客户端正在询问是否可以在后面的请求中发送附件。在这种情况下，服务器也会用该状态(417)告诉浏览器服务器不接收该附件或用100 (SC_CONTINUE)状态告诉客户端可以继续发送附件。该状态是新加入 HTTP 1.1的。 <br>
<br>
500 (Internal Server Error/内部服务器错误)<br>
500 (SC_INTERNAL_SERVER_ERROR) 是常用的&ldquo;服务器错误&rdquo;状态。该状态经常由CGI程序引起也可能（但愿不会如此！）由无法正常运行的或返回头信息格式不正确的servlet引起。 <br>
<br>
501 (Not Implemented/未实现)<br>
501 (SC_NOT_IMPLEMENTED)状态告诉客户端服务器不支持请求中要求的功能。例如，客户端执行了如PUT这样的服务器并不支持的命令。 <br>
<br>
502 (Bad Gateway/错误的网关)<br>
502 (SC_BAD_GATEWAY)被用于充当代理或网关的服务器；该状态指出接收服务器接收到远端服务器的错误响应。 <br>
<br>
503 (Service Unavailable/服务无法获得)<br>
状态码503 (SC_SERVICE_UNAVAILABLE)表示服务器由于在维护或已经超载而无法响应。例如，如果某些线程或数据库连接池已经没有空闲则servlet会返回这个头信息。服务器可提供一个Retry-After头信息告诉客户端什么时候可以在试一次。 <br>
<br>
504 (Gateway Timeout/网关超时)<br>
该状态也用于充当代理或网关的服务器；它指出接收服务器没有从远端服务器得到及时的响应。该状态是新加入 HTTP 1.1的。 <br>
<br>
505 (HTTP Version Not Supported/不支持的 HTTP 版本)<br>
505 (SC_HTTP_VERSION_NOT_SUPPORTED)状态码是说服务器并不支持在请求中所标明 HTTP 版本。该状态是新加入 HTTP 1.1的。</p> <a href="http://hi.baidu.com/rover828/blog/item/e0267f3179648f10eac4af44.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/rover828/blog/category/it%D7%CA%D4%B4">it资源</a>&nbsp;<a href="http://hi.baidu.com/rover828/blog/item/e0267f3179648f10eac4af44.html#comment">查看评论</a>]]></description>
        <pubDate>2009年07月05日 星期日  下午 01:34</pubDate>
        <category><![CDATA[it资源]]></category>
        <author><![CDATA[rover828]]></author>
		<guid>http://hi.baidu.com/rover828/blog/item/e0267f3179648f10eac4af44.html</guid>
</item>

<item>
        <title><![CDATA[Java数字、货币值和百分数等的格式化处理,以及JAVA四舍五入]]></title>
        <link><![CDATA[http://hi.baidu.com/rover828/blog/item/b8d3a9c33d4e605db219a809.html]]></link>
        <description><![CDATA[
		
		<p>java.text.NumberFormat 提供了货币值和百分数的格式化输出，比如0.58的百分数输出形式是58%。<br>
要获得本地的默认格式，可以用下列方法获得.</p>
<p>NumberFormat.getNumberInstance()<br>
NumberFormat.getCurrencyInstance()<br>
NumberFormat.getOPercentInstance()</p>
<p>而要获得某个国家或地区的具体格式，可以使用参数Local.XXX,如Locale.GERMANY，Locale.UK。</p>
<p>NumberFormat formatter = NumberFormat.getNumberInstance(Locale.GERMANY);</p>
<p>范例</p>
<p>import java.text.NumberFormat;<br>
import java.util.Locale;</p>
<p>public class FormatTest {</p>
<p>public static void main(String args[]) {</p>
<p>// 不使用格式化输出数<br>
double d = 10000.0 / 3.0;<br>
System.out.println(&quot;无格式化输出：&quot; + d);</p>
<p>// 使用本地默认格式输出数<br>
NumberFormat numberFormat = NumberFormat.getNumberInstance();<br>
//numberFormat.setMaximumFractionDigits(4);<br>
//numberFormat.setMinimumIntegerDigits(6);<br>
String numberString = numberFormat.format(d);<br>
System.out.println(&quot;本地默认格式输出数：&quot; + numberString);</p>
<p>// 使用本地默认格式输出货币值<br>
NumberFormat currencyFormat = NumberFormat.getCurrencyInstance();<br>
System.out.println(&quot;本地默认格式输出货币值：&quot; + currencyFormat.format(d));</p>
<p>// 使用本地默认格式输出百分数<br>
NumberFormat percentFormat = NumberFormat.getPercentInstance();<br>
System.out.println(&quot;本地默认格式输出百分数：&quot; + percentFormat.format(d));</p>
<p>// 在不同的国家和地区数字表示的格式也有区别。如德国<br>
// 使用德国的格式化输出数<br>
NumberFormat numberFormatG = NumberFormat<br>
.getNumberInstance(Locale.GERMANY);<br>
System.out.println(&quot;德国数字输出形式：&quot; + numberFormatG.format(d));</p>
<p>// 使用德国货币输出形式<br>
NumberFormat currencyFormatG = NumberFormat<br>
.getCurrencyInstance(Locale.GERMANY);<br>
System.out.println(&quot;德国货币输出形式：&quot; + currencyFormatG.format(d));</p>
<p>// 使用美国货币输出形式<br>
NumberFormat currencyFormatA = NumberFormat<br>
.getCurrencyInstance(Locale.US);<br>
System.out.println(&quot;美国货币输出形式：&quot; + currencyFormatA.format(d));</p>
<p>// 使用德国百分数输出形式<br>
NumberFormat percentFormatG = NumberFormat<br>
.getPercentInstance(Locale.GERMANY);<br>
System.out.println(&quot;德国百分数输出形式：&quot; + percentFormatG.format(d));</p>
<p>System.exit(0);<br>
}<br>
}</p>
<p>由于欧元符号无法在此Console输出，所以显示？</p>
<p>可以指定显示的最多（或最少）整数位和小数位。如</p>
<p>double d = 10000.0 / 3.0;<br>
NumberFormat numberFormat = NumberFormat.getNumberInstance();<br>
numberFormat.setMaximumFractionDigits(4);<br>
numberFormat.setMinimumIntegerDigits(6);<br>
String numberString = numberFormat.format(d);<br>
System.out.println(numberString);</p>
<p>输出：<br>
003,333.3333。整数位不够的补零，小数截去部分四舍五入。</p>
<p>也可以利用NumberFormat的一个子类DecimalFormat来指定输出格式。</p>
<p><br>
DecimalFormat decimalFormat = new DecimalFormat(&quot;######.0000&quot;);<br>
String s = decimalFormat.format(d);<br>
和前面一样，显示六个整数位和4个小数位。<br>
下面对格式化的数字进行解析。</p>
<p>import java.util.Locale;<br>
import java.text.NumberFormat;<br>
import java.text.ParseException;</p>
<p>public class ParseFormat {</p>
<p>public static void main(String args[]) {</p>
<p>// 本地格式的解析<br>
NumberFormat numberFormat1 = NumberFormat.getNumberInstance();<br>
Number numb1 = null;<br>
try {<br>
numb1 = numberFormat1.parse(&quot;33,333.33&quot;);<br>
} catch (ParseException e1) {<br>
System.err.println(e1);<br>
}<br>
System.out.println(numb1);</p>
<p><br>
// 以德国格式解析<br>
NumberFormat numberFormat2 = NumberFormat<br>
.getNumberInstance(Locale.GERMAN);<br>
Number numb2 = null;<br>
try {<br>
numb2 = numberFormat2.parse(&quot;33,333.33&quot;);<br>
} catch (ParseException e2) {<br>
System.err.println(e2);<br>
}<br>
System.out.println(numb2);</p>
<p>System.exit(0);<br>
}<br>
}</p>
<p><br>
程序输出：<br>
33333.33<br>
33.333</p>
<p>===========================保留两个小数位===================================</p>
<p>如下，保留两个小数位&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;  double&nbsp;&nbsp;&nbsp;&nbsp;  f&nbsp;&nbsp;&nbsp;&nbsp;  =&nbsp;&nbsp;&nbsp;&nbsp;  34.232323;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;  BigDecimal&nbsp;&nbsp;&nbsp;&nbsp;  b&nbsp;&nbsp;&nbsp;&nbsp;  =&nbsp;&nbsp;&nbsp;  new&nbsp;&nbsp;&nbsp;&nbsp;  BigDecimal(f);&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;  double&nbsp;&nbsp;&nbsp;&nbsp;  f1&nbsp;&nbsp;&nbsp;&nbsp;  =&nbsp;&nbsp;&nbsp;&nbsp;  b.setScale(2,&nbsp;&nbsp; BigDecimal.ROUND_HALF_UP).doubleValue();&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;  //&nbsp;&nbsp;&nbsp;&nbsp;  b.setScale(2, BigDecimal.ROUND_HALF_UP)&nbsp;&nbsp;&nbsp;&nbsp;  表明四舍五入，保留两位小数&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;  上面是对double类型的处理，如果对float的，则将上面所有的double字段换成float就行</p> <a href="http://hi.baidu.com/rover828/blog/item/b8d3a9c33d4e605db219a809.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/rover828/blog/category/Java">Java</a>&nbsp;<a href="http://hi.baidu.com/rover828/blog/item/b8d3a9c33d4e605db219a809.html#comment">查看评论</a>]]></description>
        <pubDate>2009年04月13日 星期一  下午 06:41</pubDate>
        <category><![CDATA[Java]]></category>
        <author><![CDATA[rover828]]></author>
		<guid>http://hi.baidu.com/rover828/blog/item/b8d3a9c33d4e605db219a809.html</guid>
</item>

<item>
        <title><![CDATA[String.split()用法的一点经验]]></title>
        <link><![CDATA[http://hi.baidu.com/rover828/blog/item/a6c1be99dbde2c006f068ca9.html]]></link>
        <description><![CDATA[
		
		在java.lang包中有String.split()方法，返回是一个数组<br>
我在应用中用到一些，给大家总结一下，仅供大家参考：<br>
1、如果用&ldquo;.&rdquo;作为分隔的话，必须是如下写法：String.split(&quot;\\.&quot;),这样才能正确的分隔开，不能用String.split(&quot;.&quot;);<br>
2、如果用&ldquo;|&rdquo;作为分隔的话，必须是如下写法：String.split(&quot;\\|&quot;),这样才能正确的分隔开，不能用String.split(&quot;|&quot;);<br>
&ldquo;.&rdquo;和&ldquo;|&rdquo;都是转义字符，必须得加&quot;\\&quot;;<br>
3、如果在一个字符串中有多个分隔符，可以用&ldquo;|&rdquo;作为连字符，比如：&ldquo;acount=? and uu =? or n=?&rdquo;,把三个都分隔出来，可以用String.split(&quot;and|or&quot;); <a href="http://hi.baidu.com/rover828/blog/item/a6c1be99dbde2c006f068ca9.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/rover828/blog/category/Java">Java</a>&nbsp;<a href="http://hi.baidu.com/rover828/blog/item/a6c1be99dbde2c006f068ca9.html#comment">查看评论</a>]]></description>
        <pubDate>2009年04月09日 星期四  下午 07:20</pubDate>
        <category><![CDATA[Java]]></category>
        <author><![CDATA[rover828]]></author>
		<guid>http://hi.baidu.com/rover828/blog/item/a6c1be99dbde2c006f068ca9.html</guid>
</item>

<item>
        <title><![CDATA[eclipse中改变velocity中js的显示颜色]]></title>
        <link><![CDATA[http://hi.baidu.com/rover828/blog/item/c871a2c25abfb2130ff477ea.html]]></link>
        <description><![CDATA[
		
		<p> </p>
<p> </p>
<p><img src="file:///C:/soft/Alisoft/WangWang/profiles/cntaobao屈原/temp/%7B5547A73A-82DD-425A-81EF-F2E9738BB944%7D.jpg"></p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/rover828/blog/category/Java">Java</a>&nbsp;<a href="http://hi.baidu.com/rover828/blog/item/c871a2c25abfb2130ff477ea.html#comment">查看评论</a>]]></description>
        <pubDate>2009年04月09日 星期四  下午 05:23</pubDate>
        <category><![CDATA[Java]]></category>
        <author><![CDATA[rover828]]></author>
		<guid>http://hi.baidu.com/rover828/blog/item/c871a2c25abfb2130ff477ea.html</guid>
</item>

<item>
        <title><![CDATA[设计模式之Factory]]></title>
        <link><![CDATA[http://hi.baidu.com/rover828/blog/item/e736fb1f0aa78902314e15e4.html]]></link>
        <description><![CDATA[
		
		<p><strong><em>工厂模式定义<span>:提供创建对象的接口.</span></em></strong></p>
<p><strong><em>为何使用<span>?</span></em></strong><span><br>
工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式，工厂模式在Java程序系统可以说是随处可见。</span></p>
<p>为什么工厂模式是如此常用？因为工厂模式就相当于创建实例对象的<span>new，我们经常要根据类Class生成实例对象，如A a=new A() 工厂模式也是用来创建实例对象的，所以以后new时就要多个心眼，是否可以考虑实用工厂模式，虽然这样做，可能多做一些工作，但会给你系统带来更大的可扩展性和尽量少的修改量。</span></p>
<p>我们以类<span>Sample为例， 如果我们要创建Sample的实例对象:</span></p>
<p><span>Sample sample=new Sample();</span></p>
<p>可是，实际情况是，通常我们都要在创建<span>sample实例时做点初始化的工作,比如赋值 查询数据库等。</span></p>
<p>首先，我们想到的是，可以使用<span>Sample的构造函数，这样生成实例就写成:</span></p>
<p><span>Sample sample=new Sample(参数);</span></p>
<p>但是，如果创建<span>sample实例时所做的初始化工作不是象赋值这样简单的事，可能是很长一段代码，如果也写入构造函数中，那你的代码很难看了（就需要Refactor重整）。</span></p>
<p>为什么说代码很难看，初学者可能没有这种感觉，我们分析如下，初始化工作如果是很长一段代码，说明要做的工作很多，将很多工作装入一个方法中，相当于将很多鸡蛋放在一个篮子里，是很危险的，这也是有背于<span>Java面向对象的原则，面向对象的封装(Encapsulation)和分派(Delegation)告诉我们，尽量将长的代码分派&ldquo;切割&rdquo;成每段，将每段再&ldquo;封装&rdquo;起来(减少段和段之间偶合联系性)，这样，就会将风险分散，以后如果需要修改，只要更改每段，不会再发生牵一动百的事情。</span></p>
<p>在本例中，首先，我们需要将创建实例的工作与使用实例的工作分开<span>, 也就是说，让创建实例所需要的大量初始化工作从Sample的构造函数中分离出去。</span></p>
<p>这时我们就需要<span>Factory工厂模式来生成对象了，不能再用上面简单new Sample(参数)。</span>还有<span>,如果Sample有个继承如MySample, 按照面向接口编程,我们需要将Sample抽象成一个接口.</span>现在<span>Sample是接口,有两个子类MySample 和HisSample .我们要实例化他们时,如下:</span></p>
<p><span>Sample mysample=new MySample();<br>
Sample hissample=new HisSample();</span></p>
<p>随着项目的深入<span>,Sample可能还会&quot;生出很多儿子出来&quot;, 那么我们要对这些儿子一个个实例化,更糟糕的是,可能还要对以前的代码进行修改:加入后来生出儿子的实例.这在传统程序中是无法避免的.</span></p>
<p>但如果你一开始就有意识使用了工厂模式<span>,这些麻烦就没有了.</span></p>
<p><strong>工厂方法<br>
</strong>你会建立一个专门生产<span>Sample实例的工厂:</span></p>
<table style="width: 80%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="80%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; background: #cccccc; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p><span>public class Factory{</span></p>
            <p>　　<span>public static Sample creator(int which){</span></p>
            <p>　　//getClass <span>产生Sample 一般可使用动态类装载装入类。<br>
            　　if (which==1)<br>
            　　　　return new SampleA();<br>
            　　else if (which==2)<br>
            　　　　return new SampleB();</span></p>
            <p>　　<span>}</span></p>
            <p><span>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>那么在你的程序中<span>,如果要实例化Sample时.就使用</span></p>
<p><span>Sample sampleA=Factory.creator(1);</span></p>
<p>这样<span>,在整个就不涉及到Sample的具体子类,达到封装效果,也就减少错误修改的机会,这个原理可以用很通俗的话来比喻:就是具体事情做得越多,越容易范错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,范错误可能性就越少.好象我们从编程序中也能悟出人生道理?呵呵.</span></p>
<p>使用工厂方法 要注意几个角色，首先你要定义产品接口，如上面的Sample,产品接口下有Sample接口的实现类,如SampleA,其次要有一个factory类，用来生成产品Sample，如下图，最右边是生产的对象Sample：</p>
<div forimg="1"><a target="_blank" href="http://hiphotos.baidu.com/rover828/pic/item/08f5bf1286f2f3efc2fd7870.jpg">
<div forimg="1" align="center"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/rover828/pic/item/2add0ad77e33a7fca044df73.jpg"></div>
</a></div>
<p>进一步稍微复杂一点，就是在工厂类上进行拓展，工厂类也有继承它的实现类concreteFactory了<strong><em>。</em></strong></p>
<p><span><strong>抽象工厂</strong><br>
工厂模式中有: 工厂方法(Factory Method) 抽象工厂(Abstract Factory).</span></p>
<p style="margin-bottom: 12pt"><span>这两个模式区别在于需要创建对象的复杂程度上。如果我们创建对象的方法变得复杂了,如上面工厂方法中是创建一个对象Sample,如果我们还有新的产品接口Sample2.</span></p>
<p style="margin-bottom: 12pt">这里假设：Sample有两个concrete类SampleA和SamleB，而Sample2也有两个concrete类Sample2A和SampleB2</p>
<p style="margin-bottom: 12pt"><span>那么，我们就将上例中Factory变成抽象类,将共同部分封装在抽象类中,不同部分使用子类实现，下面就是将上例中的Factory拓展成抽象工厂:</span></p>
<table style="width: 80%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; background: #cccccc; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p><span>public abstract class Factory{</span></p>
            <p>　　<span>public abstract Sample creator();</span></p>
            <p>　　<span>public abstract Sample2 creator(String name); </span></p>
            <p><span>}</span></p>
            <p><span>public class SimpleFactory extends Factory{</span></p>
            <p>　　<span>public Sample creator(){<br>
            　　　　.........<br>
            　　　　return new SampleA</span><span><br>
            　　}</span></p>
            <p>　　<span>public Sample2 creator(String name){<br>
            　　　　.........<br>
            　　　　return new Sample2A</span><span><br>
            　　}</span></p>
            <p><span>}</span></p>
            <p><span>public class BombFactory extends Factory{</span></p>
            <p>　　<span>public Sample creator(){<br>
            　　　　......<br>
            　　　　return new SampleB</span><span> <br>
            　　}</span></p>
            <p>　　<span>public Sample2 creator(String name){<br>
            　　　　......<br>
            　　　　return new Sample2B<br>
            　　}</span></p>
            <p><span>}</span></p>
            <p><span> </span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span>从上面看到两个工厂各自生产出一套Sample和Sample2,也许你会疑问，为什么我不可以使用两个工厂方法来分别生产Sample和Sample2? </span></p>
<p><span>抽象工厂还有另外一个关键要点，是因为 SimpleFactory内，生产Sample和生产Sample2的方法之间有一定联系，所以才要将这两个方法捆绑在一个类中，这个工厂类有其本身特征，也许制造过程是统一的，比如：制造工艺比较简单，所以名称叫SimpleFactory。</span><span><br>
</span></p>
<p>在实际应用中，工厂方法用得比较多一些，而且是和动态类装入器组合在一起应用。</p>
<p><span><strong>举例</strong> </span></p>
<p>我们以<span>Jive的ForumFactory为例，这个例子在前面的Singleton模式中我们讨论过，现在再讨论其工厂模式:</span></p>
<table style="width: 97%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="97%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; background: #cccccc; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p><span>public abstract class ForumFactory {</span></p>
            <p>　　<span>private static Object initLock = new Object();<br>
            　　private static String className = &quot;com.jivesoftware.forum.database.DbForumFactory&quot;;<br>
            　　private static ForumFactory factory = null; </span></p>
            <p>　　<span>public static ForumFactory getInstance(Authorization authorization) {<br>
            　　　　//If no valid authorization passed in, return null.<br>
            　　　　if (authorization == null) {<br>
            　　　　　　return null;<br>
            　　　　}<br>
            　　　　//以下使用了Singleton 单态模式<br>
            　　　　if (factory == null) {<br>
            　　　　　　synchronized(initLock) {<br>
            　　　　　　　　if (factory == null) {<br>
            　　　　　　　　　　　　...... </span></p>
            <p>　　　　　　　　　　<span>try {<br>
            　　　　　　　　　　　　　　//动态转载类<br>
            　　　　　　　　　　　　　　Class c = Class.forName(className);<br>
            　　　　　　　　　　　　　　factory = (ForumFactory)c.newInstance();<br>
            　　　　　　　　　　}<br>
            　　　　　　　　　　catch (Exception e) {<br>
            　　　　　　　　　　　　　　return null;<br>
            　　　　　　　　　　}<br>
            　　　　　　　　}<br>
            　　　　　　}<br>
            　　　　}</span></p>
            <p>　　　　<span>//Now, 返回 proxy.用来限制授权对forum的访问<br>
            　　　　return new ForumFactoryProxy(authorization, factory,<br>
            　　　　　　　　　　　　　　　　　　　　factory.getPermissions(authorization));<br>
            　　}</span></p>
            <p>　　<span>//真正创建forum的方法由继承forumfactory的子类去完成.<br>
            　　public abstract Forum createForum(String name, String description)<br>
            　　throws UnauthorizedException, ForumAlreadyExistsException;</span></p>
            <p>　　<span>....</span></p>
            <p><span>}</span></p>
            <p><span> </span></p>
            <p><span> </span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>因为现在的<span>Jive是通过数据库系统存放论坛帖子等内容数据,如果希望更改为通过文件系统实现,这个工厂方法ForumFactory就提供了提供动态接口:</span></p>
<p><span>private static String className = &quot;com.jivesoftware.forum.database.DbForumFactory&quot;;</span></p>
<p>你可以使用自己开发的创建<span>forum的方法代替com.jivesoftware.forum.database.DbForumFactory就可以.</span></p>
<p>在上面的一段代码中一共用了三种模式<span>,除了工厂模式外,还有Singleton单态模式,以及proxy模式,proxy模式主要用来授权用户对forum的访问,因为访问forum有两种人:一个是注册用户 一个是游客guest,那么那么相应的权限就不一样,而且这个权限是贯穿整个系统的,因此建立一个proxy,类似网关的概念,可以很好的达到这个效果.  </span></p>
<p>看看<span>Java宠物店中的CatalogDAOFactory:</span></p>
<table cellspacing="0" cellpadding="0" width="100%" bgcolor="#cccccc" border="0">
    <tbody>
        <tr>
            <td>public class CatalogDAOFactory {
            <p> </p>
            <p>　　/**</p>
            <p>　　* 本方法制定一个特别的子类来实现DAO模式。<br>
            　　* 具体子类定义是在J2EE的部署描述器中。<br>
            　　*/</p>
            <p>　　public static CatalogDAO getDAO() throws CatalogDAOSysException {</p>
            <p>　　　　CatalogDAO catDao = null;</p>
            <p>　　　　try {</p>
            <p>　　　　　　InitialContext ic = new InitialContext();<br>
            　　　　　　//动态装入CATALOG_DAO_CLASS<br>
            　　　　　　//可以定义自己的CATALOG_DAO_CLASS，从而在无需变更太多代码<br>
            　　　　　　//的前提下，完成系统的巨大变更。</p>
            <p>　　　　　　String className =(String) ic.lookup(JNDINames.CATALOG_DAO_CLASS);</p>
            <p>　　　　　　catDao = (CatalogDAO) Class.forName(className).newInstance();</p>
            <p>　　　　} catch (NamingException ne) {</p>
            <p>　　　　　　throw new CatalogDAOSysException(&quot;<br>
            　　　　　　　　CatalogDAOFactory.getDAO: NamingException while <br>
            　　　　　　　　　　getting DAO type : \n&quot; + ne.getMessage());</p>
            <p>　　　　} catch (Exception se) {</p>
            <p>　　　　　　throw new CatalogDAOSysException(&quot;<br>
            　　　　　　　　CatalogDAOFactory.getDAO: Exception while getting <br>
            　　　　　　　　　　DAO type : \n&quot; + se.getMessage());</p>
            <p>　　　　}</p>
            <p>　　　　return catDao;</p>
            <p>　　}</p>
            <p>}</p>
            </td>
        </tr>
    </tbody>
</table>
<p> </p>
<p><span>CatalogDAOFactory是典型的工厂方法，catDao是通过动态类装入器className获得CatalogDAOFactory具体实现子类，这个实现子类在Java宠物店是用来操作catalog数据库，用户可以根据数据库的类型不同，定制自己的具体实现子类，将自己的子类名给与CATALOG_DAO_CLASS变量就可以。</span></p>
<p>由此可见，工厂方法确实为系统结构提供了非常灵活强大的动态扩展机制，只要我们更换一下具体的工厂方法，系统其他地方无需一点变换，就有可能将系统功能进行改头换面的变化。</p> <a href="http://hi.baidu.com/rover828/blog/item/e736fb1f0aa78902314e15e4.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/rover828/blog/category/Java">Java</a>&nbsp;<a href="http://hi.baidu.com/rover828/blog/item/e736fb1f0aa78902314e15e4.html#comment">查看评论</a>]]></description>
        <pubDate>2009年03月12日 星期四  下午 08:14</pubDate>
        <category><![CDATA[Java]]></category>
        <author><![CDATA[rover828]]></author>
		<guid>http://hi.baidu.com/rover828/blog/item/e736fb1f0aa78902314e15e4.html</guid>
</item>

<item>
        <title><![CDATA[简单工厂模式及实例]]></title>
        <link><![CDATA[http://hi.baidu.com/rover828/blog/item/9e2da1869b86613666096e1a.html]]></link>
        <description><![CDATA[
		
		<p>本文转自<a href="http://www.cnblogs.com/zzj-46000452/archive/2006/09/16/506286.html">http://www.cnblogs.com/zzj-46000452/archive/2006/09/16/506286.html</a> 工大后院版权所有</p>
<p><strong><font size="5">前言<br>
</font></strong>工大有许多同学是做java的，大家都知道java最大的优点是它的完全OO化和它在多年的发展过程中吸收和总结了许多先进的框架与模式，其中工厂模式就是最常用的模式之一。下面我想将我在学习和实践过程中对工厂模式的认识与了解介绍给大家。由于笔者能力限制，在实践中也没参与过什么大的项目，笔者参与过的项目用到的工厂模式主要是简单工厂模式（Simple Factory）和工厂方法模式（Factory Method），所以笔者在本文主要介绍的是这两种模式。<br>
<br>
<br>
<br>
<font size="5"><strong>准备知识</strong></font><br>
在OO设计领域，我们知道前人总结了不少的经验，许多的经验在现代软件工程过程中已经被认为是原则来遵守。下面笔者摘抄几项下文涉及到的OO原则的定义。<br>
<br>
OCP（开闭原则，Open-Closed Principle）：一个软件的实体应当对扩展开放，对修改关闭。我的理解是，对于一个已有的软件，如果需要扩展，应当在不需修改已有代码的基础上进行。<br>
<br>
DIP（依赖倒转原则，Dependence Inversion Principle）：要针对接口编程，不要针对实现编程。我的理解是，对于不同层次的编程，高层次暴露给低层次的应当只是接口，而不是它的具体类。<br>
<br>
LoD（迪米特法则，Law of Demeter）：只与你直接的朋友通信，而避免和陌生人通信。众所周知类（或模块）之间的通信越少，耦合度就越低，从而更有利于我们对软件的宏观管理。老子论&ldquo;圣人之治&rdquo;有相同的思想，《老子》云：&ldquo;是以圣人之治，虚其心，实其腹，弱其志，常使民无知无欲。&rdquo;，又云：&ldquo;小国寡民，邻国相望，鸡犬之声相闻，民至老死，不相往来。&rdquo;。佩服我们的老祖宗，N千年前就想到了西方N千年后才想到的东西，同时也佩服《java与模式》的作者阎宏，可以用中国传统哲学思想这么生动的说明这一软件设计原则。<br>
<br>
<br>
<br>
<font size="5"><strong>简单工厂模式及实例</strong></font><br>
简单工厂模式又叫静态工厂模式，顾名思义，它是用来实例化目标类的静态类。下面我主要通过一个简单的实例说明简单工厂及其优点。<br>
<br>
比如有个国家的运动员协会，他们是负责登记与注册职业运动员的（就好像我们国家的体育总局，呵呵，无论足球篮球还是乒乓球的运动员都必须在这里注册才能拿到我们国家职业运动员牌照）。一家体育俱乐部（比如篮球的广东宏远，足球的深圳健力宝）想获得球员为自己俱乐部效力，就必须通过这个运动员协会。<br>
<br>
根据DIP我们可以设计一个&ldquo;运动员&rdquo;接口，&ldquo;足球运动员&rdquo;和&ldquo;篮球运动员&rdquo;（还有其他运动员）都实现&ldquo;运动员&rdquo;这个接口。而&ldquo;运动员协会&rdquo;就是一个简单工厂类，它负责实例化&ldquo;运动员&rdquo;。我们这里的&ldquo;俱乐部&rdquo;就是一个客户端（Client），不同的&ldquo;俱乐部&rdquo;就是不同的客户端。具体如下图表示：</p>
<center><br>
<img src="http://www.ood.com.cn/wool/photo/200510182130280.jpg" border="0"></center>
<p><br>
<br>
对于不同的俱乐部对象（无论是八一还是深圳健力宝），他们都是面向&ldquo;运动员&rdquo;接口编程，而不用管是&ldquo;足球运动员&rdquo;还是&ldquo;篮球运动员&rdquo;，也就是说实现了&ldquo;运动员&rdquo;接口的具体类&ldquo;足球运动员&rdquo;无需暴露给客户端。这也满足了DIP。但具体的俱乐部（比如足球的深圳健力宝）如何确保自己获取的是自己想要的运动员（健力宝俱乐部需要的当然是足球运动员）呢？这就需要&ldquo;运动员协会&rdquo;这一工厂类了。俱乐部通过调用&ldquo;运动员协会&rdquo;的具体方法，返回不同的实例。这同时也满足了LoD，也就是&ldquo;深圳健力宝足球俱乐部&rdquo;对象不直接与&ldquo;足球运动员：李毅&rdquo;对象通信，而是通过他们共同的&ldquo;朋友&rdquo;&mdash;&mdash;&ldquo;国家体育总局&rdquo;通信。<br>
<br>
下面给出各个类的程序，会有助于读者更好的了解笔者之前的介绍。</p>
<center>
<table cellspacing="0" cellpadding="0" width="90%" border="0">
    <tbody>
        <tr>
            <td class="smalltxt">&nbsp;&nbsp; Code:</td>
            <td align="right"><a class="smalltxt" href="http://www.gdutbbs.com/viewthread.php?tid=54203#"><font color="#000000" size="2">[Copy to clipboard]</font></a>&nbsp;&nbsp;</td>
        </tr>
        <tr>
            <td colspan="2">
            <table cellspacing="1" cellpadding="10" width="100%" bgcolor="#dddddd" border="0">
                <tbody>
                    <tr>
                        <td style="word-break: break-all" width="100%" bgcolor="#fbfbfb">运动员.java<br>
                        public interface 运动员 {        <br>
                                public void 跑();<br>
                                public void 跳();<br>
                        }<br>
                        <br>
                        足球运动员.java<br>
                        public class 足球运动员 implements 运动员 {<br>
                        <br>
                                public void 跑(){<br>
                                        //跑啊跑<br>
                                }<br>
                                <br>
                                public void 跳(){<br>
                                        //跳啊跳<br>
                                }<br>
                        }<br>
                        <br>
                        篮球运动员.java<br>
                        public class 篮球运动员 implements 运动员 {<br>
                        <br>
                                public void 跑(){<br>
                                        //do nothing<br>
                                }<br>
                                <br>
                                public void 跳(){<br>
                                        //do nothing<br>
                                }<br>
                        }<br>
                        <br>
                        体育协会.java<br>
                        public class 体育协会 {<br>
                                <br>
                                public static 运动员 注册足球运动员(){<br>
                                        return new 足球运动员();<br>
                                }<br>
                                <br>
                                public static 运动员 注册篮球运动员(){<br>
                                        return new 篮球运动员();<br>
                                }<br>
                        <br>
                        }<br>
                        <br>
                        俱乐部.java<br>
                        public class 俱乐部 {<br>
                                private 运动员 守门员;<br>
                                private 运动员 后卫;<br>
                                private 运动员 前锋;<br>
                        <br>
                                public void test() {<br>
                                        this.前锋 = 体育协会.注册足球运动员();<br>
                                        this.后卫 = 体育协会.注册足球运动员();<br>
                                        this.守门员 = 体育协会.注册足球运动员();<br>
                                        <br>
                                        守门员.跑();<br>
                                        后卫.跳();<br>
                                }<br>
                        }</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
</center>
<p><br>
以上就是简单工厂模式的一个简单实例，读者应该想象不用接口不用工厂而把具体类暴露给客户端的那种混乱情形吧（就好像没了体育总局，各个俱乐部在市场上自己胡乱的寻找仔细需要的运动员），简单工厂就解决了这种混乱。<br>
<br>
我们用OCP看看简单工厂，会发现如果要对系统进行扩展的话治需要增加实现产品接口的产品类（上例表现为&ldquo;足球运动员&rdquo;，&ldquo;篮球运动员&rdquo;类，比如要增加个&ldquo;乒乓球运动员&rdquo;类），而无需对原有的产品类进行修改。这咋一看好像满足OCP，但是实际上还是需要修改代码的&mdash;&mdash;对，就是修改工厂类。上例中如果增加&ldquo;乒乓球运动员&rdquo;产品类，就必须相应的修改&ldquo;体育协会&rdquo;工厂类，增加个&ldquo;注册乒乓球运动员&rdquo;方法。所以可以看出，简单工厂模式是不满足OCP的。<br>
<br>
<br>
<br>
<font size="5"><strong>工厂方法模式及其实例</strong></font><br>
谈了简单工厂模式，下面继续谈谈工厂方法模式。前一节的最末点明了简单工厂模式最大的缺点&mdash;&mdash;不完全满足OCP。为了解决这一缺点，设计师们提出了工厂方法模式。工厂方法模式和简单工厂模式最大的不同在于，简单工厂模式只有一个（对于一个项目或者一个独立模块而言）工厂类，而工厂方法模式有一组实现了相同接口的工厂类。下面我们通过修改上一节的实例来介绍工厂方法模式。<br>
<br>
我们在不改变产品类（&ldquo;足球运动员&rdquo;类和&ldquo;篮球运动员&rdquo;类）的情况下，修改下工厂类的结构，如下图所示：</p>
<center><br>
<img src="http://www.ood.com.cn/wool/photo/2005101922260.jpg" border="0"></center>
<p><br>
<br>
相关代码如下：</p>
<center>
<table cellspacing="0" cellpadding="0" width="90%" border="0">
    <tbody>
        <tr>
            <td class="smalltxt">&nbsp;&nbsp; Code:</td>
            <td align="right"><a class="smalltxt" href="http://www.gdutbbs.com/viewthread.php?tid=54203#"><font color="#000000" size="2">[Copy to clipboard]</font></a>&nbsp;&nbsp;</td>
        </tr>
        <tr>
            <td colspan="2">
            <table cellspacing="1" cellpadding="10" width="100%" bgcolor="#dddddd" border="0">
                <tbody>
                    <tr>
                        <td style="word-break: break-all" width="100%" bgcolor="#fbfbfb">运动员.java<br>
                        public interface 运动员 {        <br>
                                public void 跑();<br>
                                public void 跳();<br>
                        }<br>
                        <br>
                        足球运动员.java<br>
                        public class 足球运动员 implements 运动员 {<br>
                        <br>
                                public void 跑(){<br>
                                        //跑啊跑<br>
                                }<br>
                                <br>
                                public void 跳(){<br>
                                        //跳啊跳<br>
                                }<br>
                        }<br>
                        <br>
                        篮球运动员.java<br>
                        public class 篮球运动员 implements 运动员 {<br>
                        <br>
                                public void 跑(){<br>
                                        //do nothing<br>
                                }<br>
                                <br>
                                public void 跳(){<br>
                                        //do nothing<br>
                                }<br>
                        }<br>
                        <br>
                        体育协会.java<br>
                        public interface 体育协会 {<br>
                                public 运动员 注册();<br>
                        }<br>
                        <br>
                        足球协会.java<br>
                        public class 足球协会 implements 体育协会 {<br>
                                public 运动员 注册(){<br>
                                        return new 足球运动员();<br>
                                }<br>
                        }<br>
                        <br>
                        篮球协会.java<br>
                        public class 篮球协会 implements 体育协会 {<br>
                                public 运动员 注册(){<br>
                                        return new 篮球运动员();<br>
                                }<br>
                        }<br>
                        <br>
                        俱乐部.java<br>
                        public class 俱乐部 {<br>
                                private 运动员 守门员;<br>
                                private 运动员 后卫;<br>
                                private 运动员 前锋;<br>
                        <br>
                                public void test() {<br>
                                        体育协会 中国足协 = new 足球协会();<br>
                                        <br>
                                        this.前锋 = 中国足协.注册();<br>
                                        this.后卫 = 中国足协.注册();<br>
                        <br>
                                        守门员.跑();<br>
                                        后卫.跳();<br>
                                }<br>
                        }</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
</center>
<p><br>
很明显可以看到，&ldquo;体育协会&rdquo;工厂类变成了&ldquo;体育协会&rdquo;接口，而实现此接口的分别是&ldquo;足球协会&rdquo;&ldquo;篮球协会&rdquo;等等具体的工厂类。<br>
<br>
这样做有什么好处呢？很明显，这样做就完全OCP了。如果需要再加入（或扩展）产品类（比如加多个&ldquo;乒乓球运动员&rdquo;）的话就不再需要修改工厂类了，而只需相应的再添加一个实现了工厂接口（&ldquo;体育协会&rdquo;接口）的具体工厂类。<br>
<br>
<br>
<br>
<font size="5"><strong>简单工厂模式与工厂方法模式大PK</strong></font><br>
从以上对两种模式的介绍可以了解到，工厂方法模式是为了克服简单工厂模式的缺点（主要是为了满足OCP）而设计出来的。但是，工厂方法模式就一定比简单工厂模式好呢？笔者的答案是不一定。下面笔者将详细比较两种模式。<br>
<br>
<strong>1. 结构复杂度</strong><br>
从这个角度比较，显然简单工厂模式要占优。简单工厂模式只需一个工厂类，而工厂方法模式的工厂类随着产品类个数增加而增加，这无疑会使类的个数越来越多，从而增加了结构的复杂程度。<br>
<br>
<strong>2.代码复杂度</strong><br>
代码复杂度和结构复杂度是一对矛盾，既然简单工厂模式在结构方面相对简洁，那么它在代码方面肯定是比工厂方法模式复杂的了。简单工厂模式的工厂类随着产品类的增加需要增加很多方法（或代码），而工厂方法模式每个具体工厂类只完成单一任务，代码简洁。<br>
<br>
<strong>3.客户端编程难度</strong><br>
工厂方法模式虽然在工厂类结构中引入了接口从而满足了OCP，但是在客户端编码中需要对工厂类进行实例化。而简单工厂模式的工厂类是个静态类，在客户端无需实例化，这无疑是个吸引人的优点。<br>
<br>
<strong>4.管理上的难度</strong><br>
这是个关键的问题。<br>
我们先谈扩展。众所周知，工厂方法模式完全满足OCP，即它有非常良好的扩展性。那是否就说明了简单工厂模式就没有扩展性呢？答案是否定的。简单工厂模式同样具备良好的扩展性&mdash;&mdash;扩展的时候仅需要修改少量的代码（修改工厂类的代码）就可以满足扩展性的要求了。尽管这没有完全满足OCP，但笔者认为不需要太拘泥于设计理论，要知道，sun提供的java官方工具包中也有想到多没有满足OCP的例子啊（java.util.Calendar这个抽象类就不满足OCP，具体原因大家可以分析下）。<br>
然后我们从维护性的角度分析下。假如某个具体产品类需要进行一定的修改，很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候，对工厂类的修改会变得相当麻烦（对号入座已经是个问题了）。反而简单工厂没有这些麻烦，当多个产品类需要修改是，简单工厂模式仍然仅仅需要修改唯一的工厂类（无论怎样都能改到满足要求吧？大不了把这个类重写）。<br>
<br>
由以上的分析，笔者认为简单工厂模式更好用更方便些。当然这只是笔者的个人看法而已，毕竟公认的，工厂方法模式比简单工厂模式更&ldquo;先进&rdquo;。但有时过于先进的东西未必适合自己，这个见仁见智吧。<br>
<br>
<br>
<font size="5"><strong>写在最后</strong></font><br>
本文仅讨论了两个常见的工厂模式，笔者很主观的分析了各自的优缺点，这必定会引起许多异议。如果对笔者观点有意见的，很欢迎跟贴批评指出。<br>
<br>
其实究竟哪种模式更好，可能你会回答&ldquo;都不好&rdquo;，呵呵，别忘了，我们还有更&ldquo;先进&rdquo;的&ldquo;抽象工厂模式&rdquo;。。。<br>
<br>
最后交代下版权信息。本文许多定义性的内容引用自《java与模式》（电子工业出版社，阎宏），这是本好书，有时间有机会希望大家可以好好看看，我在此书中是获益良多。另外笔者在写本文过程中还参考了《UML基础、案例与应用》（人民邮电出版社，Joseph Schmuller著，李虎、赵龙刚译），除此外其余内容均为原创，转贴请注明&ldquo;工大后院版权所有&rdquo;。</p> <a href="http://hi.baidu.com/rover828/blog/item/9e2da1869b86613666096e1a.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/rover828/blog/category/Java">Java</a>&nbsp;<a href="http://hi.baidu.com/rover828/blog/item/9e2da1869b86613666096e1a.html#comment">查看评论</a>]]></description>
        <pubDate>2009年03月12日 星期四  下午 08:10</pubDate>
        <category><![CDATA[Java]]></category>
        <author><![CDATA[rover828]]></author>
		<guid>http://hi.baidu.com/rover828/blog/item/9e2da1869b86613666096e1a.html</guid>
</item>

<item>
        <title><![CDATA[Java连接Oracle数据库的各种方法]]></title>
        <link><![CDATA[http://hi.baidu.com/rover828/blog/item/ce2e3fdb371c5d6ed1164eaa.html]]></link>
        <description><![CDATA[
		
		<strong>java与oracle的接口：<br>
</strong>　　在<a href="http://www.bitscn.com/database/"><u>数据库</u></a>中运行<a href="http://www.bitscn.com/java"><u>JAVA</u></a>可以说是ORACLE8i的最令人激动的新特性。在你创建的使用ORACLE8i <a href="http://www.bitscn.com/database/"><u>数据库</u></a>的应用程序中，你可以使用与<a href="http://www.bitscn.com/java"><u>JAVA</u></a>有关的新特征，轻松的将程序发布到INTERNET或INTRANET上。<br>
　　<br>
　　Methods for Using Java in ORACLE<br>
　　<br>
　　大家都知道JAVA在跨平台开发与INTERNET开发中已经比较流行，ORACLE8i及以后的版本中都包含了对在数据库中运行JAVA的扩展支持，这里有两种方法可以使用：<br>
　　<br>
　　JDBC：与ODBC类似, JDBC 提供了一个驱动接口使你可以在JAVA程序中访问数据库。注：JDBC驱动内嵌在数据库中虚拟机中。<br>
　　<br>
　　SQLJ：是一个JAVA预编译器，它可以将内嵌的SQL语句转化为JAVA语句.SQLJ的使用与运行机理与其它ORACLE的与编译器（如Pro*C，Pro*COBOL）类似。实际上，为了使我们形象的记住SQLJ提供的功能，我们也可以直接将SQLJ改名为Pro*Java。<br>
　　<br>
　　将JAVA集成到数据库中是双向的。也就是说你可以在JAVA中调用SQL与PL/SQL,也可以在SQL与PL/SQL中调用JAVA。JAVA程序可以直接通过JDBC驱动调用SQL与PL/SQL，反过来，你也可以在SQL与PL/SQL中直接调用JAVA。在数据库中，JAVA命名空间直接映射到数据库模式的命名空间中，这样可以方便JAVA的存取与调用。数据库同时提供扩展的DDL语句，通过这些语句，你可以象创建一个存储过程一样在数据中创建内嵌的JAVA程序。
<p class="Ruf250">中国网管联盟www_bitscn_com</p>
<br>
　　<br>
　　Features of ORACLE JDBC Drivers<br>
　　<br>
　　在ORACLE8i中有三种类型的JDBC驱动，他们都使用相同的 syntax, APIs, and Oracle extensions，以使JAVA代码在robust clients、Web-based Java applets, and Java stored procedures之间保持轻便灵活：三种类型如下：<br>
　　<strong>1．JDBC　OCI： 此驱动类似于传统的ODBC 驱动。因为它需要Oracle Call Interface and Net8，所以它需要在运行使用此驱动的JAVA程序的机器上安装客户端软件<br>
　　2．JDBC Thin： 这种驱动一般用在运行在WEB浏览器中的JAVA程序。它不是通过OCI or Net8，而是通过Java sockets进行通信 ，因此不需要在使用JDBC Thin的客户端机器上安装客户端软件。 <br>
　　3．JDBC KPRB： 这种驱动由直接存储在数据库中的JAVA程序使用，如Java Stored Procedures 、triggers、Database JSP's。It uses the default/ current database session and thus requires no additional database username, password or URL.<br>
</strong>　　<br>
　　如何配置使JAVA可以通过Oracle JDBC Drivers连接到数据库：1.安装Sun JDK.　<br>
　　2. 修改PATH环境变量，使其指向JDK的bin目录 <br>
　　3. 设置CLASSPATH环境变量，使其指向正确的JDK的lib及oracle的JDBC接口。 <span class="Ruf250">中国网管联盟www_bitscn_com</span> <br>
　　CLASSPATH = &quot;.;????&quot;<br>
　　3. 运行&quot;java &ndash;version&quot; ，验证java的版本。<br>
　　<br>
　　如何在不同的操作系统上根据接口类型设置客户端：<br>
　　对JDBC THIN接口：<br>
　　在windows与unix下的设置方法一样：<br>
　　1．根据jdk的版本，只需要将classesxx.zip拷贝到指定的目录，不需要安装Oracle Client。在装完数据库后，该文件会在$ORACLE_HOME/jdbc/lib目录下。2．设置CLASSPATH，使其包含上面的classesxx.zip<br>
　　3．根据需要，拷贝oracle的其它zip文件并设置CLASSPATH<br>
　　<br>
　　对JDBC OCI接口：<br>
　　Fow Windows：<br>
　　1．安装Oracle Client.<br>
　　2．根据jdk的版本，设置CLASSPATH，使其包含正确的classesxx.zip<br>
　　3．根据需要设置CLASSPATH，使其指向Oracle的其它zip文件<br>
　　4．设置PATH，使其包含$ORACLE_HOME\bin目录<br>
　　<br>
　　For unix：<br>
　　1．安装Oracle Client.<br>
　　2．根据jdk的版本，设置CLASSPATH，使其包含正确的classesxx.zip<br>
　　3．根据需要设置CLASSPATH，使其指向Oracle的其它zip文件<br>
　　4．设置LD_LIBRARY_PATH，使其包含$ORACLE_HOME/lib目录<br>
　　<br>
　　备注：<br>
　　classesxx.zip一般在ORACLE_HOME\jdbc\lib目录下。 <font color="#ffffff">54ne.com</font> <br>
　　<br>
　　　　 在ORACLE_HOME\jdbc\lib目录下的与Oracle JDBC Drives驱动有关的文件的解释：<br>
　　　- classes12.zip <br>
　　　　Classes for use with JDK 1.2.x.　It contains the JDBC driver <br>
　　　　classes except classes necessary for NLS support in Object and <br>
　　　　Collection types. <br>
　　<br>
　　　- nls_charset12.zip <br>
　　　　NLS classes for use with JDK 1.2.x.　It contains classes necessary <br>
　　　　for NLS support in Object and Collection types. <br>
　　<br>
　　　- classes12_g.zip <br>
　　　　Same as classes12.zip, except that classes were compiled with <br>
　　　　&quot;javac -g&quot;. <br>
　　<br>
　　JDBC连接数据库的语法：<br>
　　JDBC THIN:<br>
　　<br>
　　<br>
　　　Code: [Copy to clipboard]　 <br>
　　Connection conn= <br>
　　　　　 DriverManager.getConnection <br>
　　　　　　 (&quot;jdbc:oracle:thin:@dlsun511:1521:ora1&quot;,&quot;scott&quot;,&quot;tiger&quot;); <br>
　　　　　　　　　　　　　　　　　　|　　　 |　　 | <br>
　　　　　　　　　　　　　 machine(ip@) : port# : sid　<br>
　　 <br>
　　JDBC OCI:<br>
　　<br>
　　　Code: [Copy to clipboard]　 <font color="#ffffff">网管联盟www.bitsCN.com</font> <br>
　　Connection conn= <br>
　　　　　 DriverManager.getConnection <br>
　　　　　　 (&quot;jdbc:oracle:oci8[9]:@RAC&quot;,&quot;scott&quot;,&quot;tiger&quot;); <br>
　　　　　　　　　　　　　　　　　　| <br>
　　　　　　　　　　　　　　　　　 Net Service <br>
　　 <br>
　　JDBC THIN与JDBC THIN对比：<br>
　　相同之处：<br>
　　　　　The JDBC Thin, JDBC OCI, and JDBC Server drivers all provide the same functionality.　They all support the following standards and features: <br>
　　　　　　* JDBC 2.0 <br>
　　　　　　* Partial JDBC 3.0 (in JDBC driver version 9.2) <br>
　　　　　　* the same syntax and APIs <br>
　　　　　　* the same Oracle extensions <br>
　　<br>
　　至于不同之处是一个表格，不好上传，大家自己总结吧！！<br>
　　主要是JDBC OCI 接口比JDBC THIN接口效率高！<br>
　　<br>
　　How does one connect with the JDBC Thin Driver?<br>
　　　　　The the JDBC thin driver provides the only way to access Oracle from the Web (applets). It is smaller and slower than the OCI drivers.<br>
　　import java.sql.*;<br>
　　<br>
　　　Code: [Copy to clipboard]　 <br>
　　class dbAccess { <span class="Ruf250">中国网管联盟www.bitscn.com</span> <br>
　　　public static void main (String args []) throws SQLException<br>
　　　{<br>
　　　　DriverManager.registerDriver (<br>
　　　　　new oracle.jdbc.driver.OracleDriver()<br>
　　　　);<br>
　　<br>
　　　　Connection conn = DriverManager.getConnection<br>
　　　　　(&quot;jdbc:oracle:thin:@dbhost:1521:ORA1&quot;, &quot;scott&quot;, &quot;tiger&quot;);<br>
　　　　　　　　　　　　　// @machine:port:SID,　 userid,　password<br>
　　<br>
　　　　Statement stmt = conn.createStatement();<br>
　　　　ResultSet rset = stmt.executeQuery (<br>
　　　　　&quot;select BANNER from SYS.V_$VERSION&quot;<br>
　　　　);<br>
　　　　while (rset.next())<br>
　　　　　 System.out.println (rset.getString(1));　 // Print col 1<br>
　　　　stmt.close();<br>
　　　}<br>
　　} <br>
　　How does one connect with the JDBC OCI Driver?<br>
　　　　　One must have Net8 (SQL*Net) installed and working before attempting to use one of the OCI drivers.<br>
　　<br>
　　<br>
　　　Code: [Copy to clipboard]　 <br>
　　import java.sql.*;<br>
　　class dbAccess {<br>
　　　public static void main (String args []) throws SQLException
<p class="Ruf250">网管网bitsCN_com</p>
<br>
　　　{<br>
　　　　try {<br>
　　　　　Class.forName (&quot;oracle.jdbc.driver.OracleDriver&quot;);<br>
　　　　} catch (ClassNotFoundException e) {<br>
　　　　　e.printStackTrace();<br>
　　　　}<br>
　　<br>
　　　　Connection conn = DriverManager.getConnection<br>
　　　　　 (&quot;jdbc:oracle:oci8:@ORA1&quot;, &quot;scott&quot;, &quot;tiger&quot;);<br>
　　　　　　　　　// or oci9 @Service, userid,　password<br>
　　　　Statement stmt = conn.createStatement();<br>
　　　　ResultSet rset = stmt.executeQuery (<br>
　　　　　&quot;select BANNER from SYS.V_$VERSION&quot;<br>
　　　　);<br>
　　　　while (rset.next())<br>
　　　　　System.out.println (rset.getString(1)); // Print col 1<br>
　　　　stmt.close();<br>
　　　}<br>
　　} <br>
　　How does one connect with the JDBC KPRB Driver?<br>
　　　　　One can obtain a handle to the default or current connection (KPRB driver) by calling the OracleDriver.defaultConenction() method. Please note that you do not need to specify a database URL, username or password as you are already connected to a database session. Remember not to close the default connection. Closing the default connection might throw an exception in future releases of Oracle.
<p class="Ruf250">网管网bitsCN_com</p>
<br>
　　import java.sql.*;<br>
　　<br>
　　<br>
　　　Code: [Copy to clipboard]　 <br>
　　class dbAccess {<br>
　　　public static void main (String args []) throws SQLException<br>
　　　{<br>
　　　　Connection conn = (new<br>
　　　　　oracle.jdbc.driver.OracleDriver()).defaultConnection();<br>
　　<br>
　　　　Statement stmt = conn.createStatement();<br>
　　　　ResultSet rset = stmt.executeQuery (<br>
　　　　　&quot;select BANNER from SYS.V_$VERSION&quot;<br>
　　　　);<br> <a href="http://hi.baidu.com/rover828/blog/item/ce2e3fdb371c5d6ed1164eaa.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/rover828/blog/category/Java">Java</a>&nbsp;<a href="http://hi.baidu.com/rover828/blog/item/ce2e3fdb371c5d6ed1164eaa.html#comment">查看评论</a>]]></description>
        <pubDate>2009年03月06日 星期五  下午 05:43</pubDate>
        <category><![CDATA[Java]]></category>
        <author><![CDATA[rover828]]></author>
		<guid>http://hi.baidu.com/rover828/blog/item/ce2e3fdb371c5d6ed1164eaa.html</guid>
</item>

<item>
        <title><![CDATA[SQL LIKE 通配符随笔]]></title>
        <link><![CDATA[http://hi.baidu.com/rover828/blog/item/9ef675f0158f57a7a50f521e.html]]></link>
        <description><![CDATA[
		
		<div class="postbody">
<p>通配符 说明 <br>
_&nbsp;&nbsp;&nbsp;  与任意单字符匹配<br>
 <br>
%&nbsp;&nbsp;&nbsp;  与包含一个或多个字符的字符串匹配<br>
 <br>
[ ]  与特定范围（例如，[a-f]）或特定集（例如，[abcdef]）中的任意单字符匹配。<br>
 <br>
[^]  与特定范围（例如，[^a-f]）或特定集（例如，[^abcdef]）之外的任意单字符匹配。<br>
 </p>
<p>例子:</p>
<p>&#8226; WHERE FirstName LIKE '_im' 可以找到所有三个字母的、以 im 结尾的名字（例如，Jim、Tim）。 <br>
 <br>
&#8226; WHERE LastName LIKE '%stein' 可以找到姓以 stein 结尾的所有员工。 <br>
 <br>
&#8226; WHERE LastName LIKE '%stein%' 可以找到姓中任意位置包括 stein 的所有员工。 <br>
 <br>
&#8226; WHERE FirstName LIKE '[JT]im' 可以找到三个字母的、以 im 结尾并以 J 或 T 开始的名字（即仅有 Jim 和 Tim） <br>
 <br>
&#8226; WHERE LastName LIKE 'm[^c]%' 可以找到以 m 开始的、后面的（第二个）字母不为 c 的所有姓。</p>
</div> <a href="http://hi.baidu.com/rover828/blog/item/9ef675f0158f57a7a50f521e.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/rover828/blog/category/%CA%FD%BE%DD%BF%E2">数据库</a>&nbsp;<a href="http://hi.baidu.com/rover828/blog/item/9ef675f0158f57a7a50f521e.html#comment">查看评论</a>]]></description>
        <pubDate>2009年03月05日 星期四  下午 05:08</pubDate>
        <category><![CDATA[数据库]]></category>
        <author><![CDATA[rover828]]></author>
		<guid>http://hi.baidu.com/rover828/blog/item/9ef675f0158f57a7a50f521e.html</guid>
</item>

<item>
        <title><![CDATA[如何更好的通过对测试缺陷分析，从而得出改进研发和测试工作的信息]]></title>
        <link><![CDATA[http://hi.baidu.com/rover828/blog/item/9adcb0001c65d180e850cde7.html]]></link>
        <description><![CDATA[
		
		<table class="MsoNormalTable" style="width: 722.95pt; mso-cellspacing: 0cm; mso-yfti-tbllook: 1184; mso-padding-alt: 0cm 0cm 0cm 0cm" cellspacing="0" cellpadding="0" width="964" border="0">
    <tbody>
        <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
            <td style="border-right: #ece9d8; padding-right: 0cm; border-top: #ece9d8; padding-left: 0cm; padding-bottom: 0cm; border-left: #ece9d8; padding-top: 0cm; border-bottom: #ece9d8; background-color: transparent">
            <table class="MsoNormalTable" style="width: 722.95pt; border-collapse: collapse; mso-yfti-tbllook: 1184; mso-padding-alt: 0cm 0cm 0cm 0cm" cellspacing="0" cellpadding="0" width="964" border="0">
                <tbody>
                    <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
                        <td style="border-right: #ece9d8; padding-right: 0cm; border-top: #ece9d8; padding-left: 0cm; padding-bottom: 0cm; border-left: #ece9d8; width: 100%; padding-top: 0cm; border-bottom: #ece9d8; background-color: transparent" width="100%">
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 10pt; ">摘要：</span></strong><span style="font-size: 9pt; "> </span><span style="font-size: 10pt; ">测试活动作为<span>IT</span>项目和产品开发一个重要的环节，通过发现产品或组件的缺陷，并反馈给开发组修复验证这些缺陷，从而在一定程度上保证了外发产品的质量。对这些测试活动发现的缺陷进行深入的分析，可以有助于我们进行质量预测、进行过程改进、量化的衡量产品质量。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 10pt; ">关键词：</span></strong><span style="font-size: 10pt; ">测试分析、过程改进、质量预测、过程能力、缺陷</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><strong><span style="font-size: 10pt; ">正文：<span></span></span></strong></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">项目研发过程中，我们通过单元测试、集成测试、系统测试发现了大量的缺陷。我们把这些<span>Bug</span>输入到<span>Excel</span>或者其他测试管理系统中，跟踪其解决。一旦<span>Bug fix</span>完成后，大多数情况下我们就把这份<span>bug list</span>束之高阁，偶尔能想到的用途就是拿出来衡量测试组的绩效，或者用来评估开发组的质量表现。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">一般来说质量分析有以下集中情况</span><span style="font-size: 9pt; "></span></p>
                        <ul type="disc">
                            <li class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; "><strong><span style="font-size: 10pt; ">利用缺陷引入<span>-</span>发现矩阵分析</span></strong><span style="font-size: 10pt; "> </span><span style="font-size: 9pt; "></span></li>
                        </ul>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">缺陷有发现阶段和引入阶段两个重要指标，发现阶段和引入阶段可以是软件生命周期的各个阶段，根据这两个阶段可以绘制出一个矩阵，从而分析出软件开发各个环节的开展质量，找到最需要改进的环节。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">开始例子分析之前先解释一下缺陷引入<span>-</span>发现矩阵的一些概念。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">矩阵的每行表示该阶段或活动发现的各阶段产生的缺陷数；矩阵的每列表示该阶段或活动引入的缺陷泄露到后续各环节的缺陷数。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">缺陷移除率定义为：缺陷移除率<span>=(</span>本阶段发现的缺陷数<span>/</span>本阶段引入的缺陷数<span>)*100%</span>。如需求阶段一共引入了<span>15</span>个缺陷，需求评审时候只发现了<span>2</span>个，设计过程中发现了<span>10</span>个，编码和单元测试阶段发现了两个，还有一个直到系统测试阶段才被发现。这样，需求阶段的缺陷移除率<span>=2/15*100%=13%</span>。它反映的是该活动阶段的缺陷清除能力。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">反过来还有一个概念，缺陷泄露率，就是有多少本阶段引入的缺陷没有在本阶段发现而是被泄露到后阶段环节才被发现。其计算公式为：缺陷泄漏率<span>=</span>（下游发现的本阶段的缺陷数<span>/</span>本阶段注入的缺陷总数）<span>*100%</span>。显然，它等于<span>[1-</span>缺陷移除率<span>]</span>。它反映的是本阶段质量控制措施落实的成效。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">下面是一个分析例子：</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="center"><span style="font-size: 10pt; "><img height="151" alt="http://www.51testing.com/ddimg/uploadimg/20060808/clip_image002.jpg" src="file:///C:/DOCUME~1/WEI~1.LIU/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.jpg" width="422"></span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">从上表可以看到，编码过程的缺陷大部分依赖系统测试发现。单元测试和集成测试活动开展不够深入。我们可以进一步分析这些系统测试出来的测试缺陷，是不是可以被更前端的评审<span>/</span>测试<span>/</span>设计讨论活动所替代。详细见&ldquo;四、利用泄漏的下游缺陷回溯过程有效性&rdquo;</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">另外，我们看到，需求阶段引入的缺陷绝大部分是在设计阶段发现的。这可能是我们大部分项目的一个现实，需求不稳定、需求不明确，很多东西需要在设计过程中才能明确下来。也许从这个分析结果中给我们一个启示，我们在设计评审时候，也需要重新审视我们的需求规格说明书，必要时候利用需求追踪矩阵这样的规矩方法来辅助我们发现上游需求的缺陷。把这样的机制固化起来，作为我们标准研发过程的一个要素或者过程指导书。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">当然，实际规划&ldquo;缺陷引入<span>-</span>发现矩阵&rdquo;时，可以依据自己的管理要求，对缺陷的发现活动和引入阶段进行细分或初分，并且在<span>Bug</span>系统中提交时，需要准确的填写这些属性字段。</span><span style="font-size: 9pt; "></span></p>
                        <ul type="disc">
                            <li class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l3 level1 lfo2; "><strong><span style="font-size: 10pt; ">利用缺陷的分布进行分析</span></strong><span style="font-size: 10pt; "> </span><span style="font-size: 9pt; "></span></li>
                        </ul>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">可以选某个阶段的测试缺陷进行分析，按照这些缺陷对应的产品组成部分来汇总这些数据。利用这样的分布，可以找出我们产品<span>/</span>项目的高危模块来。这些模块导致了我们产品的主要缺陷。主要用到的分析手段是数据透视表和柏拉图。让我们看看下面的例子：</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="center"><span style="font-size: 10pt; "><img height="145" alt="http://www.51testing.com/ddimg/uploadimg/20060808/clip_image004.jpg" src="file:///C:/DOCUME~1/WEI~1.LIU/LOCALS~1/Temp/msohtmlclip1/01/clip_image002.jpg" width="376"></span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">这是一个简单的<span>OA</span>系统，它只有<span>5</span>个子系统。我们把这些子系统各有多少缺陷列出来，找到了改善质量的关键模块是后台交易模块。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="center"><span style="font-size: 10pt; "><img height="323" alt="http://www.51testing.com/ddimg/uploadimg/20060808/clip_image006.jpg" src="file:///C:/DOCUME~1/WEI~1.LIU/LOCALS~1/Temp/msohtmlclip1/01/clip_image003.jpg" width="553"></span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">像上图，这是一个较为复杂的<span>MIS</span>系统，有近<span>20</span>个功能块。这个时候，可以利用柏拉图识别出占<span>80%</span>问题的那少数模块，针对其采取强于其它产品组成部分的质量控制措施。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">需要指出的是：采用缺陷分布只是分析的第一步。它只不过提供了你分析影响产品质量的那些重点模块，其信息不足以给出更深层次的原因。需要针对这些高危模块进行进一步的分析，识别缺陷的产生根源。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">当然，也有人认为绝对数去衡量缺陷的分布并不合适，所以有些人也会把缺陷按照严重程度对应一定的权重系数折算成分析意义上的标准故障。如上表，折算系数为，严重<span>*10</span>，关键<span>*5</span>，一般<span>*3</span>，次要<span>*1</span>，优化<span>*0</span>。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">这种分析需要我们的<span>bug</span>系统建立产品组件的概念，使得缺陷填报人能够正确的填报每个缺陷的产品组件位置。</span><span style="font-size: 9pt; "></span></p>
                        <ul type="disc">
                            <li class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l5 level1 lfo3; "><strong><span style="font-size: 10pt; ">利用缺陷的阶段分布模型进行质量预测</span></strong><span style="font-size: 10pt; "> </span><span style="font-size: 9pt; "></span></li>
                        </ul>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">假设我们为<span>bug</span>管理系统建立了&ldquo;<strong>一、利用缺陷引入<span>-</span>发现矩阵分析</strong>&rdquo;中描述的缺陷引入<span>-</span>缺陷发现阶段信息，那么我们可以对相似的项目的缺陷阶段分布进行度量，形成该类型项目的缺陷分布的过程模型。它给予我们的信息是：只要是这种类型的项目，按照相似的过程方法进行研发，那么其质量表现也是相似的。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">我们之所以作这样的假设，是有一个前提，就是我们研发过程是高度一致的，并且过程的表现也是稳定的。这样，我们得出的过程能力模型才具有可信度。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">下面是一个如何运用测试分布模型进行质量预测的例子：</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="center"><span style="font-size: 10pt; "><img height="242" alt="http://www.51testing.com/ddimg/uploadimg/20060808/clip_image008.gif" src="file:///C:/DOCUME~1/WEI~1.LIU/LOCALS~1/Temp/msohtmlclip1/01/clip_image004.gif" width="448"></span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">如果需求阶段发现了<span>10</span>个缺陷，就可以预计到设计阶段我大概要清除<span>70</span>个缺陷，依次可以估计到后阶段各个环节的缺陷数，作为我们该阶段工作的交付准则。并且，可以预测到产品发布后的使用表现会出现大约<span>2</span>个故障泄露到用户手中。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">这种分析预测模型的建立，要求组织的测试<span>/</span>评审过程比较稳定。即组织整体达到<span>CMMI</span>三级成熟度，同时在<span>VAL</span>和<span>VER</span>（验证和确认）过程域的达到<span>CMMI</span>四级的成熟度级别，即量化管理级别。</span><span style="font-size: 9pt; "></span></p>
                        <ul type="disc">
                            <li class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l4 level1 lfo4; "><strong><span style="font-size: 10pt; ">利用泄漏的下游缺陷回溯过程有效性</span></strong><span style="font-size: 10pt; "> </span><span style="font-size: 9pt; "></span></li>
                        </ul>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">经验告诉我们，越到后端发现的缺陷，用于问题复现、问题定位和<span>bug</span>修复的时间就越多。那么我们是不是可以在项目研发的更前端发现这些缺陷呢？有什么方式让我们识别项目研发前端哪些活动没有充分投入、或者没有运用合适的工程<span>/</span>技术方法导致这些问题被泄露到下游呢？</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">其实，我们有很简便的方法可以达到这个目的。从团队的典型项目中运用一定的抽样原则抽样出某个阶段的若干个缺陷，从技术、流程、工程方法、费效比方面去分析其更适合、更经济的清除方法。然后把这些方法固化到我们日常的项目实施过程中，逐步就可以降低上游对后端的缺陷泄露。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">下面以对一个项目的系统测试阶段发现的故障为例进行过程有效性回溯分析：</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; "><img height="99" alt="http://www.51testing.com/ddimg/uploadimg/20060808/clip_image010.jpg" src="file:///C:/DOCUME~1/WEI~1.LIU/LOCALS~1/Temp/msohtmlclip1/01/clip_image005.jpg" width="401"></span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">从上表可以看出，真正需要遗留到系统测试阶段才能发现的故障只有<span>7%</span>，大部分故障应该在集成测试和设计评审过程中就应该发现的。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">导致在集成测试过程中未能充分发现这些缺陷的原因主要有：</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  1</span><span style="font-size: 10pt; ">、测试环境不具备，导致部分测试项必须到系统测试阶段才具备测试条件；</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  2</span><span style="font-size: 10pt; ">、测试设计中某些测试项的缺失，需要加强测试设计的评审工作；</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  3</span><span style="font-size: 10pt; ">、回归测试过程中，开发部只是对测试故障进行验证，而对<span>bug fix</span>波及的范围缺乏分析和验证；</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">这样，针对这些分析结论，我们就可以制定针对性的整改措施。如：</span><span style="font-size: 9pt; "></span></p>
                        <ul type="disc">
                            <li class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l2 level1 lfo5; "><span style="font-size: 10pt; ">加强开发部的故障波及分析及波及分析验证工作； </span><span style="font-size: 9pt; "></span></li>
                            <li class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l2 level1 lfo5; "><span style="font-size: 10pt; ">项目计划中加强对测试需求的关注，提前采购和协调必要的测试环境； </span><span style="font-size: 9pt; "></span></li>
                            <li class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l2 level1 lfo5; "><span style="font-size: 10pt; ">每次回归对泄露的缺陷开发部都作相应的复盘，并根据复盘结果，完善单元测试和集成测试的测试设计； <span></span></span></li>
                            <li class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l2 level1 lfo5; "><span style="font-size: 10pt; ">利用缺陷分类来进行缺陷的根源分析 <span></span></span></li>
                        </ul>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">对于测试出来的<span>BUG</span>进行缺陷分类，按照<span>BUG</span>的类型分布，找出那些关键的缺陷类型，进一步分析其产生的根源，从而针对性的制定改进措施。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">下面以一个项目的系统测试故障为例进行分析：</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="center"><span style="font-size: 10pt; "><img height="247" alt="http://www.51testing.com/ddimg/uploadimg/20060808/clip_image012.gif" src="file:///C:/DOCUME~1/WEI~1.LIU/LOCALS~1/Temp/msohtmlclip1/01/clip_image006.gif" width="457"></span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">从系统测试故障来看，有较多故障是由接口原因造成的，细分有以下几种原因：</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  1</span><span style="font-size: 10pt; ">、跨项目间的接口，接口设计文档的更改没有建立互相通知的机制，导致接口问题到系统测试时候才暴露出来；</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  2</span><span style="font-size: 10pt; ">、部门内部跨子系统的接口，由于本项目设计文档按功能规划编写的，而不是按照产品组件，一般由主要承接功能工作的组编写该文档，接口内容可能不为其他开发组理解并熟悉，导致因接口问题而出错；</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  3</span><span style="font-size: 10pt; ">、系统设计基线化后，更改系统接口，没有走严格的变更流程，进行波及分析，导致该接口变更只在某个子系统中被修改，而使错误遗漏下来；</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">那么我们可以针对性的制定改进建议：</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  1</span><span style="font-size: 10pt; ">、对接口文档的评审一定要识别受影响的相关干系人，使他们了解并参与接口设计的把关；</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  2</span><span style="font-size: 10pt; ">、对基线化的接口设计文档的变更一定要提交变更单给ＣＣＢ决策，并做好充分的波及影响分析，以便同步修改所有关联的下游代码；</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  3</span><span style="font-size: 10pt; ">、概要设计文档按子系统规划，详细设计文档按模块规划，通过相关组参加评审协调接口设计；</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">以上例子的缺陷分类只是为了描述方便，本身描述并不尽合理。实际定义缺陷分类可能有很多个维度，如发现活动、引入活动、缺陷来源、缺陷类型、严重程度等。只要满足自己的缺陷管理、缺陷分析需求即可。</span><span style="font-size: 9pt; "></span></p>
                        <ul type="disc">
                            <li class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l6 level1 lfo6; "><strong><span style="font-size: 10pt; ">缺陷收敛趋势分析</span></strong><span style="font-size: 10pt; "> </span><span style="font-size: 9pt; "></span></li>
                        </ul>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">项目管理中一项非常重要但也十分困难的工作是衡量项目的进度、质量、成本等，统称为项目的状态，以确定项目是否能按期保质完成。这方面，测试提供了两个非常重要的参数，一个是缺陷数量的趋势，另一个是缺陷修复的趋势。（注：此节所说的测试均指代系统测试）</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">缺陷趋势就是将每月新生成的缺陷数、每月被解决的缺陷数和每月遗留的缺陷数标成一个趋势图表。一般在项目的开始阶段发现缺陷数曲线会呈上升趋势，到项目中后期被修复缺陷数曲线会趋于上升；而发现缺陷数曲线应总体趋于下降；同时处于<span>OPEN</span>状态的缺陷也应该总体呈下降趋势，到项目最后，三条曲线都趋向于零。如：</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="center"><span style="font-size: 10pt; "><img height="247" alt="http://www.51testing.com/ddimg/uploadimg/20060808/clip_image014.gif" src="file:///C:/DOCUME~1/WEI~1.LIU/LOCALS~1/Temp/msohtmlclip1/01/clip_image007.gif" width="457"></span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">项目经理会持续观察这张图表，确保项目健康发展，同时通过分析预测项目测试缺陷趋于零的时间。在一定的历史经验的基础上分析使用这一图表会得到很多有价值的信息，比如说，可分析开发和测试在人力资源的配比上是否恰当，可以分析出某个严重的缺陷所造成的项目质量的波动。对于异常的波动，如本来应该越测试越收敛的，却到了某个点，发现的故障数反而呈上升趋势，那么，这些点往往有一些特殊事件的发生。如：</span><span style="font-size: 9pt; "></span></p>
                        <ul type="disc">
                            <li class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo7; "><span style="font-size: 10pt; ">在该时间段送测的回归版本增加了新的功能，导致缺陷引入； </span><span style="font-size: 9pt; "></span></li>
                            <li class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo7; "><span style="font-size: 10pt; ">该回归版本开发部没有进行集成测试就直接送测？等等。 </span><span style="font-size: 9pt; "></span></li>
                        </ul>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span><span style="font-size: 10pt; ">当然，这个统计周期也可以根据我们的项目实施情况进行。如按照回归版本的版本号进行统计、按周进行统计等。也有公司把缺陷收敛情况当作判断版本是否可以最终外发的一个标志。</span><span style="font-size: 9pt; "></span></p>
                        <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><strong><span style="font-size: 10pt; ">&nbsp;&nbsp;&nbsp;  </span></strong><strong><span style="font-size: 10pt; ">小结：</span></strong><span style="font-size: 10pt; ">分析来源于一个前提，我们需要规划一个好的管理系统，能收集到相应的数据，满足我们这些分析的信息需要。另外，我们的研发过程是稳定的，其质量表现大体是一致的，这样数据反映的趋势才具备可信度。</span><span style="font-size: 9pt; "></span></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><font face="Calibri"> </font></span></p> <a href="http://hi.baidu.com/rover828/blog/item/9adcb0001c65d180e850cde7.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/rover828/blog/category/%CF%EE%C4%BF%B9%DC%C0%ED">项目管理</a>&nbsp;<a href="http://hi.baidu.com/rover828/blog/item/9adcb0001c65d180e850cde7.html#comment">查看评论</a>]]></description>
        <pubDate>2009年02月18日 星期三  下午 07:10</pubDate>
        <category><![CDATA[项目管理]]></category>
        <author><![CDATA[rover828]]></author>
		<guid>http://hi.baidu.com/rover828/blog/item/9adcb0001c65d180e850cde7.html</guid>
</item>

<item>
        <title><![CDATA[PowerDesigner12破解及下载]]></title>
        <link><![CDATA[http://hi.baidu.com/rover828/blog/item/342e0c46fdc1540e6a63e5af.html]]></link>
        <description><![CDATA[
		
		下载地址<a href="http://download.sybase.com/ /PowerDesigner/powerdesigner12_ .exe">http://download.sybase.com/eval/PowerDesigner/powerdesigner12_eval.exe</a><br>
修改安装目录下的pdflm12.dll文件，使用二进制编辑器打开此文件，查找：83 C4 14 8B 85 E4 FE FF FF将此字符串改为83 C4 14 33 C0 90 90 90 90&nbsp;&nbsp; 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/rover828/blog/category/it%D7%CA%D4%B4">it资源</a>&nbsp;<a href="http://hi.baidu.com/rover828/blog/item/342e0c46fdc1540e6a63e5af.html#comment">查看评论</a>]]></description>
        <pubDate>2009年02月18日 星期三  下午 01:46</pubDate>
        <category><![CDATA[it资源]]></category>
        <author><![CDATA[rover828]]></author>
		<guid>http://hi.baidu.com/rover828/blog/item/342e0c46fdc1540e6a63e5af.html</guid>
</item>

<item>
        <title><![CDATA[oracle中escape关键字解析]]></title>
        <link><![CDATA[http://hi.baidu.com/rover828/blog/item/e0b4f5de0dd2025395ee372e.html]]></link>
        <description><![CDATA[
		
		<p>定义：escape关键字经常用于使某些特殊字符，如通配符：'%','_'转义为它们原</p>
<p>来的字符的意义，被定义的转义字符通常使用'\',但是也可以使用其他的符号。</p>
<p>实例：</p>
<p>SQL&gt; select * from t11 where name like '%_%';</p>
<p>NAME<br>
----------<br>
aa_a<br>
aaa<br>
SQL&gt; select * from t11 where name like '%\_%' escape '\';</p>
<p>NAME<br>
----------<br>
aa_a</p>
<p>注意：如果是 '/' 作为检索字符, 必须 用 '/' 作为转义符, 正斜扛也一样.<br>
select * from wan_test where psid like '%//%' escape '/'</p> <a href="http://hi.baidu.com/rover828/blog/item/e0b4f5de0dd2025395ee372e.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/rover828/blog/category/%CA%FD%BE%DD%BF%E2">数据库</a>&nbsp;<a href="http://hi.baidu.com/rover828/blog/item/e0b4f5de0dd2025395ee372e.html#comment">查看评论</a>]]></description>
        <pubDate>2009年01月04日 星期日  下午 01:58</pubDate>
        <category><![CDATA[数据库]]></category>
        <author><![CDATA[rover828]]></author>
		<guid>http://hi.baidu.com/rover828/blog/item/e0b4f5de0dd2025395ee372e.html</guid>
</item>

<item>
        <title><![CDATA[oracle:could not locate oci.dll]]></title>
        <link><![CDATA[http://hi.baidu.com/rover828/blog/item/982f7dcb8bbf8518bf09e682.html]]></link>
        <description><![CDATA[
		
		<p>在使用PL/SQL时出现</p>
<p> </p>
<div forimg="1"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/rover828/pic/item/c8e4a78b6388c1629f2fb406.jpg"></div>
<div forimg="1">
<p> </p>
<p>选择&quot;cancel&quot;</p>
<div class="t_msgfont" >
<p>打开tool-&gt;preferences,在oracle的connection选项下,在Oracle Home (Empty is autodetect)下拉框选择一个OracleHome,在OCI Library (Empty is autodetect)下拉框选择对应的Oracle Home路径下的oci.dll</p>
<p> </p>
<div forimg="1"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/rover828/pic/item/dcf6b67efcde83250dd7da05.jpg"></div>
</div>
</div>
<p> </p> <a href="http://hi.baidu.com/rover828/blog/item/982f7dcb8bbf8518bf09e682.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/rover828/blog/category/%CA%FD%BE%DD%BF%E2">数据库</a>&nbsp;<a href="http://hi.baidu.com/rover828/blog/item/982f7dcb8bbf8518bf09e682.html#comment">查看评论</a>]]></description>
        <pubDate>2008年12月24日 星期三  下午 07:22</pubDate>
        <category><![CDATA[数据库]]></category>
        <author><![CDATA[rover828]]></author>
		<guid>http://hi.baidu.com/rover828/blog/item/982f7dcb8bbf8518bf09e682.html</guid>
</item>

<item>
        <title><![CDATA[怎么查看80端口占用情况? 如何查看端口占用情况？]]></title>
        <link><![CDATA[http://hi.baidu.com/rover828/blog/item/9adcb000defa1780e950cd92.html]]></link>
        <description><![CDATA[
		
		开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&quot;查看&quot;-&quot;选择列&quot;<br>
<br>
经常，我们在启动应用的时候发现系统需要的端口被别的程序占用，如何知道谁占有了我们需要的端口，很多人都比较头疼，下面就介绍一种非常简单的方法，希望对大家有用<br>
<br>
假如我们需要确定谁占用了我们的80端口<br>
<br>
1、Windows平台<br>
在windows命令行窗口下执行：<br>
C:\&gt;netstat -aon|findstr &quot;80&quot; <br>
TCP&nbsp;&nbsp;&nbsp;&nbsp;  127.0.0.1:80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  0.0.0.0:0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  LISTENING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  2448<br>
看到了吗，端口被进程号为2448的进程占用，继续执行下面命令：<br>
C:\&gt;tasklist|findstr &quot;2448&quot; <br>
thread.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  2016 Console&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  0&nbsp;&nbsp;&nbsp;&nbsp;  16,064 K<br>
很清楚吧，thread占用了你的端口,Kill it<br>
如果第二步查不到，那就开任务管理器，看哪个进程是2448，然后杀之即可。
<p>如果需要查看其他端口。把 80 改掉即可</p> <a href="http://hi.baidu.com/rover828/blog/item/9adcb000defa1780e950cd92.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/rover828/blog/category/it%D7%CA%D4%B4">it资源</a>&nbsp;<a href="http://hi.baidu.com/rover828/blog/item/9adcb000defa1780e950cd92.html#comment">查看评论</a>]]></description>
        <pubDate>2008年11月19日 星期三  上午 11:05</pubDate>
        <category><![CDATA[it资源]]></category>
        <author><![CDATA[rover828]]></author>
		<guid>http://hi.baidu.com/rover828/blog/item/9adcb000defa1780e950cd92.html</guid>
</item>

<item>
        <title><![CDATA[Oracle 中自动序列]]></title>
        <link><![CDATA[http://hi.baidu.com/rover828/blog/item/4cde5db53f9903c937d3ca04.html]]></link>
        <description><![CDATA[
		
		Oracle中没有象Acces中自动编号的字段类型，所以在oracle中要想用一个字段自动增值，还比较麻烦，在此提供给大家一个方法，利用序列，来完成字段的自动增加，下边介绍一下怎么创建序列，使用序列，和删除序列。
<p><font face="Courier New">1.创建序列--------------create sequence </font></p>
<p><font face="Courier New"> create sequence  Seq_AutoID&nbsp;&nbsp;  //所起序列名叫 Seq_AutoID ,需要记住此序列名，以后方可调用</font></p>
<p><font face="Courier New">minvalue&nbsp;&nbsp;  1&nbsp;&nbsp;  //最小值从1开始 可以根据自己的需要自定义</font></p>
<p><font face="Courier New">maxvalue 9999999999999999999&nbsp;&nbsp;&nbsp;&nbsp;  //序列最大值为 999999999999999999999 可以自定义</font></p>
<p><font face="Courier New">start with 1&nbsp;&nbsp;  //从1开始 可以自定义</font></p>
<p><font face="Courier New">increment by  1&nbsp;&nbsp;  //递增幅度为 1&nbsp;&nbsp;  可以自定义</font></p>
<p><font face="Courier New">cache 20 ;&nbsp;&nbsp;&nbsp;&nbsp;  //缓存20</font></p>
<p><font face="Courier New">2. 调用序列，完成自动加1 ------------Seq_AutoID.nextval</font></p>
<p><font face="Courier New">在向表中插入、更新 数据时可以调用 ，由于自己实际应用中只用到了 插入时调用，所以在此只举此列</font></p>
<p><font face="Courier New">EG:  insert into table1 ( f1,f2,f3,f4) select  f1,f2,f3,Seq_AutoID.nextval  from table2  where 条件</font></p>
<p><font face="Courier New">当然上边这句是批量插入数据，你也可以用 values值来一条条插入。在此需说明的一点为table1.f4字段需为数值型(number)型。这样，你的table1中的f4字段就是从1开始，以幅度为1来递增的数值了，实现了自动增加的功能。当然幅度可以自己定义。</font></p>
<p><font face="Courier New">还有一点是 序列是值是唯一的，只要你一直用nextval来递增的话，在oracle中序列号不会重复.可以用CurrVal来查询当前的序列值，在你nextval后，currval也会跟着变。</font></p>
<p><font face="Courier New">3.序列的删除--------------drop sequence</font></p>
<p><font face="Courier New">当为了重置序列时，或不需要序列时，可以先删除序列</font></p>
<p><font face="Courier New">EG: drop sequence Seq_AutoID;</font></p>
<p><font face="Courier New">4.用序列来修改某个字段的值</font></p>
<p><font face="Courier New">eg:  update cse_depot set jobid=Seq_AutoID.nextval </font></p>
<p><font face="Courier New">以上这个例子是用当前的序列值给cse_depot的字段 jobid赋值，使jobid字段实现自动加1功能</font></p> <a href="http://hi.baidu.com/rover828/blog/item/4cde5db53f9903c937d3ca04.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/rover828/blog/category/%CA%FD%BE%DD%BF%E2">数据库</a>&nbsp;<a href="http://hi.baidu.com/rover828/blog/item/4cde5db53f9903c937d3ca04.html#comment">查看评论</a>]]></description>
        <pubDate>2008年11月08日 星期六  下午 07:22</pubDate>
        <category><![CDATA[数据库]]></category>
        <author><![CDATA[rover828]]></author>
		<guid>http://hi.baidu.com/rover828/blog/item/4cde5db53f9903c937d3ca04.html</guid>
</item>

<item>
        <title><![CDATA[某地理老师经典语录，巨雷!非一般的经典！(转载)]]></title>
        <link><![CDATA[http://hi.baidu.com/rover828/blog/item/835a6a81cf9e08dfbd3e1ee4.html]]></link>
        <description><![CDATA[
		
		1:你这种人天理地理都难容。（他就是这么骂人的） <br>
　　　　　　 <br>
　　　　　　2：存在即合理。 <br>
　　　　　　 <br>
　　　　　　3：某些同学考试时脑袋偏转的角度不要超过黄赤交角。（监考时说的） <br>
　　　　　　 <br>
　　　　　　4：这位同学，你的灵魂现在比大西洋还遥远。 <br>
　　　　　　 <br>
　　　　　　5：这个题目不知道，你该下19层地狱，不是一般的地狱。 <br>
　　　　　　 <br>
　　　　　　6：到现在你们对气候还一窍不通，你们死有余辜，这种东西烧成灰你们都要记得。 <br>
　　　　　　 <br>
　　　　　　7：很多题目真是只有不知廉耻的同学才会做错（极言题目简单） <br>
　　　　　　 <br>
　　　　　　8：两艘船一艘在热带一艘在温带捕鱼，哪艘船更容易沉掉？温带的，为什么，温带鱼多，船装不下就沉了（万式无厘头） <br>
　　　　　　 <br>
　　　　　　9：开小差的同学，争取误差在8秒之内。 <br>
　　　　　　 <br>
　　　　　　10：太阳耀斑爆发是很可怕的，但我要是被惹火了的话，会比耀斑还可怕数万倍。（所以他有个外号叫万耀斑） (耀平)是他原名 <br>
　　　　　　 <br>
　　　　　　11：有些登峰造极的同学现在彗星还写成慧星，真是充满智慧的扫把星。 <br>
　　　　　　 <br>
　　　　　　12：今天地理课上我发了火，头上出了汗，太阳一出来蒸发了，在太仓南部上空形成了水汽，下了场雨，碰巧有几滴又落回我头上，这就是一个水循环。（如此举例） <br>
　　　　　　 <br>
　　　　　　13：这位同学站在悬崖上面对著大海，反思他刚才在地理课上的所作所为，如果这时是白天，那么他是安全的，如果是晚上，吹起一阵风，他就会感觉到一双罪恶的手在把他往悬崖下推。（水的海陆间循环那节课上，他这样解释海风和陆风） <br>
　　　　　　 <br>
　　　　　　14：请那些在下面面无表情的女同学注视著我，虽然我知道我的形象不怎么光辉。 <br>
　　　　　　 <br>
　　　　　　15：我这个人饭量很大，一顿要吃5碗饭，但是我脑力体力消耗得大，那位同学一顿只吃一碗，但他一天到晚做著不动，两年下来，他成了只肉球，而我变成了木乃伊。（用比喻手法解释径流量和蒸发量） <br>
　　　　　　 <br>
　　　　　　16：这个纸不是给你做草稿的，更不是给你做草纸的。 <br>
　　　　　　 <br>
　　　　　　17：山上积了很多雪，就想冰激凌一样，对不对。（有人说这个比喻很可爱） <br>
　　　　　　 <br>
　　　　　　18：海沟听说过吗？海底下有阴沟啊？ <br>
　　　　　　 <br>
　　　　　　19：中国十二点，日本就是十三点（讲时区的时候说的） <br>
　　　　　　 <br>
　　　　　　20：有的同学让我有犯罪感，让我觉得对不起他爸爸妈妈爷爷奶奶列祖列宗。 <br>
　　　　　　 <br>
　　　　　　21：请用0.003秒回答这个问题。 <br>
　　　　　　 <br>
　　　　　　22：全班刚才失踪同学一名，经调查，该生系进行非法位移，以后如果还有这样的同学，希望大家把他往死里打。（说的是**，同情他） <br>
　　　　　　 <br>
　　　　　　23：你这花岗岩脑袋！ <br>
　　　　　　 <br>
　　　　　　24：岩石熔化成岩浆的过程就是重新投胎的过程。 <br>
　　　　　　 <br>
　　　　　　25：今天我们要研究地质山。这位同学以后去开拖拉机，拼死拼活在平地山堆起一座土山，这种山不是我们要研究的山。 <br>
　　　　　　 <br>
　　　　　　26：不能以貌取人，也不能以貌取山。 <br>
　　　　　　 <br>
　　　　　　27：堆积层用化石来解释，最下一层的化石肯定最简单最古老，到了最上面一层，可能就出土你老祖宗的遗骸了。 <br>
　　　　　　 <br>
　　　　　　28：一座山现在是背斜现在怎么变成向斜了那？就像一个人出生时是个小男孩80岁后就变成老太婆了。 <br>
　　　　　　 <br>
　　　　　　29：解释倒置地形：一个同学进来时候全校第一，但他在这里除了学习什么都做，一个学期他就倒数第一了，这就是倒置。 <br>
　　　　　　 <br>
　　　　　　30：有句话叫&ldquo;自古华山一条路&rdquo;。山上这条路，下山还是这条路，如果说还有一条的话，就是自由落体了。 <br>
　　　　　　 <br>
　　　　　　31：下面我们来讲火山，有些同学前面讲的山都不喜欢，就对火山感兴趣，上课的时候也希望我时不时火山爆发一下。 <br>
　　　　　　 <br>
　　　　　　32：后面几位同学灵魂又要游离到身体外面了，我居然还要当你们灵魂的守护者，随时帮你们把它招回来。 <br>
　　　　　　 <br>
　　　　　　33：有的火山我们已经可以盖棺定论了，他们长得像火山，但已经动不了了，但还有比如地中海沿岸的火山，时不时就有火光发出，甚至可以作为地中海航行的灯塔了。 <br>
　　　　　　 <br>
　　　　　　34：现在，男同学和女同学，听懂了的请举手，两种都不是的，可以不举。 <br>
　　　　　　 <br>
　　　　　　35：现在我们的时间利用率应达到NBA第四场的最后一分钟。 <br>
　　　　　　 <br>
　　　　　　36：哪个同学再发出声音的话，枭首示众。 <br>
　　　　　　 <br>
　　　　　　37：在我讲的时候除了教室的回音外，不允许有其它任何声音。 <br>
　　　　　　 <br>
　　　　　　 <br>
　　　　　　38：所有的岩石，当他们厌倦岩石生涯的时候，都可以借外力回到地下，重新投胎。 <br>
　　　　　　 <br>
　　　　　　39：如果一条公路沿途不经过一个城市，那等于是给野人修的。 <br>
　　　　　　 <br>
　　　　　　41：洪水是不会乖乖跟著河谷流的，它脾气比我还大。 <br>
　　　　　　 <br>
　　　　　　42：从上次抽查的结果来看，大部分同学死定了。 <br>
　　　　　　 <br>
　　　　　　43：我现在是在帮你们，有一两个混蛋还不听，马上要死了，给你救命稻草都不要，视死如归，可歌可泣。 <br>
　　　　　　 <br>
　　　　　　44：我知道我的声音不好听，对某些同学来说简直是噪声，如果你不想听，你可以到外面晒太阳，在阴冷的教室里听我的噪声，对你来说简直是折磨，会影响你生长发育是吧。 <br>
　　　　　　 <br>
　　　　　　45：以苏洁同学为例，整张试卷他就做对了两题，我不知道他那肥硕的大脑袋里装的是什么，学习是要靠记忆的，就像我怎么知道苏洁的，如果我不用记忆，我只能说那是只长著巨大脑袋的动物。（苏洁，我们班第一号胖子。比李卵还胖） <br>
　　　　　　 <br>
　　　　　　46：有的同学到现在一道题都没做对，这是人类的悲哀，你看苏洁他还在恬不知耻地笑，那张巨大的脸全是由脸皮构成的。 <br>
　　　　　　 <br>
　　　　　　47：这种题做错是不容易的。 <br>
　　　　　　 <br>
　　　　　　48：者题选错的同学，我强烈建议你立即下沉到地底。 <br>
　　　　　　 <br>
　　　　　　49：咸海地区的沙尘暴厉害到什么程度，沙子伴著盐刮到你脸上，刮了几次，你人就成一块咸肉了。（妈的，博学） <br>
　　　　　　 <br>
　　　　　　50：你声音怎么这么小，你不该来这儿，你应该去聋哑学校。 <br>
　　　　　　 <br>
　　　　　　51：热带季风气候居然写成了沙漠气候，难道我们这儿，你的家乡是一片沙漠？还是你的大脑是一片沙漠。 <br>
　　　　　　 <br>
　　　　　　52：如果这一道题你选D，你以后千万不要和人说你高中时学过地理。 <br>
　　　　　　 <br>
　　　　　　53：我罚你们抄，不是我不原谅你们，是科学不原谅你们。 <br>
　　　　　　 <br>
　　　　　　54：问你气压高低，你答什么反气旋，问你是男是女，你说你吃过饭了？ <br>
　　　　　　 <br>
　　　　　　55：我们要感谢细菌微生物，如果没有它们，地球上将被以前的尸体覆盖，你100代祖宗的样子现在还栩栩如生。 <br>
　　　　　　 <br>
　　　　　　56：当我们中国人还是野人的时候，我们就活跃在黄河流域。所以有人说怪不得我们是黄种人，就是从黄河流域跑出来的人。 <br>
　　　　　　 <br>
　　　　　　57：我们学校有些学生来这里纯粹只是为给学校小店创收益。 <br>
　　　　　　 <br>
　　　　　　58：有些人来学校里除了读书什么都做。 <br>
　　　　　　 <br>
　　　　　　59：字典里什么叫混蛋，这个同学就是原始定义。 <br>
　　　　　　 <br>
　　　　　　60：为什么叫石灰岩，它能烧出石灰就是石灰岩，它能烧出水泥就是水泥岩了。 <br>
　　　　　　 <br>
　　　　　　第4辑 <br>
　　　　　　61：那边那个混蛋请站起来一下。 <br>
　　　　　　 <br>
　　　　　　62：向斜从中间到两边出土的化石会越来越新，到最边上这一带甚至会出土你老祖宗的化石。 <br>
　　　　　　 <br>
　　　　　　63：试卷上的这两张烂图……证明了中国印刷术的倒退。 <br>
　　　　　　 <br>
　　　　　　64：你们这些同学下课就往小店跑的，可能在无形中就破坏了内蒙古的草原，因为你们买那些甘草蜜饯啊，甘草是只有蒙古草原出产的。 <br>
　　　　　　 <br>
　　　　　　65：你是混蛋，但还不算坏蛋。 <br>
　　　　　　 <br>
　　　　　　66：这题如果你答阔叶林的话，我会毫不犹豫代表地理学，把你打死。 <br>
　　　　　　 <br>
　　　　　　67：亚洲的风性气候，你们记住三只鸡：热鸡（热季），野鸡（用土话念的&ldquo;亚季&rdquo;），瘟鸡（温季） <br>
　　　　　　 <br>
　　　　　　68：你们同学白天上课时的音量比晚自习时小多了，这是极不正常的，如果这种情况出现在野生动物身上，那就意味著大的自然灾害即将到来。 <br>
　　　　　　 <br>
　　　　　　69：东北的河水跟我们这不一样，一年有两次汛期，所以东北人一年有两次淹死的机会。 <br>
　　　　　　 <br>
　　　　　　70：这题选c的同学，有明显的反人类倾向。 <br>
　　　　　　 <br>
　　　　　　71：笔不要转，转你的大脑。 <br>
　　　　　　 <br>
　　　　　　73：如果哪个同学说西北高温多雨的话，我强烈建议他在吹西北风的时候，脱光衣服，去操场上跑两圈，好好享受他的高温多雨。 <br>
　　　　　　 <br>
　　　　　　74：我发现我们班有一位女同学，无论我说什么，她都以一个火星人的态度旁观这一切，注意，我现在说的是太阳系的知识，你火星人也有关系的啊。 <br>
　　　　　　 <br>
　　　　　　75：有的同学无论我说什么他都始终面无表情，你是不是有面瘫啊？你跟史泰龙什么关系？ <br>
　　　　　　 <br>
　　　　　　76：现在后排有些同学，他始终带著忧郁的表情坐在那儿思考，什么也不做。在他的脸上我看到了范仲淹的风采，先天下之忧而忧。 <br>
　　　　　　 <br>
　　　　　　77：我给一个学生讲什么是东南风，讲了半个小时他还是不懂，我跟只猴子它都懂了！ <br>
　　　　　　 <br>
　　　　　　78：现在我们教室低纬地区的个别女同学请注意。 <br>
　　　　　　 <br>
　　　　　　79：你这个混蛋的作业是白板，你这种人以后考试考得好的话是对科学的侮辱。 <br>
　　　　　　 <br>
　　　　　　80：大家都是高级灵掌类，差别怎么就那么大呢？ <br>
第5辑<br>
81：你们现在前面应该是有所显示的，XX同学前方却是该页无法显示。<br>
<br>
82：不能以貌取山。（讲背斜向斜时）<br>
<br>
83：（接上条）举个例子，沈XX（男生）到了80多岁，越来越老了，象个老太婆。（其中得出结论：看东西要看本质。<br>
<br>
84：沈XX出去旅游，在山脚下捡到半个恐龙蛋的化石，到了山顶，突然他被绊倒了，一半的化石变了4半，但他却热泪盈眶，因为绊他的是刚才捡到的恐龙蛋化石的祖先的头颅，请问，这是背斜还是向斜？（答案：向斜）<br>
<br>
85：沈XX去云南旅游，再也没有回来，他可能有3种死法：1地震震死2火山喷死3泥流河冲死的<br>
<br>
86：沈XX造了100多层的大厦，他在楼顶上洋洋自得时，地下断层实在承受不住了，结果…<br>
<br>
87：沈XX用气功一掌P开了一块石头，没什么好惊讶的，那石头已经被风化了。<br>
<br>
88：我们苏州这里生产花岗岩，天安门那的就是我们这里运去的，所以不难想象，我们这里的学生为什么这样的冥顽不灵。<br>
<br>
89：如果没有内力，只有外力的话，外星人看地球，就是一个被拨皮的鸡蛋。<br>
<br>
90：强烈提醒，会考结束后有些同学不要去华山玩。不要想不开。（请结合华山形象来想这话）<br>
<br>
91：好，大家抓紧时间笑一笑，我要继续往下讲,对了，我要额外提醒某些同学，虽然老师的课讲得好，但你千万别不舍得升级，据我所知本班有同学连续听我的课已经3年了，都在高一，要签名吗？要的话你就直说嘛……<br>
<br>
<br>
<br>
第六辑:(绝对真实) <br>
1所谓高低气压都是对同一平面而言。高空的高压，永远比不过低空的低压，就象全国幼儿园打架总冠军，被我们班某某同学（最瘦弱的）一拳打倒一样 <br>
<br>
2某些同学对老鸭面情有独钟，可是对等压面一窍不通 <br>
<br>
3运转你的大脑，这是自转，然后紧紧跟着我上课的思路，这是公转。<br>
<br>
4某某同学在美国加州的海滩上狠狠摔了一跤，然后泪水和门牙摔掉的血水一起流下来了，为什么？他在绊倒他的瓶子里看到了80年前他祖父在太仓写给他的信。（洋流）<br>
<br>
5小行星带是怎么回事呢，为了防止火星把木星烧掉，它不惜粉身碎骨，充当了防火隔离带。 <br>
<br>
6凡是祥林嫂式目光维持66秒以上的，基本可以断定，她的灵魂已经游离于肉体之外 <br>
<br>
7一天，我和沈某某分别到南极点和赤道去科学考察，就在这时，地球自转出了故障停了下来，那么沈某将以最快的速度飞离地球，而我则成为地球上唯一幸免下来的人。因为我在极点，没有速度。 <br>
<br>
8印度人真的很可怜。每年他们都有四次死去的机会。旱季来临，他们将面临干死，热死（旱季后期有个热季），闷死（印度低压），然后紧接着到来的西南季风带来的洪水又将剩下的人淹死。 <br>
<br>
9东北的害虫活得累啊，强忍着熬过漫长的零下几十度的冬季，好容易剩下那么几条，就是为了来年能吃上一口庄稼叶子，我们能忍心把它消灭吗？所以，东北很容易建成最大的绿色食品基地。 <br>
<br>
10沈某的父亲平生最大的爱好就是吃哈密瓜，所以回大陆投资的时候，他毫不犹豫选择了新疆，把工厂建在了沙漠旁边。（个人因素对工业区位的影响） <br>
<br>
11沈某的父亲在海外发了财，回家乡投资建了一家电解铜厂。没想到一开工，他的家乡就陷入一片黑暗：原来这个工厂把镇上的电全消耗掉了。（动力指向型工业应靠近动力基地） <br>
<br>
12沈某的舅舅开了一个工厂，专门为波音飞机公司生产飞机发电机外罩后半叶左下方第三排第四个螺丝钉，结果这个工厂养活了村里的30多个人，他舅舅还发了大财（工业的分散化和专业化） <br>
<br>
13沈某看到今年西瓜卖到了3元一斤，一发火把100亩冬瓜地全改种西瓜，没想到第二年西瓜3毛钱一斤而冬瓜3元一斤。沈某的头马上比西瓜还大了。（市场对农业区位的影响） <br>
<br>
14沈某坐在第二排第三个，这是他的地理位置；在他前后左右都是年级前100名的同学，所以他很快从年级500名进到了250，这就是区位的影响。 <br>
<br>
15我不知道某些发达国家会不会有一天下狠令，所有妇女一律不允许上大学。因为他们发现妇女的生育率与受教育水平成反相关。这个决定会影响到民族的命运-----持续的负增长，将使一些民族从地球上消失。。 <a href="http://hi.baidu.com/rover828/blog/item/835a6a81cf9e08dfbd3e1ee4.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/rover828/blog/category/%D0%DD%CF%D0%D3%E9%C0%D6">休闲娱乐</a>&nbsp;<a href="http://hi.baidu.com/rover828/blog/item/835a6a81cf9e08dfbd3e1ee4.html#comment">查看评论</a>]]></description>
        <pubDate>2008年11月06日 星期四  下午 06:54</pubDate>
        <category><![CDATA[休闲娱乐]]></category>
        <author><![CDATA[rover828]]></author>
		<guid>http://hi.baidu.com/rover828/blog/item/835a6a81cf9e08dfbd3e1ee4.html</guid>
</item>


</channel>
</rss>