<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[我在说's blog]]></title>
  <subtitle type="html"><![CDATA[说人,说事,聊生活]]></subtitle>
  <id>http://www.wozaishuo.com.cn/</id> 
  <link rel="alternate" type="text/html" href="http://www.wozaishuo.com.cn/" /> 
  <link rel="self" type="application/atom+xml" href="http://www.wozaishuo.com.cn/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.4.1022">PJBlog2</generator> 
  <updated>2008-06-22T22:33:54+08:00</updated> 

  <entry>
	  <title type="html"><![CDATA[Spring IoC查缺补漏篇]]></title>
	  <author>
		 <name>一分钱</name>
		 <uri>http://www.wozaishuo.com.cn/</uri>
		 <email>lmy0921@163.com</email>
	  </author>
	  <category term="" scheme="http://www.wozaishuo.com.cn/default.asp?cateID=26" label="Java | 我的工作" /> 
	  <updated>2008-06-22T22:33:54+08:00</updated>
	  <published>2008-06-22T22:33:54+08:00</published>
		  <summary type="html"><![CDATA[spring 中加载xml配置文件的方式,好像有3种, xml是最常见的spring 应用系统配置源。Spring中的几种容器都支持使用xml装配bean，包括：<br/>&nbsp;&nbsp;&nbsp;&nbsp;XmlBeanFactory ，<br/>&nbsp;&nbsp;&nbsp;&nbsp;ClassPathXmlApplicationContext ，<br/>&nbsp;&nbsp;&nbsp;&nbsp;FileSystemXmlApplicationContext ，<br/>&nbsp;&nbsp;&nbsp;&nbsp;XmlWebApplicationContext <br/> <br/><br/>一:XmlBeanFactory 引用资源<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Resource resource = new ClassPathResource(&#34;appcontext.xml&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeanFactory factory = new XmlBeanFactory(resource);<br/><br/>二:ClassPathXmlApplicationContext&nbsp;&nbsp;编译路径<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext factory=new ClassPathXmlApplicationContext(&#34;classpath:appcontext.xml&#34;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext factory=new ClassPathXmlApplicationContext(&#34;appcontext.xml&#34;);&nbsp;&nbsp; // src目录下的<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext factory=new ClassPathXmlApplicationContext(&#34;conf/appcontext.xml&#34;);&nbsp;&nbsp; // src/conf 目录下的<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext factory=new ClassPathXmlApplicationContext(&#34;file:G:/Test/src/appcontext.xml&#34;);<br/><br/>三 : 用文件系统的路径<br/><br/>&nbsp;&nbsp;ApplicationContext factory=new FileSystemXmlApplicationContext(&#34;src/appcontext.xml&#34;);&nbsp;&nbsp;&nbsp;&nbsp; <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //使用了&nbsp;&nbsp;classpath:&nbsp;&nbsp;前缀,作为标志,&nbsp;&nbsp;这样,FileSystemXmlApplicationContext 也能够读入classpath下的相对路径<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext factory=new FileSystemXmlApplicationContext(&#34;classpath:appcontext.xml&#34;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext factory=new FileSystemXmlApplicationContext(&#34;file:G:/Test/src/appcontext.xml&#34;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext factory=new FileSystemXmlApplicationContext(&#34;G:/Test/src/appcontext.xml&#34;);<br/><br/><br/>四: XmlWebApplicationContext&nbsp;&nbsp; 是专为Web工程定制的。<br/><br/> ServletContext servletContext = request.getSession().getServletContext();&nbsp;&nbsp;&nbsp;&nbsp;<br/> ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext );<br/><br/> ]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.wozaishuo.com.cn/default.asp?id=301" /> 
	  <id>http://www.wozaishuo.com.cn/default.asp?id=301</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Struts2中使用Common-FileUpload实现文件上传 ]]></title>
	  <author>
		 <name>一分钱</name>
		 <uri>http://www.wozaishuo.com.cn/</uri>
		 <email>lmy0921@163.com</email>
	  </author>
	  <category term="" scheme="http://www.wozaishuo.com.cn/default.asp?cateID=26" label="Java | 我的工作" /> 
	  <updated>2008-06-22T14:59:53+08:00</updated>
	  <published>2008-06-22T14:59:53+08:00</published>
		  <summary type="html"><![CDATA[在web应用中，文件上传似乎是很常见的，但是采用传统的方法不但复杂而且难以控制，需要写很多代码，像控制文件大小、文件类型的过滤、存放目录等等。这些复杂的问题在Struts2中已经不存在了，struts2默认使用common-fileupload实现文件的上传。在struts.properties中我们可以看到:struts.multipart.parser=Jakarta 。下面我们就以Common-FileUpload来实现文件上传。<br/><br/>首先，把commons-fileupload.jar和commons-io.jar拷贝到classpath路径下。<br/><br/>建立一个上传文件的页面，upload.jsp。<br/><br/><br/><br/>&lt;%@ page contentType=&#34;text/html; charset=utf-8&#34; %&gt;<br/>&lt;%@taglib prefix=&#34;s&#34; uri=&#34;/struts-tags&#34;%&gt;<br/>&lt;! DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Transitional//EN&#34; &#34;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" target="_blank">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>&#34; &gt; <br/>&lt;html xmlns =&#34;<a href="http://www.w3.org/1999/xhtml" target="_blank">http://www.w3.org/1999/xhtml</a>&#34; &gt; <br/>&lt;head&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt; Struts 2 File Upload &lt;/title &gt; <br/>&lt;/head &gt; <br/>&lt;body &gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;div style=&#34;color.red&#34;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:fielderror /&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:form action =&#34;upload&#34; method =&#34;post&#34; enctype =&#34;multipart/form-data&#34; &gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:textfield name =&#34;title&#34; label =&#34;文件标题&#34; /&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:file name =&#34;upload&#34; label =&#34;选择文件&#34; /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:submit value=&#34;上传&#34; /&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/s:form&gt;<br/>&lt;/body &gt; <br/>&lt;/html &gt; <br/><br/>上传成功后的succ.jsp<br/><br/><br/><br/>&lt;%@ page contentType=&#34;text/html;charset=utf-8&#34; %&gt;<br/>&lt;%@ taglib prefix=&#34;s&#34; uri=&#34;/struts-tags&#34;%&gt;<br/>&lt;! DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Transitional//EN&#34; &#34;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" target="_blank">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>&#34; &gt; <br/>&lt;html xmlns =&#34;<a href="http://www.w3.org/1999/xhtml" target="_blank">http://www.w3.org/1999/xhtml</a>&#34; &gt; <br/>&lt;head&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt; Struts 2 File Upload &lt;/title &gt; <br/>&lt;/head&gt; <br/>&lt;body&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;div style =&#34;padding: 3px; border: solid 1px #cccccc; text-align: center&#34; &gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;img src =&#39;upload/&lt;s:property value =&#34;uploadFileName&#34; /&gt; &#39; /&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br /&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;s:property value =&#34;title&#34; /&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div &gt; <br/>&lt;/body &gt; <br/>&lt;/html &gt; <br/><br/>然后编写UploadAction.java<br/><br/><br/><br/>/** *//** <br/> *<br/> * @author &lt;a href=&#34;mailto:flustar2008@163.com&#34;&gt;flustar&lt;/a&gt;<br/> * @version 1.0 <br/> * Creation date: Feb 15, 2008 10:24:36 PM<br/> */<br/>package test;<br/><br/>import java.io.File;<br/>import java.io.FileInputStream;<br/>import java.io.FileOutputStream;<br/><br/>import o&#114;g.apache.struts2.ServletActionContext;<br/><br/>import com.opensymphony.xwork2.ActionSupport;<br/><br/>public class UploadAction extends ActionSupport{<br/>&nbsp;&nbsp;&nbsp;&nbsp;private static final long serialVersionUID = -7887613751080170362L;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private String title;//设置上传文件的标题<br/>&nbsp;&nbsp;&nbsp;&nbsp;private File upload;//封装上传文件<br/>&nbsp;&nbsp;&nbsp;&nbsp;private String uploadFileName;//设置上传文件的文件名<br/>&nbsp;&nbsp;&nbsp;&nbsp;private String uploadContentType;//上传文件的类型<br/>&nbsp;&nbsp;&nbsp;&nbsp;private String savePath;//上传文件的保存路径<br/>&nbsp;&nbsp;&nbsp;&nbsp;public String getTitle() {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return title;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setTitle(String title) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.title = title;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;public File getUpload() {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return upload;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setUpload(File upload) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.upload = upload;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public String getUploadFileName() {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return uploadFileName;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setUploadFileName(String uploadFileName) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.uploadFileName = uploadFileName;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;public String getUploadContentType() {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return uploadContentType;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setUploadContentType(String uploadContentType) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.uploadContentType = uploadContentType;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;public String getSavePath() {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ServletActionContext.getServletContext().getRealPath(savePath));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ServletActionContext.getServletContext().getRealPath(savePath);<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setSavePath(String savePath) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.savePath = savePath;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&#34;savePath: &#34;+savePath);<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;public String execute()throws Exception{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileOutputStream fos=new FileOutputStream(getSavePath()+&#34;\\&#34;+getUploadFileName());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInputStream fis=new FileInputStream(getUpload());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[] buffer=new byte[1024];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int len=0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((len=fis.read(buffer))&gt;0){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fos.write(buffer, 0, len);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return SUCCESS;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>}<br/><br/><br/>编写struts.xml<br/><br/><br/><br/>&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34; ?&gt;<br/>&lt;!DOCTYPE struts PUBLIC<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#34;-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#34;<a href="http://struts.apache.org/dtds/struts-2.0.dtd" target="_blank">http://struts.apache.org/dtds/struts-2.0.dtd</a>&#34;&gt;<br/>&lt;struts&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;package name=&#34;blog&#34; extends=&#34;struts-default&#34;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&lt;action name=&#34;upload&#34; class=&#34;test.UploadAction&#34;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- Struts2内置的文件上传拦截器 --&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;interceptor-ref name=&#34;fileUpload&#34;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name=&#34;allowedTypes&#34;&gt;image/bmp,image/x-png,image/gif,image/pjpeg&lt;/param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name=&#34;maximumSize&#34;&gt;2048000&lt;/param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/interceptor-ref&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;interceptor-ref name=&#34;defaultStack&#34; /&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name=&#34;savePath&#34;&gt;/upload&lt;/param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;result&gt;/succ.jsp&lt;/result&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;result name=&#34;input&#34;&gt;/upload.jsp&lt;/result&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/action&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&lt;/package&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&lt;/struts&gt;<br/><br/>编写struts.properties<br/><br/> <br/><br/>struts.custom.i18n.resources=mess<br/><br/>struts.multipart.parser=jakarta<br/><br/>struts.multipart.maxSize=10000000<br/><br/> <br/><br/>编写国际化的资源文件mess.properties<br/><br/> <br/><br/>struts.messages.error.content.type.not.allowed=&#34;Thetypeisnotbeallowed!&#34;<br/><br/>struts.messages.error.file.too.large=&#34;Thefileistoolarge!&#34;<br/><br/>struts.messages.error.uploading=&#34;unknownerror&#34;<br/><br/> <br/><br/>在这里我没有把调试的过程写出来，这完全没必要，网上已经有很多这方面的例子了，但是网上好多例子都有一个通病，那就是错误的信息实在是太多了，都是搜索引擎惹得祸。按照上面的步骤来做，很难成功！我按照上面的步骤来操作，发现两个比较普遍的错误：<br/><br/>1） 不能上传png和jpg类型的图片。解决办法可以参考上面的struts.xml。<br/><br/>2） 上传过大的文件没有提示信息，而是直接抛出下面的异常:<br/><br/>&nbsp;&nbsp; o&#114;g.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (2359629) exceeds the configured maximum (2097152)<br/><br/>为什么会出现这个错误？刚开始我还以为是Struts2的一个bug，于是我就开始研究是struts2内置的fileUpload拦截器，我研究了FileUploadInterceptor.java的源代码并调试了半天依然不能解决这个问题，我都被它快折磨死了。最后我想起了在我们编写struts.properties中有这么一句struts.multipart.parser=Jakarta，实际上这一句也可以不写因为这是struts2为了支持文件上传默认的。那么这个Jakarta到底是什么东西呢？实际上Jakarta实际上就是org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest类。打开JakartaMultiPartRequest.java的源代码你会发现这个类实现了MultiPartRequest接口，在这个类封装了对底层ServletFileUpload的操作，由于common-fileupload组件默认最大支持上传文件的大小为2M,当我们上传大于2M的文件时，就会出现上面的异常。是这个异常的发生导致了fileUpload拦截器没有机会执行，所以我看到的是页面没有任何变化，也没有任何提示信息，只是在控制台打印出了上面的异常。解决的办法在struts.properties文件中把struts.multipart.maxSize设置成一个比较大的值，也是就说maxSize远远要大于可能上传文件的大小和fileUpload拦截器中maxinumSize的值，可参见上面的struts.xml和struts.properties文件。<br/><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.wozaishuo.com.cn/default.asp?id=300" /> 
	  <id>http://www.wozaishuo.com.cn/default.asp?id=300</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[PHP显示出错提示的三种方法]]></title>
	  <author>
		 <name>一分钱</name>
		 <uri>http://www.wozaishuo.com.cn/</uri>
		 <email>lmy0921@163.com</email>
	  </author>
	  <category term="" scheme="http://www.wozaishuo.com.cn/default.asp?cateID=35" label="php |我很好奇" /> 
	  <updated>2008-06-22T09:01:33+08:00</updated>
	  <published>2008-06-22T09:01:33+08:00</published>
		  <summary type="html"><![CDATA[　PHP在页面上显示出错消息并让用户看见是开发人员怎么样也不愿意面对的，但是谁都不想在一台没有配置成显示出错消息的服务器上用PHP开发代码。开发时显示PHP的错误消息对开发人员来说是个明智的选择，所谓工具是使人方便的，就是如此。<br/><br/>　　下面来说说显示PHP错误提示消息的三个方法。<br/><br/>　　一：php.ini配置<br/><br/>　　php.ini配置中与此相关的有两个配置变量。下面是这两个变量及其默认值：<br/><br/>以下是引用片段：<br/>display_errors = Off<br/>error_reporting = E_ALL &amp; ~E_NOTICE <br/><br/><br/>　　display_errors 变量的目的很明显 —— 它告诉PHP是否显示错误。默认值是 Off。现在我们的目的是显示错误提示，那么：<br/><br/>以下是引用片段：<br/>display_errors = On <br/><br/><br/>　　E_ALL，这个设置会显示从不良编码实践到无害提示到出错的所有信息。E_ALL 对于开发过程来说有点太细，因为它连变量未初始化也显示提示，而这一点正是PHP“高级”的一个特征。幸好，error_reporting的默认值是“E_ALL &amp; ~E_NOTICE”，这样就只看到错误和不良编码了，对程序无不利的提示则不会显示。<br/><br/>　　修改php.ini后需要重新启动Apache，这样才可以在apache中生效，当然你如果只在命令行下测试程序，是不需要这一步的。<br/><br/>　　二：Apache的httpd.conf和.htaccess配置<br/><br/>　　如果要在.htaccess 文件中的指令来修改 PHP 的配置设定。需要有“AllowOverride Options”或“AllowOverride All”权限才可以。 请参见：AllowOverride 指令<a href="http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/core.html" target="_blank"><a href="http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/core.html" target="_blank">http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/core.html</a></a>#allowoverride<br/><br/>　　AllowOverride指令确定允许存在于.htaccess文件中的指令类型，它仅在不包含正则表达式的配置段中才是有效的。<br/><br/>　　如果此指令被设置为None ，那么.htaccess文件将被完全忽略。事实上，服务器根本不会读取.htaccess文件。<br/><br/>　　当此指令设置为 All时，所有具有&#34;.htaccess&#34;作用域的指令都允许出现在.htaccess文件中。<br/><br/>　　例如以下指令只允许在.htaccess中使用AuthConfig和Indexes组的指令：<br/><br/>以下是引用片段：<br/>AllowOverride AuthConfig Indexes&nbsp;&nbsp;<br/><br/><br/>　　.htaccess里的设置和httpd.conf是一样的。<br/><br/>　　要在做在httpd.conf实现这一功能，需要把下列各行添加到 httpd.conf，以覆盖php.ini文件做出的配置：<br/><br/>以下是引用片段：<br/>php_flag&nbsp;&nbsp;display_errors&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;on<br/>php_value error_reporting&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2039 <br/><br/><br/>　　这会覆盖在 php.ini 文件中为 display_errors 已经设置的标志，以及 error_reporting 的值。值 2039 代表 E_ALL &amp; ~E_NOTICE。如果愿意采用 E_ALL，请把值设为 2047。同样，还是要重启 Apache。<br/><br/>　　httpd.conf对php宏定义设置的具体用法可以参见：<a href="http://www.php.net/manual/zh/configuration.changes.php" target="_blank"><a href="http://www.php.net/manual/zh/configuration.changes.php" target="_blank">http://www.php.net/manual/zh/configuration.changes.php</a></a><br/><br/>　　你可以注意到，上面我们没有使用“E_ALL &amp; ~E_NOTICE”这样的宏定义。这是因为这些宏定义都是php的变量，apache是不认识的，所以我们使用与其等同的值来设置。相关的信息和说明请见：<a href="http://www.php.net/manual/zh/ref.errorfunc.php" target="_blank"><a href="http://www.php.net/manual/zh/ref.errorfunc.php" target="_blank"><a href="http://www.php.net/manual/zh/ref.errorfunc.php" target="_blank"><a href="http://www.php.net/manual/zh/ref.errorfunc.php" target="_blank">http://www.php.net/manual/zh/ref.errorfunc.php</a></a></a></a>#errorfunc.constants<br/><br/>　　下面给出一个简单的对应值：<br/><br/>以下是引用片段：<br/>值 宏定义 <br/>1 E_ERROR&nbsp;&nbsp;<br/>2 E_WARNING&nbsp;&nbsp;<br/>4 E_PARSE&nbsp;&nbsp;<br/>8 E_NOTICE&nbsp;&nbsp;<br/>16 E_CORE_ERROR&nbsp;&nbsp;<br/>32 E_CORE_WARNING&nbsp;&nbsp;<br/>64 E_COMPILE_ERROR&nbsp;&nbsp;<br/>128 E_COMPILE_WARNING&nbsp;&nbsp;<br/>256 E_USER_ERROR&nbsp;&nbsp;<br/>512 E_USER_WARNING&nbsp;&nbsp;<br/>1024 E_USER_NOTICE&nbsp;&nbsp;<br/>6143 E_ALL&nbsp;&nbsp;<br/>2048 E_STRICT&nbsp;&nbsp;<br/>4096 E_RECOVERABLE_ERROR&nbsp;&nbsp;<br/><br/><br/>　　三：程序中改变<br/><br/>　　以上所介绍的都是配置文件里面做设置，如果你没有这个权限，或者只想测试一个程序，那么你可以使用两个函数来做到这一点。<br/><br/>　　它们分别是：<br/><br/>以下是引用片段：<br/>string ini_set ( string $varname , string $newvalue )<br/><br/>int error_reporting ([ int $level ] )<br/> <br/><br/><br/>　　两个函数大同小异，error_reporting()看上去是ini_set()的error_reporting功能版。事实上我认为也的确如此。<br/><br/>　　在ini_set()中你可以设置display_errors和error_reporting的值，而在error_reporting()中你只能设置error_reporting的值，也就是说，如果服务器默认不显示错误提示，你在error_reporting()中怎么变换都是不管用的。两个函数的参数都可以参见上面提到的数字--宏定义对应值。<br/><br/>　　需要注意，以上两个函数的适用用时间为该函数起，一直到程序结束。它们不会影响到其他的程序。<br/><br/>　　最后：关于PHP的宏定义<br/><br/>　　最后，仍需要说明一点：无论httpd.conf还是ini_set()所设置的宏定义并不是无限的，更多的宏定义值请参看手册中的“php.ini 配置选项列表”：<a href="http://www.php.net/manual/zh/ini.php" target="_blank"><a href="http://www.php.net/manual/zh/ini.php" target="_blank">http://www.php.net/manual/zh/ini.php</a></a><br/><br/>　　在里面列表中有一列为“可修改范围”，里面的值为PHP_INI_* ，所以在使用时需要看清宏定义的可修改范围。在列表的末尾，手册中有提示：<br/><br/>以下是引用片段：<br/>PHP_INI_* 常量的定义 <br/>常量 值 含义 <br/>PHP_INI_USER 1 配置选项可在用户的 PHP 脚本或 Windows 注册表中设置 <br/>PHP_INI_PERDIR 2 配置选项可在 php.ini, .htaccess 或 httpd.conf 中设置 <br/>PHP_INI_SYSTEM 4 配置选项可在 php.ini o&#114; httpd.conf 中设置 <br/>PHP_INI_ALL 7 配置选项可在各处设置 <br/> <br/><br/><br/>　　本文参考资料：<br/><br/>以下是引用片段：<br/><br/>PHP 程序员的调试技术<br/><a href="http://www.ibm.com/developerworks/cn/opensource/os-debug/" target="_blank">http://www.ibm.com/developerworks/cn/opensource/os-debug/</a><br/><br/>AllowOverride 指令<br/><a href="http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/core.html" target="_blank">http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/core.html</a>#allowoverride<br/><br/>怎样修改配置设定<br/><a href="http://www.php.net/manual/zh/configuration.changes.php" target="_blank">http://www.php.net/manual/zh/configuration.changes.php</a><br/><br/>php.ini 配置选项<br/><a href="http://www.php.net/manual/zh/ini.php" target="_blank">http://www.php.net/manual/zh/ini.php</a><br/><br/>运行时配置<br/><a href="http://www.php.net/manual/zh/ref.errorfunc.php" target="_blank"><a href="http://www.php.net/manual/zh/ref.errorfunc.php" target="_blank"><a href="http://www.php.net/manual/zh/ref.errorfunc.php" target="_blank">http://www.php.net/manual/zh/ref.errorfunc.php</a></a></a>#ini.error-reporting<br/><br/>ini_set()<br/><a href="http://www.php.net/manual/zh/function.ini-set.php" target="_blank">http://www.php.net/manual/zh/function.ini-set.php</a><br/><br/>error_reporting()<br/><a href="http://www.php.net/manual/zh/function.error-reporting.php" target="_blank">http://www.php.net/manual/zh/function.error-reporting.php</a><br/><br/>display_errors <br/><a href="http://www.php.net/manual/zh/ref.errorfunc.php" target="_blank"><a href="http://www.php.net/manual/zh/ref.errorfunc.php" target="_blank"><a href="http://www.php.net/manual/zh/ref.errorfunc.php" target="_blank">http://www.php.net/manual/zh/ref.errorfunc.php</a></a></a>#ini.display-errors<br/><br/>预定义常量<br/><a href="http://www.php.net/manual/zh/ref.errorfunc.php" target="_blank"><a href="http://www.php.net/manual/zh/ref.errorfunc.php" target="_blank"><a href="http://www.php.net/manual/zh/ref.errorfunc.php" target="_blank">http://www.php.net/manual/zh/ref.errorfunc.php</a></a></a>#errorfunc.constants<br/> <br/><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.wozaishuo.com.cn/default.asp?id=299" /> 
	  <id>http://www.wozaishuo.com.cn/default.asp?id=299</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[LoadModule php5_module/apache不能启动/加载失败/启动失败]]></title>
	  <author>
		 <name>一分钱</name>
		 <uri>http://www.wozaishuo.com.cn/</uri>
		 <email>lmy0921@163.com</email>
	  </author>
	  <category term="" scheme="http://www.wozaishuo.com.cn/default.asp?cateID=35" label="php |我很好奇" /> 
	  <updated>2008-06-21T16:14:23+08:00</updated>
	  <published>2008-06-21T16:14:23+08:00</published>
		  <summary type="html"><![CDATA[apache不能启动<br/><br/>加入下面两行，apache就不能启动的问题?<br/>LoadModule php5_module modules/php5apache2.dll<br/>AddType application/x-httpd-php .php <br/>这个问题我测试了好长时间，终于发现问题所在，就是由于apache版本的不同，LoadModule?php5_module modules/php5apache2.dll这段代码的配置略有细微处的不同，错误就在这段代码上，应该把?<br/>LoadModule php5_module modules/php5apache2.dll中的php5apache2.dll修改成php5apache2_2.dll,因为你使用的apache是2.2版本的，所以要这么改，改过后正确的配置如下：如果你的php目录是c:\php吧，如果是下面就是正确配置?<br/>LoadModule php5_module &#34;c:/php/php5apache2_2.dll&#34;<br/>AddType application/x-httpd-php .php<br/><br/><br/>你可以对照一下我的配置，能够成功启动?<br/>LoadModule php5_module &#34;F:/SERV/PHP/php5apache2_2.dll&#34;<br/>AddType application/x-httpd-php .php<br/> <br/><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.wozaishuo.com.cn/default.asp?id=298" /> 
	  <id>http://www.wozaishuo.com.cn/default.asp?id=298</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Why an Online MBA? ]]></title>
	  <author>
		 <name>一分钱</name>
		 <uri>http://www.wozaishuo.com.cn/</uri>
		 <email>lmy0921@163.com</email>
	  </author>
	  <category term="" scheme="http://www.wozaishuo.com.cn/default.asp?cateID=11" label="赚钱 | 来点外块" /> 
	  <updated>2008-06-20T14:35:11+08:00</updated>
	  <published>2008-06-20T14:35:11+08:00</published>
		  <summary type="html"><![CDATA[Why an Online MBA? <br/>&#34;Your critical strategic advantage makes the difference between being a successful manager with <br/>superior performance and being the unsuccessful manager whose job is insecure. Your power within the company and your influence over clients depends on your ability to cr&#101;ate competitive strategies. <br/>With every product and service, you must set yourself apart from the competition. &#34; An MBA can help you in consolidating your business knowledge and reach new professional heights. Learn at Switzerland&#39;s Premier Private College and graduate from the second largest British University with students from 92 different countries and 90 places per year: are you ready for the challenge? <br/>Duration Minimum 2 years - Maximum 5 years<br/>Delivery Method<br/>- 99% Online via OnlineCampus with intensive class discussion and collaboration - 1% in a one week compulsory residency. The College o&#114;ganise 5 residencies per year therefore you do have many opportunities to meet the mandatory residential requirements. You can opt to take more than one residency if you like. <br/>Places Strictly limited to 60 per term. Ranking<br/>Among the Top 32 Online MBA&#39;s in the World FT 2007 Distance Learning Survey Tuition Fees 14&#39;000 CHF (Swiss Francs) includes libraries access, OnlineCampus, graduation fees, UoW matriculation fees. Payable in installments with no interest fees. (Approximately 11&#39;500 USD / 8600 EURO / 5800 GBP)<br/>These fees are for the full programme including all courses and the final dissertation. <br/>Not included in these fees: Residency in Switzerland (one is compulsory) 1&#39;000 CHF (Swiss Francs). Some Textbooks are not included (approx cost 450-600 Swiss Francs). Sel&#101;ctivity Ratio<br/>60% of the applicants are invited for an admission interview. Out of 7 applicants one is admitted to the MBA. Majors and Specialisations<br/>over 15 specialisations to choose from. See the full list of Online MBA Majors and Specialisations here Terms<br/>Three terms per year (Hilary, Trinity and Michaelmas)<br/>Accreditation<br/>This Programme is Validated and Awarded by the University of Wales. After successfully completing your studies at the Robert Kennedy College, you will receive a degree from the University of Wales which is duly Accredited by the British Government by means of a Royal Charter.<br/>University of Wales degrees are recognised worldwide.<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.wozaishuo.com.cn/default.asp?id=297" /> 
	  <id>http://www.wozaishuo.com.cn/default.asp?id=297</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[java 创建多级目录]]></title>
	  <author>
		 <name>一分钱</name>
		 <uri>http://www.wozaishuo.com.cn/</uri>
		 <email>lmy0921@163.com</email>
	  </author>
	  <category term="" scheme="http://www.wozaishuo.com.cn/default.asp?cateID=26" label="Java | 我的工作" /> 
	  <updated>2008-06-19T14:31:52+08:00</updated>
	  <published>2008-06-19T14:31:52+08:00</published>
		  <summary type="html"><![CDATA[public static void main(String[] args) {<br/>&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; path=&#34;c:/aaa/bbb/ccc&#34;;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringTokenizer&nbsp;&nbsp; st=new&nbsp;&nbsp; StringTokenizer(path,&#34;/&#34;);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; path1=st.nextToken()+&#34;/&#34;;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String path2 =path1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(&nbsp;&nbsp; st.hasMoreTokens()&nbsp;&nbsp; )&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path1=st.nextToken()+&#34;/&#34;;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path2+=path1; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File&nbsp;&nbsp; inbox&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp;&nbsp;&nbsp; File(path2);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(&nbsp;&nbsp; !inbox.exists())&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inbox.mkdir();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/><br/>&nbsp;&nbsp; }]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.wozaishuo.com.cn/default.asp?id=296" /> 
	  <id>http://www.wozaishuo.com.cn/default.asp?id=296</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[解决mysql 8小时自动断开连接]]></title>
	  <author>
		 <name>一分钱</name>
		 <uri>http://www.wozaishuo.com.cn/</uri>
		 <email>lmy0921@163.com</email>
	  </author>
	  <category term="" scheme="http://www.wozaishuo.com.cn/default.asp?cateID=26" label="Java | 我的工作" /> 
	  <updated>2008-06-19T14:31:15+08:00</updated>
	  <published>2008-06-19T14:31:15+08:00</published>
		  <summary type="html"><![CDATA[<a href="http://grid-devel.sdsc.edu/gd/node/231" target="_blank">http://grid-devel.sdsc.edu/gd/node/231</a>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.wozaishuo.com.cn/default.asp?id=295" /> 
	  <id>http://www.wozaishuo.com.cn/default.asp?id=295</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[C3P0详细配置]]></title>
	  <author>
		 <name>一分钱</name>
		 <uri>http://www.wozaishuo.com.cn/</uri>
		 <email>lmy0921@163.com</email>
	  </author>
	  <category term="" scheme="http://www.wozaishuo.com.cn/default.asp?cateID=30" label="数据  | 数据仓库" /> 
	  <updated>2008-06-17T10:40:42+08:00</updated>
	  <published>2008-06-17T10:40:42+08:00</published>
		  <summary type="html"><![CDATA[官方文档 : <a href="http://www.mchange.com/projects/c3p0/index.html" target="_blank">http://www.mchange.com/projects/c3p0/index.html</a><br/><br/>&lt;c3p0-config&gt; <br/>&lt;default-config&gt; <br/>&lt;!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --&gt; <br/>&lt;property name=&#34;acquireIncrement&#34;&gt;3&lt;/property&gt; <br/><br/>&lt;!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --&gt; <br/>&lt;property name=&#34;acquireRetryAttempts&#34;&gt;30&lt;/property&gt; <br/><br/>&lt;!--两次连接中间隔时间，单位毫秒。Default: 1000 --&gt; <br/>&lt;property name=&#34;acquireRetryDelay&#34;&gt;1000&lt;/property&gt; <br/><br/>&lt;!--连接关闭时默认将所有未提交的操作回滚。Default: false --&gt; <br/>&lt;property name=&#34;autoCommitOnClose&#34;&gt;false&lt;/property&gt; <br/><br/>&lt;!--c3p0将建一张名为Test的空表，并使用其自带的查询语句进行测试。如果定义了这个参数那么 <br/>属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作，它将只供c3p0测试 <br/>使用。Default: null--&gt; <br/>&lt;property name=&#34;automaticTestTable&#34;&gt;Test&lt;/property&gt; <br/><br/>&lt;!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 <br/>保留，并在下次调用getConnection()的时候继续尝试获取连接。如果设为true，那么在尝试 <br/>获取连接失败后该数据源将申明已断开并永久关闭。Default: false--&gt; <br/>&lt;property name=&#34;breakAfterAcquireFailure&#34;&gt;false&lt;/property&gt; <br/><br/>&lt;!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间，超时后将抛出 <br/>SQLException,如设为0则无限期等待。单位毫秒。Default: 0 --&gt; <br/>&lt;property name=&#34;checkoutTimeout&#34;&gt;100&lt;/property&gt; <br/><br/>&lt;!--通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。 <br/>Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester--&gt; <br/>&lt;property name=&#34;connectionTesterClassName&#34;&gt;&lt;/property&gt; <br/><br/>&lt;!--指定c3p0 libraries的路径，如果（通常都是这样）在本地即可获得那么无需设置，默认null即可 <br/>Default: null--&gt; <br/>&lt;property name=&#34;factoryClassLocation&#34;&gt;null&lt;/property&gt; <br/><br/>&lt;!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs. <br/>（文档原文）作者强烈建议不使用的一个属性--&gt; <br/>&lt;property name=&#34;forceIgnoreUnresolvedTransactions&#34;&gt;false&lt;/property&gt; <br/><br/>&lt;!--每60秒检查所有连接池中的空闲连接。Default: 0 --&gt; <br/>&lt;property name=&#34;idleConnectionTestPeriod&#34;&gt;60&lt;/property&gt; <br/><br/>&lt;!--初始化时获取三个连接，取值应在minPoolSize与maxPoolSize之间。Default: 3 --&gt; <br/>&lt;property name=&#34;initialPoolSize&#34;&gt;3&lt;/property&gt; <br/><br/>&lt;!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --&gt; <br/>&lt;property name=&#34;maxIdleTime&#34;&gt;60&lt;/property&gt; <br/><br/>&lt;!--连接池中保留的最大连接数。Default: 15 --&gt; <br/>&lt;property name=&#34;maxPoolSize&#34;&gt;15&lt;/property&gt; <br/><br/>&lt;!--JDBC的标准参数，用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements <br/>属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。 <br/>如果maxStatements与maxStatementsPerConnection均为0，则缓存被关闭。Default: 0--&gt; <br/>&lt;property name=&#34;maxStatements&#34;&gt;100&lt;/property&gt; <br/><br/>&lt;!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 --&gt; <br/>&lt;property name=&#34;maxStatementsPerConnection&#34;&gt;&lt;/property&gt; <br/><br/>&lt;!--c3p0是异步操作的，缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能 <br/>通过多线程实现多个操作同时被执行。Default: 3--&gt; <br/>&lt;property name=&#34;numHelperThreads&#34;&gt;3&lt;/property&gt; <br/><br/>&lt;!--当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0 <br/>的数据源时。Default: null--&gt; <br/>&lt;property name=&#34;overrideDefaultUser&#34;&gt;root&lt;/property&gt; <br/><br/>&lt;!--与overrideDefaultUser参数对应使用的一个参数。Default: null--&gt; <br/>&lt;property name=&#34;overrideDefaultPassword&#34;&gt;password&lt;/property&gt; <br/><br/>&lt;!--密码。Default: null--&gt; <br/>&lt;property name=&#34;password&#34;&gt;&lt;/property&gt; <br/><br/>&lt;!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意： <br/>测试的表必须在初始数据源的时候就存在。Default: null--&gt; <br/>&lt;property name=&#34;preferredTestQuery&#34;&gt;sel&#101;ct id from test wh&#101;re id=1&lt;/property&gt; <br/><br/>&lt;!--用户修改系统配置参数执行前最多等待300秒。Default: 300 --&gt; <br/>&lt;property name=&#34;propertyCycle&#34;&gt;300&lt;/property&gt; <br/><br/>&lt;!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 <br/>时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable <br/>等方法来提升连接测试的性能。Default: false --&gt; <br/>&lt;property name=&#34;testConnectionOnCheckout&#34;&gt;false&lt;/property&gt; <br/><br/>&lt;!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false --&gt; <br/>&lt;property name=&#34;testConnectionOnCheckin&#34;&gt;true&lt;/property&gt; <br/><br/>&lt;!--用户名。Default: null--&gt; <br/>&lt;property name=&#34;user&#34;&gt;root&lt;/property&gt; <br/><br/>&lt;!--早期的c3p0版本对JDBC接口采用动态反射代理。在早期版本用途广泛的情况下这个参数 <br/>允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已经开始 <br/>广泛的被使用，所以这个参数未必有用。现在原先的动态反射与新的非反射代理同时受到 <br/>支持，但今后可能的版本可能不支持动态反射代理。Default: false--&gt; <br/>&lt;property name=&#34;usesTraditionalReflectiveProxies&#34;&gt;false&lt;/property&gt; <br/><br/>&lt;property name=&#34;automaticTestTable&#34;&gt;con_test&lt;/property&gt; <br/>&lt;property name=&#34;checkoutTimeout&#34;&gt;30000&lt;/property&gt; <br/>&lt;property name=&#34;idleConnectionTestPeriod&#34;&gt;30&lt;/property&gt; <br/>&lt;property name=&#34;initialPoolSize&#34;&gt;10&lt;/property&gt; <br/>&lt;property name=&#34;maxIdleTime&#34;&gt;30&lt;/property&gt; <br/>&lt;property name=&#34;maxPoolSize&#34;&gt;25&lt;/property&gt; <br/>&lt;property name=&#34;minPoolSize&#34;&gt;10&lt;/property&gt; <br/>&lt;property name=&#34;maxStatements&#34;&gt;0&lt;/property&gt; <br/>&lt;user-overrides user=&#34;swaldman&#34;&gt; <br/>&lt;/user-overrides&gt; <br/>&lt;/default-config&gt; <br/>&lt;named-config name=&#34;dumbTestConfig&#34;&gt; <br/>&lt;property name=&#34;maxStatements&#34;&gt;200&lt;/property&gt; <br/>&lt;user-overrides user=&#34;poop&#34;&gt; <br/>&lt;property name=&#34;maxStatements&#34;&gt;300&lt;/property&gt; <br/>&lt;/user-overrides&gt; <br/>&lt;/named-config&gt; <br/>&lt;/c3p0-config&gt; <br/><br/><br/>转：<a href="http://www.wujianrong.com/archives/2007/08/c3p0.html" target="_blank">http://www.wujianrong.com/archives/2007/08/c3p0.html</a>解决MYSQL 8小时问题最近的一个项目在Hibernate使用C3P0的连接池，数据库为Mysql。开发测试没有问题，在运行中每个一段长的空闲时间就出现异常:<br/><br/>java 代码org.hibernate.exception.JDBCConnectionException: could not execute query <br/>at o&#114;g.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74) <br/>at o&#114;g.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) <br/>....... <br/>Caused by: com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error: <br/><br/><br/>** BEGIN NESTED EXCEPTION ** <br/><br/>com.mysql.jdbc.CommunicationsException <br/>MESSAGE: Communications link failure due to underlying exception: <br/><br/>** BEGIN NESTED EXCEPTION ** <br/><br/>java.net.SocketException <br/>MESSAGE: Broken pipe <br/><br/>STACKTRACE: <br/><br/>java.net.SocketException: Broken pipe <br/>at java.net.SocketOutputStream.socketWrite0(Native Method) <br/>...... <br/>** END NESTED EXCEPTION ** <br/><br/>查看了Mysql的文档，以及Connector/J的文档以及在线说明发现，出现这种异常的原因是：<br/><br/>Mysql服务器默认的“wait_timeout”是8小时，也就是说一个connection空闲超过8个小时，Mysql将自动断开该 connection。这就是问题的所在，在C3P0 pools中的connections如果空闲超过8小时，Mysql将其断开，而C3P0并不知道该connection已经失效，如果这时有 Client请求connection，C3P0将该失效的Connection提供给Client，将会造成上面的异常。<br/><br/>解决的方法有3种：<br/><br/>增加wait_timeout的时间。 <br/>减少Connection pools中connection的lifetime。 <br/>测试Connection pools中connection的有效性。 <br/>当然最好的办法是同时综合使用上述3种方法，下面就DBCP和C3P0分别做一说明，假设wait_timeout为默认的8小时<br/><br/>DBCP增加以下配置信息:<br/><br/>//set to &#39;Sel&#101;ct 1&#39; <br/>validationQuery = &#34;Sel&#101;ct 1&#34; <br/>//set to &#39;true&#39; <br/>testWhileIdle = &#34;true&#34; <br/>//some positive integer <br/>timeBetweenEvictionRunsMillis = 3600000 <br/>//set to something smaller than &#39;wait_timeout&#39; <br/>minEvictableIdleTimeMillis = 18000000 <br/>//if you don&#39;t mind a hit for every getConnection(), set to &#34;true&#34; <br/>testOnBorrow = &#34;true&#34; <br/><br/>C3P0增加以下配置信息:<br/><br/>//获取connnection时测试是否有效 <br/>testConnectionOnCheckin = true <br/>//自动测试的table名称<br/><br/>automaticTestTable=C3P0TestTable<br/><br/>//set to something much less than wait_timeout, prevents connections from going stale <br/>idleConnectionTestPeriod = 18000 <br/>//set to something slightly less than wait_timeout, preventing &#39;stale&#39; connections from being handed out <br/>maxIdleTime = 25000 <br/>//if you can take the performance &#39;hit&#39;, set to &#34;true&#34; <br/>testConnectionOnCheckout = true <br/><br/>更多的配置信息大家可以查看C3P0文档，Connector/J文档，以及DBCP的文档。<br/><br/>转: <a href="http://www.javaeye.com/article/38506" target="_blank">http://www.javaeye.com/article/38506</a><br/><br/>我自己的配置:<br/><br/>jdbc.driverClass=com.mysql.jdbc.Driver<br/>jdbc.jdbcUrl = jdbc:mysql://localhost:3306/test<br/>jdbc.user = root<br/>jdbc.password = 12345<br/>jdbc.miniPoolSize = 1<br/>jdbc.maxPoolSize = 20<br/>jdbc.initialPoolSize = 1<br/>jdbc.maxIdleTime = 25000<br/>jdbc.acquireIncrement = 1<br/><br/>jdbc.acquireRetryAttempts = 30<br/>jdbc.acquireRetryDelay = 1000<br/>jdbc.testConnectionOnCheckin = true<br/>jdbc.automaticTestTable = c3p0TestTable<br/>jdbc.idleConnectionTestPeriod = 18000<br/>jdbc.checkoutTimeout=3000<br/><br/>&lt;bean id=&#34;dataSource&#34; class=&#34;com.mchange.v2.c3p0.ComboPooledDataSource&#34; destroy-method=&#34;close&#34;&gt;<br/>&nbsp;&nbsp; &lt;property name=&#34;driverClass&#34; value=&#34;${jdbc.driverClass}&#34; /&gt;<br/>&nbsp;&nbsp; &lt;property name=&#34;jdbcUrl&#34; value=&#34;${jdbc.jdbcUrl}&#34; /&gt;<br/>&nbsp;&nbsp; &lt;property name=&#34;user&#34; value=&#34;${jdbc.user}&#34; /&gt;<br/>&nbsp;&nbsp; &lt;property name=&#34;password&#34; value=&#34;${jdbc.password}&#34; /&gt;<br/>&nbsp;&nbsp; &lt;property name=&#34;minPoolSize&#34; value=&#34;${jdbc.miniPoolSize}&#34; /&gt;<br/>&nbsp;&nbsp; &lt;property name=&#34;maxPoolSize&#34; value=&#34;${jdbc.maxPoolSize}&#34;/&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; &lt;property name=&#34;initialPoolSize&#34; value=&#34;${jdbc.initialPoolSize}&#34;/&gt;<br/>&nbsp;&nbsp; &lt;property name=&#34;maxIdleTime&#34; value=&#34;${jdbc.maxIdleTime}&#34;/&gt;<br/>&nbsp;&nbsp; &lt;property name=&#34;acquireIncrement&#34; value=&#34;${jdbc.acquireIncrement}&#34;/&gt;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp; &lt;property name=&#34;acquireRetryAttempts&#34; value=&#34;${jdbc.acquireRetryAttempts}&#34;/&gt;<br/>&nbsp;&nbsp; &lt;property name=&#34;acquireRetryDelay&#34; value=&#34;${jdbc.acquireRetryDelay}&#34;/&gt;<br/>&nbsp;&nbsp; &lt;property name=&#34;testConnectionOnCheckin&#34; value=&#34;${jdbc.testConnectionOnCheckin}&#34;/&gt;<br/>&nbsp;&nbsp; &lt;property name=&#34;automaticTestTable&#34; value=&#34;${jdbc.automaticTestTable}&#34;/&gt;<br/>&nbsp;&nbsp; &lt;property name=&#34;idleConnectionTestPeriod&#34; value=&#34;${jdbc.idleConnectionTestPeriod}&#34;/&gt;<br/>&nbsp;&nbsp; &lt;property name=&#34;checkoutTimeout&#34; value=&#34;${jdbc.checkoutTimeout}&#34;/&gt;<br/><br/>&lt;/bean&gt;<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.wozaishuo.com.cn/default.asp?id=294" /> 
	  <id>http://www.wozaishuo.com.cn/default.asp?id=294</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[自动删除开始菜单文档记录七种方法]]></title>
	  <author>
		 <name>一分钱</name>
		 <uri>http://www.wozaishuo.com.cn/</uri>
		 <email>lmy0921@163.com</email>
	  </author>
	  <category term="" scheme="http://www.wozaishuo.com.cn/default.asp?cateID=12" label="建站 | 共享经验" /> 
	  <updated>2008-06-08T09:54:19+08:00</updated>
	  <published>2008-06-08T09:54:19+08:00</published>
		  <summary type="html"><![CDATA[<p>　　英雄如风剑如虹按：Windows是一个智能化的操作系统，它的出现使得许多不具备计算机专业知识的用户也能够轻松地操纵电脑。但是，Windows有时也会&ldquo;自作聪明&rdquo;，将用户所操作的过程记录下来，如用户在电脑上最近打开的文件就会出现在&ldquo;开始&rarr;文档&rdquo;菜单中，这在一定程度上方便了用户，但是往往有时却给了其它用户一些可乘之机，使他们对我们最近使用过的软件和打开过的文件一览无余。在这里，我们介绍四种自动删除文档记录的方法，其中使用注册表的方法我们曾经介绍过，在此一并列出，以供读者比较和收藏。<br />　　<strong>1．修改注册表法<br /></strong>　　只要进行下列操作就可以自动删除文档记录：单击&ldquo;开始&rarr;运行&rdquo;，输入&ldquo;regedit．exe&rdquo;打开系统注册表编辑器，进入主键&ldquo;HKEY＿USERS\．DEFAULT\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer&rdquo;，在右边窗口新建一个名为&ldquo;NoRecentDocsHistory&rdquo;的DWORD值，并将其值设置为&ldquo;1&rdquo;，然后重启电脑即可。<br />　　<strong>2．批处理文件法</strong><br />　　笔者研究认为，在文档中显示的只不过是存放在Windows的Recent文件夹下的一些快捷方式，只要我们在开机时自动地将它们全部删除就可以保证一些项目以后不显示了。注：以下操作假设Windows安装在&ldquo;C\Windows&rdquo;下，如果你的系统安装在不同的文件夹下，请自行修改。拷贝C\Windows\COMMAND\DELTREE．EXE文件到C盘根目录下，用&ldquo;记事本&rdquo;打开C盘根目录下的&ldquo;AUTOEXEC．BAT&rdquo;文件，加入以下内容：＠echo off Echo Deleting recent Directory deltree /y C\Windows \recent &gt;nul Echo Making recent Directory md C\Windows \recent Echo Starting Windows．．．重新启动你的计算机。<br />　　<strong>3．使用系统工具法<br /></strong>　　除了上面的手动更改之外，我们还可以利用系统工具来实现文档记录的自动删除功能，而这个程序就是在Windows 98安装光盘中的TweakUI工具。我们只要将安装光盘插入光驱中，进入&ldquo;Tools\Reskit\Powertoy&rdquo;文件夹，找到tweakui．inf文件，然后单击鼠标右键，再选择关联菜单的&ldquo;安装&rdquo;即可。接着在&ldquo;控制面板&rdquo;中双击&ldquo;TweakUI&rdquo;图标便可启动它了，单击IE选项卡，在Settings(设置)列表中确认&ldquo;Clear document run typed－URL history on exit(在退出时清除文档、运行程序、链接的URL历史纪录)&rdquo;项的为选中状态，再单击&ldquo;Apply(应用)&rdquo;即可，以后系统就不会在文档菜单中显示历史记录了。<br />　　<strong>4．隐藏文档菜单<br /></strong>　　此法还是使用TweakUI软件，通过它我们可以隐藏&ldquo;开始&rdquo;菜单上的&ldquo;文档&rdquo;项目。按第三种方法进入TweakUI，单击IE标签，然后在设置列表的最后找到&ldquo;ShowDocumentsonStartMenu(在开始菜单中显示文档)&rdquo;项，除去前面的钩，再单击一下&ldquo;Apply&rdquo;就会发现在&ldquo;开始&rdquo;菜单中&ldquo;文档&rdquo;项目不见了。这样就可以保证以后新打开的文件不再加入到文档菜单中了。</p>
<p>&nbsp;&nbsp;&nbsp; 5、<strong>逐个删除</strong></p>
<p>　　这是最简单的方法，点击&ldquo;开始&rdquo;菜单，转到&ldquo;文档&rdquo;子菜单，在要删除的项目上单击右键，然后选择删除，在是否放入回收站的对话框中选择是就可以了。但是这种方法很麻烦，一般情况&ldquo;文档&rdquo;子菜单里就不只一个项，当显示的文档很多是，这种方法就非常的慢，浪费时间。</p>
<p><strong>　　6、一次删除多个记录</strong></p>
<p>　　这种方法比较快，可以一下就把所有的文档显示清除掉。具体的做法是：打开&ldquo;开始&rdquo;菜单，依次选择&ldquo;设置&rarr;任务栏和开始菜单&rdquo;；在任务栏设置对话框中，单击&ldquo;高级&rdquo;选项卡；点击&ldquo;清除&rdquo;按钮（如下图所示）。</p>
<p align="center"><img src="http://www.lan99.com/computer/know/images/11591678351.jpg" alt="" /></p>
<p><strong>　　7、直接删除</strong></p>
<p>　　其实，&ldquo;文档&rdquo;菜单中所显示的项目其实是为这些文件所建立的快捷方式，这些快捷方式全部保存在C:＼Windows＼Recent文件夹中，如果要删除文档记录，只需将Recent文件夹中的内容删除即可。</p>
<p><br /></p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.wozaishuo.com.cn/default.asp?id=293" /> 
	  <id>http://www.wozaishuo.com.cn/default.asp?id=293</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[编程实践笔记{Java 线程 并发处理 Webservice}]]></title>
	  <author>
		 <name>一分钱</name>
		 <uri>http://www.wozaishuo.com.cn/</uri>
		 <email>lmy0921@163.com</email>
	  </author>
	  <category term="" scheme="http://www.wozaishuo.com.cn/default.asp?cateID=26" label="Java | 我的工作" /> 
	  <updated>2008-06-06T15:41:39+08:00</updated>
	  <published>2008-06-06T15:41:39+08:00</published>
		  <summary type="html"><![CDATA[1, 保证线程安全的三种方法:<br/>&nbsp;&nbsp;&nbsp;&nbsp;a, 不要跨线程访问共享变量<br/>&nbsp;&nbsp;&nbsp;&nbsp;b, 使共享变量是final类型的<br/>&nbsp;&nbsp;&nbsp;&nbsp;c, 将共享变量的操作加上同步<br/><br/>2, 一开始就将类设计成线程安全的, 比在后期重新修复它,更容易.<br/><br/>3, 编写多线程程序, 首先保证它是正确的, 其次再考虑性能.<br/><br/>4, 无状态或只读对象永远是线程安全的.<br/><br/>5, 不要将一个共享变量裸露在多线程环境下(无同步或不可变性保护)<br/><br/>6, 多线程环境下的延迟加载需要同步的保护, 因为延迟加载会造成对象重复实例化<br/><br/>7, 对于volatile声明的数值类型变量进行运算, 往往是不安全的(volatile只能保证可见性,不能保证原子性).<br/>详见volatile原理与技巧中, 脏数据问题讨论.<br/><br/>8, 当一个线程请求获得它自己占有的锁时(同一把锁的嵌套使用), 我们称该锁为可重入锁.<br/>在jdk1.5并发包中, 提供了可重入锁的java实现-ReentrantLock.<br/><br/>9, 每个共享变量,都应该由一个唯一确定的锁保护.<br/>创建与变量相同数目的ReentrantLock, 使他们负责每个变量的线程安全.<br/><br/>10,虽然缩小同步块的范围, 可以提升系统性能.<br/>但在保证原子性的情况下, 不可将原子操作分解成多个synchronized块.<br/><br/>11, 在没有同步的情况下, 编译器与处理器运行时的指令执行顺序可能完全出乎意料.<br/>原因是, 编译器或处理器为了优化自身执行效率, 而对指令进行了的重排序(reordering).<br/><br/>12, 当一个线程在没有同步的情况下读取变量, 它可能会得到一个过期值, 但是至少它可以看到那个<br/>线程在当时设定的一个真实数值. 而不是凭空而来的值. 这种安全保证, 称之为最低限的安全性(out-of-thin-air safety)<br/><br/>在开发并发应用程序时, 有时为了大幅度提高系统的吞吐量与性能, 会采用这种无保障的做法.<br/>但是针对, 数值的运算, 仍旧是被否决的.<br/><br/>13, volatile变量,只能保证可见性, 无法保证原子性.<br/>详见 volatile原理与技巧 <br/><br/>14, 某些耗时较长的网络操作或IO, 确保执行时, 不要占有锁.<br/><br/>15, 发布(publish)对象, 指的是使它能够被当前范围之外的代码所使用.(引用传递)<br/>对象逸出(escape), 指的是一个对象在尚未准备好时将它发布.<br/><br/>原则: 为防止逸出, 对象必须要被完全构造完后, 才可以被发布(最好的解决方式是采用同步)<br/><br/>this关键字引用对象逸出<br/>例子: 在构造函数中, 开启线程, 并将自身对象this传入线程, 造成引用传递.<br/>而此时, 构造函数尚未执行完, 就会发生对象逸出了.<br/><br/>16, 必要时, 使用ThreadLocal变量确保线程封闭性(封闭线程往往是比较安全的, 但一定程度上会造成性能损耗)<br/>封闭对象的例子在实际使用过程中, 比较常见, 例如 hibernate openSessionInView机制, jdbc的connection机制.<br/><br/>17, 单一不可变对象往往是线程安全的(复杂不可变对象需要保证其内部成员变量也是不可变的)<br/>良好的多线程编程习惯是: 将所有的域都声明为final, 除非它们是可变的<br/><br/>18, 保证共享变量的发布是安全的<br/>&nbsp;&nbsp;&nbsp;&nbsp;a, 通过静态初始化器初始化对象(jls 12.4.2叙述, jvm会保证静态初始化变量是同步的)<br/>&nbsp;&nbsp;&nbsp;&nbsp;b, 将对象申明为volatile或使用AtomicReference<br/>&nbsp;&nbsp;&nbsp;&nbsp;c, 保证对象是不可变的<br/>&nbsp;&nbsp;&nbsp;&nbsp;d, 将引用或可变操作都由锁来保护<br/><br/>19, 设计线程安全的类, 应该包括的基本要素:<br/>&nbsp;&nbsp;&nbsp;&nbsp;a, 确定哪些是可变共享变量<br/>&nbsp;&nbsp;&nbsp;&nbsp;b, 确定哪些是不可变的变量<br/>&nbsp;&nbsp;&nbsp;&nbsp;c, 指定一个管理并发访问对象状态的策略<br/><br/>20, 将数据封装在对象内部, 并保证对数据的访问是原子的.<br/>建议采用volatile javabean模型或者构造同步的getter,setter.<br/><br/>21, 线程限制性使构造线程安全的类变得更容易, 因为类的状态被限制后, 分析它的线程安全性时, 就不必检查完整的程序.<br/><br/>22, 编写并发程序, 需要更全的注释, 更完整的文档说明.<br/><br/>23, 在需要细分锁的分配时, 使用java监视器模式好于使用自身对象的监视器锁.<br/>前者的灵活性更好.<br/><br/>Object target = new Object();<br/>// 这里使用外部对象来作为监视器, 而非this<br/>synchronized(target) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;// TODO<br/>}<br/><br/>针对java monitor pattern, 实际上ReentrantLock的实现更易于并发编程.<br/>功能上, 也更强大.<br/><br/>24, 设计并发程序时, 在保证伸缩性与性能折中的前提下, 优先考虑将共享变量委托给线程安全的类.<br/>由它来控制全局的并发访问.<br/><br/>25, 使用普通同步容器(Vector, Hashtable)的迭代器, 需要外部锁来保证其原子性.<br/>原因是, 普通同步容器产生的迭代器是非线程安全的.<br/><br/>26, 在并发编程中, 需要容器支持的时候, 优先考虑使用jdk并发容器<br/>(ConcurrentHashMap, ConcurrentLinkedQueue, CopyOnWriteArrayList...).<br/><br/>27, ConcurrentHashMap, CopyOnWriteArrayList<br/>并发容器的迭代器,以及全范围的size(), isEmpty() 都表现出弱一致性.<br/>他们只能标示容器当时的一个数据状态. 无法完整响应容器之后的变化和修改.<br/><br/>28, 使用有界队列, 在队列充满或为空时, 阻塞所有的读与写操作. (实现生产-消费的良好方案)<br/>BlockQueue下的实现有LinkedBlockingQueue与ArrayBlockingQueue, 前者为链表, 可变操作频繁优先考虑,后者为数组, 读取操作频繁优先考虑.<br/>PriorityBlockingQueue是一个按优先级顺序排列的阻塞队列, 它可以对所有置入的元素进行排序(实现Comparator接口)<br/><br/>29, 当一个方法, 能抛出InterruptedException, 则意味着, 这个方法是一个可阻塞的方法, 如果它被中断, 将提前结束阻塞状态.<br/>当你调用一个阻塞方法, 也就意味着, 本身也称为了一个阻塞方法, 因为你必须等待阻塞方法返回.<br/><br/>如果阻塞方法抛出了中断异常, 我们需要做的是, 将其往上层抛, 除非当前已经是需要捕获异常的层次.<br/>如果当前方法, 不能抛出InterruptedException, 可以使用Thread.currentThread.interrupt()方法, 手动进行中断.<br/>===================================================<br/>Webservices :找到项目工程中*.wsdl文件--》Webservices 》Test with webservices exploer<br/> <br/><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.wozaishuo.com.cn/default.asp?id=292" /> 
	  <id>http://www.wozaishuo.com.cn/default.asp?id=292</id> 
  </entry>	
		
</feed>