﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-雅典之夏的小站-随笔分类-JAVA基础＆数据库</title><link>http://www.blogjava.net/rkind/category/4183.html</link><description>&lt;font size=5 align=right&gt;知人者智  自知者明
Fighting!!&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 03:25:31 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 03:25:31 GMT</pubDate><ttl>60</ttl><item><title>简单的Jsp文本计数器</title><link>http://www.blogjava.net/rkind/archive/2006/01/19/28631.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Thu, 19 Jan 2006 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2006/01/19/28631.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/28631.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2006/01/19/28631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/28631.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/28631.html</trackback:ping><description><![CDATA[<P>把以下代码粘贴到首页中，就可以从counter.txt中读取访问量。<BR>一定要注意路径的问题，刚开始直接用counter.txt，结果总是找不到文件，而且用绝对路径也不行，<BR>但是用/counter.txt就没有问题<BR>&lt;%!<BR>int number=0;<BR>&nbsp;&nbsp;&nbsp; synchronized void countPeople(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(number==0){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileInputStream in=new FileInputStream("/counter.txt");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataInputStream dataIn=new DataInputStream(in);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number=dataIn.readInt();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataIn.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(FileNotFoundException e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream out=new FileOutputStream("/counter.txt");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataOutputStream dataOut=new DataOutputStream(out);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataOut.writeInt(number);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataOut.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(IOException ffe){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(ffe);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(IOException ee){<BR>&nbsp;&nbsp;&nbsp;System.out.println(ee);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream out=new FileOutputStream("/counter.txt");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataOutputStream dataOut=new DataOutputStream(out);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataOut.writeInt(number);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataOut.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(FileNotFoundException e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(IOException e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e);<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>%&gt;<BR>&lt;% countPeople();%&gt;</P><img src ="http://www.blogjava.net/rkind/aggbug/28631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2006-01-19 11:26 <a href="http://www.blogjava.net/rkind/archive/2006/01/19/28631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>抽象类与接口的区别[转]</title><link>http://www.blogjava.net/rkind/archive/2005/12/06/22681.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Tue, 06 Dec 2005 03:03:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2005/12/06/22681.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/22681.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2005/12/06/22681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/22681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/22681.html</trackback:ping><description><![CDATA[<P><SPAN id=ArticleContent1_ArticleContent1_lblContent><FONT size=4>abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制，正是由于这两种机制的存在，才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性，甚至可以相互替换，因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。<BR>其实，两者之间还是有很大的区别的，对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行一番剖析，试图给开发者提供一个在二者之间进行选择的依据。<BR><B><FONT color=#330099>一、理解抽象类</FONT></B><BR>abstract class和interface在Java语言中都是用来进行抽象类（本文中的抽象类并非从abstract class翻译而来，它表示的是一个抽象体，而abstract class为Java语言中用于定义抽象类的一种方法，请读者注意区分）定义的，那么什么是抽象类，使用抽象类能为我们带来什么好处呢？<BR>在面向对象的概念中，我们知道所有的对象都是通过类来描绘的，但是反过来却不是这样。并不是所有的类都是用来描绘对象的，如果一个类中没有包含足够的信息来描绘一个具体的对象，这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念，是对一系列看上去不同，但是本质上相同的具体概念的抽象。<BR>比如：如果我们进行一个图形编辑软件的开发，就会发现问题领域存在着圆、三角形这样一些具体概念，它们是不同的，但是它们又都属于形状这样一个概念，形状这个概念在问题领域是不存在的，它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念，所以用以表征抽象概念的抽象类是不能够实例化的。<BR>在面向对象领域，抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述，但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类，而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体，因此它可以是不允许修改的；同时，通过从这个抽象体派生，也可扩展此模块的行为功能。熟悉OCP的读者一定知道，为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle)，抽象类是其中的关键所在。<BR><B><FONT color=#330099>二、从语法定义层面看abstract class和interface</FONT></B><BR>在语法层面，Java语言对于abstract class和interface给出了不同的定义方式，下面以定义一个名为Demo的抽象类为例来说明这种不同。使用abstract class的方式定义Demo抽象类的方式如下：</FONT></P>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE><FONT size=4>abstract class Demo ｛ 
 abstract void method1(); 
 abstract void method2(); 
 … 
｝</CCID_CODE></FONT></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER>
<P><BR><FONT size=4>使用interface的方式定义Demo抽象类的方式如下： </FONT></P>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE><FONT size=4>interface Demo { 
 void method1(); 
 void method2(); 
 … 
}</CCID_CODE></FONT></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER>
<P><BR><FONT size=4>在abstract class方式中，Demo可以有自己的数据成员，也可以有非abstarct的成员方法，而在interface方式的实现中，Demo只能够有静态的不能被修改的数据成员（也就是必须是static final的，不过在interface中一般不定义数据成员），所有的成员方法都是abstract的。从某种意义上说，interface是一种特殊形式的abstract class。 <BR>从编程的角度来看，abstract class和interface都可以用来实现"design by contract"的思想。但是在具体的使用上面还是有一些区别的。 <BR>首先，abstract class在Java语言中表示的是一种继承关系，一个类只能使用一次继承关系。但是，一个类却可以实现多个interface。也许，这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。 <BR>其次，在abstract class的定义中，我们可以赋予方法的默认行为。但是在interface的定义中，方法却不能拥有默认行为，为了绕过这个限制，必须使用委托，但是这会 增加一些复杂性，有时会造成很大的麻烦。 <BR>在抽象类中不能定义默认行为还存在另一个比较严重的问题，那就是可能会造成维护上的麻烦。因为如果后来想修改类的界面（一般通过abstract class或者interface来表示）以适应新的情况（比如，添加新的方法或者给已用的方法中添加新的参数）时，就会非常的麻烦，可能要花费很多的时间（对于派生类很多的情况，尤为如此）。但是如果界面是通过abstract class来实现的，那么可能就只需要修改定义在abstract class中的默认行为就可以了。 <BR>同样，如果不能在抽象类中定义默认行为，就会导致同样的方法实现出现在该抽象类的每一个派生类中，违反了"one rule，one place"原则，造成代码重复，同样不利于以后的维护。因此，在abstract class和interface间进行选择时要非常的小心。<BR><B><FONT color=#330099>三、从设计理念层面看abstract class和interface</FONT></B> <BR>上面主要从语法定义和编程的角度论述了abstract class和interface的区别，这些层面的区别是比较低层次的、非本质的。本文将从另一个层面：abstract class和interface所反映出的设计理念，来分析一下二者的区别。作者认为，从这个层面进行分析才能理解二者概念的本质所在。 <BR>前面已经提到过，abstarct class在Java语言中体现了一种继承关系，要想使得继承关系合理，父类和派生类之间必须存在"is a"关系，即父类和派生类在概念本质上应该是相同的。对于interface 来说则不然，并不要求interface的实现者和interface定义在概念本质上是一致的，仅仅是实现了interface定义的契约而已。为了使论述便于理解，下面将通过一个简单的实例进行说明。 <BR>考虑这样一个例子，假设在我们的问题领域中有一个关于Door的抽象概念，该Door具有执行两个动作open和close，此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型，定义方式分别如下所示： </FONT></P>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE><FONT size=4>使用abstract class方式定义Door： 

abstract class Door { 
 abstract void open(); 
 abstract void close()； 
} 

使用interface方式定义Door： 

interface Door { 
 void open(); 
 void close(); 
}</CCID_CODE></FONT></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER>
<P><BR><FONT size=4>其他具体的Door类型可以<SPAN id=highlight_tag style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: #ee6600; PADDING-TOP: 0px; BACKGROUND-COLOR: yellow; EE6600: ">extends使用abstract</SPAN> class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。<BR>如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢（在本例中，主要是为了展示abstract class和interface反映在设计理念上的区别，其他方面无关的问题都做了简化或者忽略）下面将罗列出可能的解决方案，并从设计理念层面对这些不同的方案进行分析。<BR>解决方案一：<BR>简单的在Door的定义中增加一个alarm方法，如下：</FONT></P>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE><FONT size=4>abstract class Door { 
 abstract void open(); 
 abstract void close()； 
 abstract void alarm(); 
} 

  
或者 

interface Door { 
 void open(); 
 void close(); 
 void alarm(); 
}</CCID_CODE></FONT></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER>
<P><BR><FONT size=4>那么具有报警功能的AlarmDoor的定义方式如下： <BR><BR><CCID_NOBR></FONT>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE><FONT size=4>class AlarmDoor extends Door { 
 void open() { … } 
 void close() { … } 
 void alarm() { … } 
} 

  
或者 

class AlarmDoor implements Door ｛ 
 void open() { … } 
 void close() { … } 
 void alarm() { … } 
｝</CCID_CODE></FONT></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR><FONT size=4>这种方法违反了面向对象设计中的一个核心原则ISP（Interface Segregation Priciple），在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变（比如：修改alarm方法的参数）而改变，反之依然。 <BR>解决方案二： <BR>既然open、close和alarm属于两个不同的概念，根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。定义方式有：这两个概念都使用abstract class方式定义；两个概念都使用interface方式定义；一个概念使用abstract class方式定义，另一个概念使用interface方式定义。 <BR>显然，由于Java语言不支持多重继承，所以两个概念都使用abstract class方式定义是不可行的。后面两种方式都是可行的，但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理。我们一一来分析、说明。 <BR>如果两个概念都使用interface方式来定义，那么就反映出两个问题： <BR>1、我们可能没有理解清楚问题领域，AlarmDoor在概念本质上到底是Door还是报警器？ <BR>2、如果我们对于问题领域的理解没有问题，比如：我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的，那么我们在实现时就没有能够正确的揭示我们的设计意图，因为在这两个概念的定义上（均使用interface方式定义）反映不出上述含义。 <BR>如果我们对于问题领域的理解是：AlarmDoor在概念本质上是Door，同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢？前面已经说过，abstract class在Java语言中表示一种继承关系，而继承关系在本质上是"is a"关系。所以对于Door这个概念，我们应该使用abstarct class方式来定义。另外，AlarmDoor又具有报警功能，说明它又能够完成报警概念中定义的行为，所以报警概念可以通过interface方式定义。如下所示： </FONT></P>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE><FONT size=4>abstract class Door { 
 abstract void open(); 
 abstract void close()； 
} 
interface Alarm { 
 void alarm(); 
} 
class AlarmDoor extends Door implements Alarm { 
 void open() { … } 
 void close() { … } 
    void alarm() { … } 
}</CCID_CODE></FONT></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER>
<P><BR><FONT size=4>这种实现方式基本上能够明确的反映出我们对于问题领域的理解，正确的揭示我们的设计意图。其实abstract class表示的是"is a"关系，interface表示的是"like a"关系，大家在选择时可以作为一个依据，当然这是建立在对问题领域的理解上的，比如：如果我们认为AlarmDoor在概念本质上是报警器，同时又具有Door的功能，那么上述的定义方式就要反过来了。 <BR>abstract class和interface是Java语言中的两种定义抽象类的方式，它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理，因为它们表现了概念间的不同的关系（虽然都能够实现需求的功能）。这其实也是语言的一种的惯用法，希望读者朋友能够细细体会</FONT></SPAN></P><img src ="http://www.blogjava.net/rkind/aggbug/22681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2005-12-06 11:03 <a href="http://www.blogjava.net/rkind/archive/2005/12/06/22681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rmi步步来[转]</title><link>http://www.blogjava.net/rkind/archive/2005/11/15/19937.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Tue, 15 Nov 2005 10:46:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2005/11/15/19937.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/19937.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2005/11/15/19937.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/19937.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/19937.html</trackback:ping><description><![CDATA[<P>&nbsp;&nbsp;&nbsp;RMI，远程方法调用（Remote Method Invocation）是Enterprise JavaBeans的支柱，是建立分布式Java应用程序的方便途径。RMI是非常容易使用的，但是它非常的强大。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RMI的基础是接口，RMI构架基于一个重要的原理：定义接口和定义接口的具体实现是分开的。下面我们通过具体的例子，建立一个简单的远程计算服务和使用它的客户程序<BR><BR>一个正常工作的RMI系统由下面几个部分组成：<BR><BR>●&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;远程服务的接口定义<BR><BR>●&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;远程服务接口的具体实现<BR><BR>●&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;桩（Stub）和框架（Skeleton）文件<BR><BR>●&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个运行远程服务的服务器<BR><BR>●&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个RMI命名服务，它允许客户端去发现这个远程服务<BR><BR>●&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类文件的提供者（一个HTTP或者FTP服务器）<BR><BR>●&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个需要这个远程服务的客户端程序<BR><BR>下面我们一步一步建立一个简单的RMI系统。首先在你的机器里建立一个新的文件夹，以便放置我们创建的文件，为了简单起见，我们只使用一个文件夹存放客户端和服务端代码，并且在同一个目录下运行服务端和客户端。<BR><BR>如果所有的RMI文件都已经设计好了，那么你需要下面的几个步骤去生成你的系统：<BR><BR>1、&nbsp;&nbsp;编写并且编译接口的Java代码<BR><BR>2、&nbsp;&nbsp;编写并且编译接口实现的Java代码<BR><BR>3、&nbsp;&nbsp;从接口实现类中生成桩（Stub）和框架（Skeleton）类文件<BR><BR>4、&nbsp;&nbsp;编写远程服务的主运行程序<BR><BR>5、&nbsp;&nbsp;编写RMI的客户端程序<BR><BR>6、&nbsp;&nbsp;安装并且运行RMI系统<BR><BR><BR>1、&nbsp;&nbsp;接口<BR><BR>第一步就是建立和编译服务接口的Java代码。这个接口定义了所有的提供远程服务的功能，下面是源程序：<BR><BR>//Calculator.java<BR>//define the interface<BR>import java.rmi.Remote;<BR><BR>public interface Calculator extends Remote<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;public long add(long a, long b) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws java.rmi.RemoteException; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;public long sub(long a, long b) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws java.rmi.RemoteException; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;public long mul(long a, long b) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws java.rmi.RemoteException; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;public long div(long a, long b) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws java.rmi.RemoteException; <BR>} <BR>注意，这个接口继承自Remote，每一个定义的方法都必须抛出一个RemoteException异常对象。<BR><BR>建立这个文件，把它存放在刚才的目录下，并且编译。<BR><BR>&gt;javac Calculator.java<BR><BR>2、&nbsp;&nbsp;接口的具体实现<BR><BR>下一步，我们就要写远程服务的具体实现，这是一个CalculatorImpl类文件：<BR><BR>//CalculatorImpl.java<BR>//Implementation<BR>import java.rmi.server.UnicastRemoteObject<BR><BR>public class CalculatorImpl extends UnicastRemoteObject implements Calculator <BR>{ <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// 这个实现必须有一个显式的构造函数，并且要抛出一个RemoteException异常 <BR>&nbsp;&nbsp;&nbsp;&nbsp;public CalculatorImpl() <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws java.rmi.RemoteException { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;public long add(long a, long b) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws java.rmi.RemoteException { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return a + b; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;public long sub(long a, long b) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws java.rmi.RemoteException { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return a - b; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;public long mul(long a, long b) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws java.rmi.RemoteException { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return a * b; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;public long div(long a, long b) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws java.rmi.RemoteException { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return a / b; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;同样的，把这个文件保存在你的目录里然后编译他。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个实现类使用了UnicastRemoteObject去联接RMI系统。在我们的例子中，我们是直接的从UnicastRemoteObject这个类上继承的，事实上并不一定要这样做，如果一个类不是从UnicastRmeoteObject上继承，那必须使用它的exportObject()方法去联接到RMI。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果一个类继承自UnicastRemoteObject，那么它必须提供一个构造函数并且声明抛出一个RemoteException对象。当这个构造函数调用了super()，它久激活UnicastRemoteObject中的代码完成RMI的连接和远程对象的初始化。<BR><BR><BR><BR>3、&nbsp;&nbsp;桩（Stubs）和框架（Skeletons）<BR><BR>下一步就是要使用RMI编译器rmic来生成桩和框架文件，这个编译运行在远程服务实现类文件上。<BR><BR>&gt;rmic CalculatorImpl<BR><BR>在你的目录下运行上面的命令，成功执行完上面的命令你可以发现一个Calculator_stub.class文件，如果你是使用的Java2SDK，那么你还可以发现Calculator_Skel.class文件。<BR><BR><BR><BR>4、&nbsp;&nbsp;主机服务器<BR><BR>远程RMI服务必须是在一个服务器中运行的。CalculatorServer类是一个非常简单的服务器。<BR><BR>//CalculatorServer.java<BR>import java.rmi.Naming;<BR><BR>public class CalculatorServer {<BR><BR>&nbsp;&nbsp;&nbsp;public CalculatorServer() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calculator c = new CalculatorImpl();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Naming.rebind("rmi://localhost:1099/CalculatorService", c);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Trouble: " + e);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;public static void main(String args[]) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new CalculatorServer();<BR>&nbsp;&nbsp;&nbsp;}<BR>}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;建立这个服务器程序，然后保存到你的目录下，并且编译它。<BR><BR>5、&nbsp;&nbsp;客户端<BR><BR>客户端源代码如下：<BR><BR>//CalculatorClient.java<BR><BR><BR><BR>import java.rmi.Naming; <BR>import java.rmi.RemoteException; <BR>import java.net.MalformedURLException; <BR>import java.rmi.NotBoundException; <BR><BR>public class CalculatorClient { <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calculator c = (Calculator)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Naming.lookup(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"rmi://localhost<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/CalculatorService"); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println( c.sub(4, 3) ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println( c.add(4, 5) ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println( c.mul(3, 6) ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println( c.div(9, 3) ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (MalformedURLException murle) { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"MalformedURLException"); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(murle); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (RemoteException re) { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"RemoteException"); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(re); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (NotBoundException nbe) { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"NotBoundException"); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(nbe); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.lang.ArithmeticException<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ae) { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"java.lang.ArithmeticException"); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ae); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;保存这个客户端程序到你的目录下（注意这个目录是一开始建立那个，所有的我们的文件都在那个目录下），并且编译他。<BR><BR><BR><BR>6、&nbsp;&nbsp;运行RMI系统<BR><BR>现在我们建立了所有运行这个简单RMI系统所需的文件，现在我们终于可以运行这个RMI系统啦！来享受吧。<BR><BR>我们是在命令控制台下运行这个系统的，你必须开启三个控制台窗口，一个运行服务器，一个运行客户端，还有一个运行RMIRegistry。<BR><BR>首先运行注册程序RMIRegistry，你必须在包含你刚写的类的那么目录下运行这个注册程序。<BR><BR>&gt;rmiregistry<BR><BR>好，这个命令成功的话，注册程序已经开始运行了，不要管他，现在切换到另外一个控制台，在第二个控制台里，我们运行服务器CalculatorService，因为RMI的安全机制将在服务端发生作用,所以你必须增加一条安全策略。以下是对应安全策略的例子 <BR>grant {<BR>permission java.security.AllPermission "", "";<BR>};<BR>注意:这是一条最简单的安全策略,它允许任何人做任何事,对于你的更加关键性的应用,你必须指定更加详细安全策略。<BR>现在为了运行服务端，你需要除客户类(CalculatorClient.class)之外的所有的类文件。确认安全策略在policy.txt文件之后,使用如下命令来运行服务器。<BR>&gt; java -Djava.security.policy=policy.txt CalculatorServer<BR><BR>这个服务器就开始工作了，把接口的实现加载到内存等待客户端的联接。好现在切换到第三个控制台，启动我们的客户端。<BR>为了在其他的机器运行客户端程序你需要一个远程接口(Calculator.class) 和一个stub(CalculatorImpl_Stub.class)。 使用如下命令运行客户端<BR>prompt&gt; java -Djava.security.policy=policy.txt CalculatorClient<BR><BR>如果所有的这些都成功运行，你应该看到下面的输出：<BR><BR>1 <BR>9 <BR>18 <BR>3 <BR>如果你看到了上面的输出，恭喜你，你成功了，你已经成功的创建了一个RMI系统，并且使他正确工作了。即使你运行在同一个计算机上，RMI还是使用了你的网络堆栈和TCP/IP去进行通讯，并且是运行在三个不同的Java虚拟机上。这已经是一个完整的RMI系统。 </P><img src ="http://www.blogjava.net/rkind/aggbug/19937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2005-11-15 18:46 <a href="http://www.blogjava.net/rkind/archive/2005/11/15/19937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sql常用语句</title><link>http://www.blogjava.net/rkind/archive/2005/11/11/19269.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Fri, 11 Nov 2005 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2005/11/11/19269.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/19269.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2005/11/11/19269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/19269.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/19269.html</trackback:ping><description><![CDATA[<P>SELECT COUNT(*) AS Expr1 FROM History</P>
<P>DELETE FROM History WHERE (Id &gt; 0)<BR><BR>truncate table youtable;</P>
<P>为什么要用TRUNCATE TABLE 语句代替DELETE语句？当你使用TRUNCATE TABLE语句时，记录的删除是不作记录的。也就是说，这意味着TRUNCATE TABLE 要比DELETE快得多。 </P><img src ="http://www.blogjava.net/rkind/aggbug/19269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2005-11-11 11:25 <a href="http://www.blogjava.net/rkind/archive/2005/11/11/19269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jbuilder2006中使用1.5以下JDK的解决方法</title><link>http://www.blogjava.net/rkind/archive/2005/10/27/17028.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Thu, 27 Oct 2005 05:06:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2005/10/27/17028.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/17028.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2005/10/27/17028.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/17028.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/17028.html</trackback:ping><description><![CDATA[Jbuilder2006自带了1.5的JDK,但如果你还想继续用JDK1.42，如果只是在Jbuilder2006的tool-&gt;configure-&gt;JDKs中添加一个JDK1.42或更低版本，那么即使你只写一个最简单的HelloWorld程序，Jbuilder2006都会给你报出长长一串错误，编写的代码在Jbuilder2005中也无法运行。我在刚使用Jbuilder2006时，被这个问题困惑了好久，在网上查了好久也没有找到解决的方法。<BR>今天花了两个小时，终于在Jbuilder2006的帮助中查到了问题的原因。Jbuilder2006在运行编译工程时，会针对特定版本的VM进行编译，默认的是Java 2 SDK, v 5.0 And Late，因此，如果工程用的是1.5以下的JDK，碰到都是java.lang.UnsupportedClassVersionError这个错误。<BR><BR>解决的办法其实很简单，只要更改这个选项就行了。具体步骤如下：<BR>----------------------------------------------------------<BR>1、右键点击工程文件，选择属性(properties),<BR>2、在属性窗口中选择 Build--&gt;Java,在右边的选项中有四个下拉框，就可以看到编译选项了，<BR>3、其中Compiler和Debug Option可以不用管，只在Languege features和Target VM中选择相应的JDK版本就可以了，然后确定，一切OK。<BR>附件中是配置的图片。<BR>-----------------------------------------------------------<BR>如果在Target VM中选择了All Java SDKs，那么你的class文件在使用JDK1.1的VM上都可以运行（Jbuilder2006帮助中是这么说的，估计没几个人的机子上还在用JDK1.1吧 :-）<BR><BR><img src ="http://www.blogjava.net/rkind/aggbug/17028.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2005-10-27 13:06 <a href="http://www.blogjava.net/rkind/archive/2005/10/27/17028.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql中有的表不能被访问 </title><link>http://www.blogjava.net/rkind/archive/2005/10/27/17026.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Thu, 27 Oct 2005 05:05:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2005/10/27/17026.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/17026.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2005/10/27/17026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/17026.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/17026.html</trackback:ping><description><![CDATA[<P>今天在Mysql中建立了一个名叫Option的表，结果无论如何都不能访问，后来换了个名字就OK了，应而想到了是Mysql的保留字，搜了一下，发现以下字段都是它的保留字</P>
<P>action&nbsp; add&nbsp; aggregate&nbsp; all&nbsp; <BR>alter&nbsp; after&nbsp; and&nbsp; as&nbsp; <BR>asc&nbsp; avg&nbsp; avg_row_length&nbsp; auto_increment&nbsp; <BR>between&nbsp; bigint&nbsp; bit&nbsp; binary&nbsp; <BR>blob&nbsp; bool&nbsp; both&nbsp; by&nbsp; <BR>cascade&nbsp; case&nbsp; char&nbsp; character&nbsp; <BR>change&nbsp; check&nbsp; checksum&nbsp; column&nbsp; <BR>columns&nbsp; comment&nbsp; constraint&nbsp; create&nbsp; <BR>cross&nbsp; current_date&nbsp; current_time&nbsp; current_timestamp&nbsp; <BR>data&nbsp; database&nbsp; databases&nbsp; date&nbsp; <BR>datetime&nbsp; day&nbsp; day_hour&nbsp; day_minute&nbsp; <BR>day_second&nbsp; dayofmonth&nbsp; dayofweek&nbsp; dayofyear&nbsp; <BR>dec&nbsp; decimal&nbsp; default&nbsp; delayed&nbsp; <BR>delay_key_write&nbsp; delete&nbsp; desc&nbsp; describe&nbsp; <BR>distinct&nbsp; distinctrow&nbsp; double&nbsp; drop&nbsp; <BR>end&nbsp; else&nbsp; escape&nbsp; escaped&nbsp; <BR>enclosed&nbsp; enum&nbsp; explain&nbsp; exists&nbsp; <BR>fields&nbsp; file&nbsp; first&nbsp; float&nbsp; <BR>float4&nbsp; float8&nbsp; flush&nbsp; foreign&nbsp; <BR>from&nbsp; for&nbsp; full&nbsp; function&nbsp; <BR>global&nbsp; grant&nbsp; grants&nbsp; group&nbsp; <BR>having&nbsp; heap&nbsp; high_priority&nbsp; hour&nbsp; <BR>hour_minute&nbsp; hour_second&nbsp; hosts&nbsp; identified&nbsp; <BR>ignore&nbsp; in&nbsp; index&nbsp; infile&nbsp; <BR>inner&nbsp; insert&nbsp; insert_id&nbsp; int&nbsp; <BR>integer&nbsp; interval&nbsp; int1&nbsp; int2&nbsp; <BR>int3&nbsp; int4&nbsp; int8&nbsp; into&nbsp; <BR>if&nbsp; is&nbsp; isam&nbsp; join&nbsp; <BR>key&nbsp; keys&nbsp; kill&nbsp; last_insert_id&nbsp; <BR>leading&nbsp; left&nbsp; length&nbsp; like&nbsp; <BR>lines&nbsp; limit&nbsp; load&nbsp; local&nbsp; <BR>lock&nbsp; logs&nbsp; long&nbsp; longblob&nbsp; <BR>longtext&nbsp; low_priority&nbsp; max&nbsp; max_rows&nbsp; <BR>match&nbsp; mediumblob&nbsp; mediumtext&nbsp; mediumint&nbsp; <BR>middleint&nbsp; min_rows&nbsp; minute&nbsp; minute_second&nbsp; <BR>modify&nbsp; month&nbsp; monthname&nbsp; myisam&nbsp; <BR>natural&nbsp; numeric&nbsp; no&nbsp; not&nbsp; <BR>null&nbsp; on&nbsp; optimize&nbsp; option&nbsp; <BR>optionally&nbsp; or&nbsp; order&nbsp; outer&nbsp; <BR>outfile&nbsp; pack_keys&nbsp; partial&nbsp; password&nbsp; <BR>precision&nbsp; primary&nbsp; procedure&nbsp; process&nbsp; <BR>processlist&nbsp; privileges&nbsp; read&nbsp; real&nbsp; <BR>references&nbsp; reload&nbsp; regexp&nbsp; rename&nbsp; <BR>replace&nbsp; restrict&nbsp; returns&nbsp; revoke&nbsp; <BR>rlike&nbsp; row&nbsp; rows&nbsp; second&nbsp; <BR>select&nbsp; set&nbsp; show&nbsp; shutdown&nbsp; <BR>smallint&nbsp; soname&nbsp; sql_big_tables&nbsp; sql_big_selects&nbsp; <BR>sql_low_priority_updates&nbsp; sql_log_off&nbsp; sql_log_update&nbsp; sql_select_limit&nbsp; <BR>sql_small_result&nbsp; sql_big_result&nbsp; sql_warnings&nbsp; straight_join&nbsp; <BR>starting&nbsp; status&nbsp; string&nbsp; table&nbsp; <BR>tables&nbsp; temporary&nbsp; terminated&nbsp; text&nbsp; <BR>then&nbsp; time&nbsp; timestamp&nbsp; tinyblob&nbsp; <BR>tinytext&nbsp; tinyint&nbsp; trailing&nbsp; to&nbsp; <BR>type&nbsp; use&nbsp; using&nbsp; unique&nbsp; <BR>unlock&nbsp; unsigned&nbsp; update&nbsp; usage&nbsp; <BR>values&nbsp; varchar&nbsp; variables&nbsp; varying&nbsp; <BR>varbinary&nbsp; with&nbsp; write&nbsp; when&nbsp; <BR>where&nbsp; year&nbsp; year_month&nbsp; zerofill&nbsp; <BR></P><BR><img src ="http://www.blogjava.net/rkind/aggbug/17026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2005-10-27 13:05 <a href="http://www.blogjava.net/rkind/archive/2005/10/27/17026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一段把年按星期划分并上传到数据库的代码 </title><link>http://www.blogjava.net/rkind/archive/2005/10/27/17027.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Thu, 27 Oct 2005 05:05:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2005/10/27/17027.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/17027.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2005/10/27/17027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/17027.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/17027.html</trackback:ping><description><![CDATA[<P>打算要做一个工作总结平台，考虑到要实现周工作总结的功能就得先把一年先按某周某周区分开来，查了查Api</P>
<P>采用了calendar类，并把最后分的结果传到数据库，</P>
<P>year&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; week&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; content</P>
<P>2005&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1月３日～１月９日</P>
<P>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....................&nbsp;</P>
<P>源码如下(其中DB类是我用来实现数据库连接用的)</P>
<P>import java.util.*;<BR>import java.util.Date;<BR>import java.sql.*; <BR>import rkind.db;<BR>public class shijian {<BR>&nbsp;public static void main(String args[]){<BR>&nbsp;&nbsp;int day,mon,year,week,dayofweek;&nbsp;&nbsp;<BR>&nbsp;&nbsp;db base=new db();<BR>&nbsp;&nbsp;String content="";<BR>&nbsp;&nbsp;Calendar nova = Calendar.getInstance();<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;Date d1=new Date();&nbsp;<BR>&nbsp;&nbsp;nova.setTime(d1);<BR>&nbsp;&nbsp;nova.set(2005,Calendar.JANUARY,1);<BR>&nbsp;&nbsp;//nova.add(Calendar.DATE,6);<BR>&nbsp;&nbsp;//day=nova.get(Calendar.WEEK_OF_YEAR );<BR>&nbsp;&nbsp;dayofweek=nova.get(Calendar.DAY_OF_WEEK&nbsp; );<BR>&nbsp;&nbsp;while(dayofweek!=2){<BR>&nbsp;&nbsp;nova.add(Calendar.DATE,1);<BR>&nbsp;&nbsp;dayofweek=nova.get(Calendar.DAY_OF_WEEK&nbsp; );<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;year=nova.get(Calendar.YEAR);<BR>&nbsp;&nbsp;//String sql=new String("insert into shijian(year,week,content) values('"+year+"','"+week+"','"+content+"')");<BR>&nbsp;&nbsp;//System.out.println("day+++:"+day);<BR>&nbsp;&nbsp;while(year==2005){&nbsp;<BR>&nbsp;&nbsp;&nbsp;week=nova.get(Calendar.WEEK_OF_YEAR );<BR>&nbsp;&nbsp;&nbsp;mon=nova.get(Calendar.MONTH)+1;<BR>&nbsp;&nbsp;&nbsp;day=nova.get(Calendar.DATE);<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;content=mon+"月"+day+"日"+"~~ ";&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;System.out.print("第"+week+"周"+":&nbsp; "+mon+"月"+day+"日");<BR>&nbsp;&nbsp;&nbsp;nova.add(Calendar.DATE,6);<BR>&nbsp;&nbsp;&nbsp;week=nova.get(Calendar.WEEK_OF_YEAR );<BR>&nbsp;&nbsp;&nbsp;mon=nova.get(Calendar.MONTH)+1;<BR>&nbsp;&nbsp;&nbsp;day=nova.get(Calendar.DATE);<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;content+=mon+"月"+day+"日";<BR>&nbsp;&nbsp;&nbsp;try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;String sql=new String("insert into shijian(year,week,content) values('"+year+"','"+week+"','"+content+"')");<BR>&nbsp;&nbsp;&nbsp;&nbsp;base.executeUpdate(sql);&nbsp;<BR>&nbsp;&nbsp;&nbsp;}catch(Exception e){System.out.println(e);}<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;System.out.println("~~~~"+mon+"月"+day+"日");<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;nova.add(Calendar.DATE,1);<BR>&nbsp;&nbsp;&nbsp;week=nova.get(Calendar.WEEK_OF_YEAR );<BR>&nbsp;&nbsp;&nbsp;mon=nova.get(Calendar.MONTH)+1;<BR>&nbsp;&nbsp;&nbsp;day=nova.get(Calendar.DATE);<BR>&nbsp;&nbsp;&nbsp;year=nova.get(Calendar.YEAR);<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;}<BR>&nbsp;<BR>&nbsp;}&nbsp;<BR>&nbsp;<BR>}</P>
<P>虽然功能上实现了，但是还有大量的重复代码，和费语句，这就是没有好好重视J2se的结果，没办法，</P>
<P>边学J2EE边看Se吧，：）</P><img src ="http://www.blogjava.net/rkind/aggbug/17027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2005-10-27 13:05 <a href="http://www.blogjava.net/rkind/archive/2005/10/27/17027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Tomcat中配置数据源 </title><link>http://www.blogjava.net/rkind/archive/2005/10/27/17022.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Thu, 27 Oct 2005 05:03:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2005/10/27/17022.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/17022.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2005/10/27/17022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/17022.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/17022.html</trackback:ping><description><![CDATA[<P>Datasource对象是由Tomcat提供的，因而需要使用JNDI来获得Datasouce</P>
<P>在Javax.naming 中提供了Context接口，</P>
<P>数据源的配置涉及到Server.xml和web.xml，需要在server.xml中加入如下内容：说明一下：我的数据库是MYsql</P>
<P>&lt;Context path="/text" docBase="d:/upload" debug="0"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;Resource name="jdbc/testDb" auth="Container"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="javax.sql.DataSource"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ResourceParams name="jdbc/testDB"&gt;\\数据源的名称<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;&lt;name&gt;username&lt;/name&gt;&lt;value&gt;root&lt;/value&gt;&lt;/parameter&gt;数据库的名称<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;&lt;name&gt;password&lt;/name&gt;&lt;value&gt;password&lt;/value&gt;&lt;/parameter&gt;数据库密码<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;&lt;name&gt;driverClassName&lt;/name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;org.gjt.mm.mysql.Driver&lt;/value&gt;&lt;/parameter&gt;\\要加载的驱动<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;&lt;name&gt;url&lt;/name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;jdbc:mysql://172.20.0.73/rk?&lt;/value&gt;&lt;/parameter&gt;\\要连接的URL<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ResourceParams&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp; &lt;/Context&gt;</P>
<P>具体还有一些详细的选项例如：MaxActive等，参加Server.xml中说明</P>
<P>另外在Web.xml中加入如下内容：<BR>&lt;description&gt;test connection&lt;/description&gt;\\描述<BR>&nbsp;&nbsp;&nbsp; &lt;res-ref-name&gt;jdbc/testDB&lt;/res-ref-name&gt;\\名称与上对应<BR>&nbsp;&nbsp;&nbsp; &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;\\与上对应<BR>&nbsp;&nbsp;&nbsp; &lt;res-auth&gt;Container&lt;/res-auth&gt;\\与上一置<BR>&nbsp;&nbsp;&nbsp; &lt;/resource-ref&gt;</P>
<P>配置以上内容后，只要在你的Jsp或Javabean 中按以下方式创建连接，就可以</P>
<P>Context ctx=new InitialContext();<BR>&nbsp;&nbsp;DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/testDB");<BR>&nbsp;&nbsp;conn = ds.getConnection();</P>
<P>以上代码均测试成功，但是在Server.xml中配置数据库的URL中我不能加入useUnicode=true&amp;characterEncoding=GBK，所以从数据库中取出来的汉字都是？？？？</P>
<P><STRONG>刚刚解决了上面的问题，可以这样加入</STRONG></P>
<P><STRONG>jdbc:mysql://172.20.0.73/rk?useUnicode=true&amp;amp;characterEncoding=GBK</STRONG></P>
<P><STRONG>因为&amp;是特殊字符</STRONG></P>
<P>我用如下代码来解决这个问题：</P>
<P>public static String toChinese(String strvalue) { <BR>&nbsp;&nbsp;try{ <BR>&nbsp;&nbsp;&nbsp;if(strvalue==null) <BR>&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;return null; <BR>&nbsp;&nbsp;} <BR>&nbsp;&nbsp;else { <BR>&nbsp;&nbsp;&nbsp;strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK"); <BR>&nbsp;&nbsp;&nbsp;return strvalue; <BR>&nbsp;&nbsp;} <BR>&nbsp;&nbsp;}catch(Exception e){ <BR>&nbsp;&nbsp;&nbsp;return null; <BR>&nbsp;&nbsp;} <BR>&nbsp;} </P>
<P>写Blog 的时候停了几次电，真是郁闷，数据库的连接池的概念我现在还是不太清晰，加强学习，看书去了１</P><img src ="http://www.blogjava.net/rkind/aggbug/17022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2005-10-27 13:03 <a href="http://www.blogjava.net/rkind/archive/2005/10/27/17022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>把Sql2000中的表导入到Mysql中的方法 </title><link>http://www.blogjava.net/rkind/archive/2005/10/27/17023.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Thu, 27 Oct 2005 05:03:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2005/10/27/17023.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/17023.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2005/10/27/17023.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/17023.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/17023.html</trackback:ping><description><![CDATA[<P>前两天得到了一个成绩的数据库，可是是DBF的，因为想在Mysql环境中做一个成绩分析，可是没办法导入</P>
<P>，于是先导入SQlsever2000中，想生成SQL脚本，然后再在Mysql Front中改入。SQL文件，可是发现导出来的脚本只有创建表的SQL脚本，没有数据的脚本，无奈，</P>
<P>后来又想找个软件试一下，下了一个什么DBF　To　Mysql　在未破解的情况下，只可以导入６行数据（！汗）</P>
<P>用了破解补丁以后导入的时候出错，软件上说库限制的是８M，可是我的库只有６M多一点，试了几次也不行</P>
<P>然后只好继续用Sql2000试，选导出的时候发现可以选择导出文本和CSV文件，而在我的MYsqlfront里面支持导</P>
<P>入CSV文件，于是先用SQl2000导出文本文件，把后缀名改为CSv，再从Mysql中一导入OK，</P>
<P>后来在使用中才发现，用这种方法导入以后，有的是Char类型的字段在Mysql front中被认为是Int类型的，</P>
<P>可是在Phpmyadmin中字段显示正常。</P><img src ="http://www.blogjava.net/rkind/aggbug/17023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2005-10-27 13:03 <a href="http://www.blogjava.net/rkind/archive/2005/10/27/17023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个数据库的小问题 </title><link>http://www.blogjava.net/rkind/archive/2005/10/27/17020.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Thu, 27 Oct 2005 05:02:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2005/10/27/17020.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/17020.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2005/10/27/17020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/17020.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/17020.html</trackback:ping><description><![CDATA[<P>今天做了一个新闻上传的页面，遇到一些问题</P>
<P>首先是数据库的设计，考虑新闻有一个优先级的问题，因些我在表中需要设置一个recommand的字段，我想设成一个布尔类型，可是发现在mysql里面没有这种类型，查查了都推荐使用ENUM这种类型，可以设置两个值</P>
<P>一个设成true一个设成false，然后我在JSP中就可以通过Insert一个布尔值往这个字段传值，</P>
<P>今天在表单中使用了单选框，原来以为需要使用request.getparameterValus，后来发现不用</P>
<P>最后在上传新闻的过程中，tomcat提示一个叫invalid column 什么 key的错误，调试了很多次才发现是表中的</P>
<P>有一个ID 的主建，本来是自动增长的，可是死了几次机，居然变成不是自动增长的，狂晕</P>
<P>这几天电压总是不够，一天死很多次机，搞的现在一个劲按ctrl+s</P><img src ="http://www.blogjava.net/rkind/aggbug/17020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2005-10-27 13:02 <a href="http://www.blogjava.net/rkind/archive/2005/10/27/17020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法 </title><link>http://www.blogjava.net/rkind/archive/2005/10/27/17019.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Thu, 27 Oct 2005 05:01:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2005/10/27/17019.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/17019.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2005/10/27/17019.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/17019.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/17019.html</trackback:ping><description><![CDATA[<P>今天在原来上传文件页面的基础上，想添加一段文件的简介</P>
<P>因为同时要上传文件，所以ENCTYPE="multipart/form-data" 必须要加在form里面</P>
<P>可是这样的话，我再servlet里面用request.getParameter()方法无论如何都只是获得null值，</P>
<P>不是一般的郁闷，百度了一下，有人出现了同样的问题可是它用的是jspsmartupload组件实现文件上传的，</P>
<P>而我用的commons fileupload组件，仔细看了一下这个组件的api，可是英语太差了，没有发现相关的信息</P>
<P>我又尝试用session传递参数，可是发现有点麻烦，因为在表单提交之时你就得赋给session表单上它的数值，</P>
<P>这似乎要javascript，可是偶也不会，</P>
<P>后来只有google了，搜索了一些中文网页，也没有找到资料，试试不限制语言，呵呵呵，一大片，后来被俺发</P>
<P>现了这个</P>
<P><FONT face=Verdana size=2>I cannot read the submitter using request.getParameter("submitter") (it returns null). ] </FONT></P><PRE>Situation:

javax.servlet.HttpServletRequest.getParameter(String) returns null when the ContentType is multipart/form-data

Solutions:

Solution A:

1. download http://www.servlets.com/cos/index.html
2. invoke getParameters() on com.oreilly.servlet.MultipartRequest

Solution B:

1. download http://jakarta.apache.org/commons/sandbox/fileupload/
2. invoke readHeaders() in 
org.apache.commons.fileupload.MultipartStream

Solution C:

1. download http://users.boone.net/wbrameld/multipartformdata/
2. invoke getParameter on 
com.bigfoot.bugar.servlet.http.MultipartFormData

Solution D:

Use Struts. Struts 1.1 handles this automatically.
</PRE><PRE>说是不详细，接着往下看，另一种解决方法</PRE><PRE><FONT face=Verdana size=2>&gt; Solution B:<BR>&gt; 1. download <BR>&gt; http://jakarta.apache.org/commons/sandbox/fileupload/<BR>&gt; 2. invoke readHeaders() in <BR>&gt; org.apache.commons.fileupload.MultipartStream<BR><BR>The Solution B as given by my dear friend is a bit hectic and a bit complex :(<BR>We can try the following solution which I found much simpler (at least in usage).<BR><BR>1. Download one of the versions of UploadFile from http://jakarta.apache.org/commons/fileupload/<BR>2. Invoke parseRequest(request) on org.apache.commons.fileupload.FileUploadBase which returns list of org.apache.commons.fileupload.FileItem objects. <BR>3. Invoke isFormField() on each of the FileItem objects. This determines whether the file item is a form paramater or stream of uploaded file. <BR>4. Invoke getFieldName() to get parameter name and getString() to get parameter value on FileItem if it's a form parameter. Invoke write(java.io.File) on FileItem to save the uploaded file stream to a file if the FileItem is not a form parameter. </FONT><BR></PRE><PRE>按照上面的步骤来，果然一切都ok，ＧＯＯＧＬＥ真不错，主要是getFieldName和getString，</PRE><PRE>虽然说这种做法有一点麻烦，但稍微判断加工一下，总比获取不到强<BR></PRE><img src ="http://www.blogjava.net/rkind/aggbug/17019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2005-10-27 13:01 <a href="http://www.blogjava.net/rkind/archive/2005/10/27/17019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA中文问题解决总结 </title><link>http://www.blogjava.net/rkind/archive/2005/10/27/17018.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Thu, 27 Oct 2005 05:00:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2005/10/27/17018.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/17018.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2005/10/27/17018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/17018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/17018.html</trackback:ping><description><![CDATA[大家在JSP的开发过程中，经常出现中文乱码的问题，可能一至困扰着您，我现在把我在JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考。 <BR><BR>一、JSP页面显示乱码 <BR>下面的显示页面(display.jsp)就出现乱码： <BR>&lt;html&gt; <BR>&lt;head&gt; <BR>&lt;title&gt;JSP的中文处理&lt;/title&gt; <BR>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt; <BR>&lt;/head&gt; <BR><BR>&lt;body&gt; <BR>&lt;% <BR>out.print("JSP的中文处理"); <BR>%&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR>对不同的WEB服务器和不同的JDK版本，处理结果就不一样。原因：服务器使用的编码方式不同和浏览器对不同的字符显示结果不同而导致的。解决办法：在JSP页面中指定编码方式(gb2312),即在页面的第一行加上：&lt;%@ page contentType="text/html; charset=gb2312"%&gt;，就可以消除乱码了。完整页面如下： <BR>&lt;%@ page contentType="text/html; charset=gb2312"%&gt; <BR>&lt;html&gt; <BR>&lt;head&gt; <BR>&lt;title&gt;JSP的中文处理&lt;/title&gt; <BR>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt; <BR>&lt;/head&gt; <BR><BR>&lt;body&gt; <BR>&lt;% <BR>out.print("JSP的中文处理"); <BR>%&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR><BR>二、表单提交中文时出现乱码 <BR>下面是一个提交页面(submit.jsp)，代码如下： <BR>&lt;html&gt; <BR>&lt;head&gt; <BR>&lt;title&gt;JSP的中文处理&lt;/title&gt; <BR>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt; <BR>&lt;/head&gt; <BR><BR>&lt;body&gt; <BR>&lt;form name="form1" method="post" action="process.jsp"&gt; <BR>&lt;div align="center"&gt; <BR>&lt;input type="text" name="name"&gt; <BR>&lt;input type="submit" name="Submit" value="Submit"&gt; <BR>&lt;/div&gt; <BR>&lt;/form&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR>下面是处理页面(process.jsp)代码： <BR>&lt;%@ page contentType="text/html; charset=gb2312"%&gt; <BR>&lt;html&gt; <BR>&lt;head&gt; <BR>&lt;title&gt;JSP的中文处理&lt;/title&gt; <BR>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt; <BR>&lt;/head&gt; <BR><BR>&lt;body&gt; <BR>&lt;%=request.getParameter("name")%&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR>如果submit.jsp提交英文字符能正确显示，如果提交中文时就会出现乱码。原因：浏览器默认使用UTF-8编码方式来发送请求，而UTF-8和GB2312编码方式表示字符时不一样，这样就出现了不能识别字符。解决办法:通过request.seCharacterEncoding("gb2312")对请求进行统一编码，就实现了中文的正常显示。修改后的process.jsp代码如下： <BR>&lt;%@ page contentType="text/html; charset=gb2312"%&gt; <BR>&lt;% <BR>request.seCharacterEncoding("gb2312"); <BR>%&gt; <BR>&lt;html&gt; <BR>&lt;head&gt; <BR>&lt;title&gt;JSP的中文处理&lt;/title&gt; <BR>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt; <BR>&lt;/head&gt; <BR><BR>&lt;body&gt; <BR>&lt;%=request.getParameter("name")%&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR><BR>三、数据库连接出现乱码 <BR>只要涉及中文的地方全部是乱码，解决办法：在数据库的数据库URL中加上useUnicode=true&amp;characterEncoding=GBK就OK了。 <BR><BR>四、数据库的显示乱码 <BR>在mysql4.1.0中,varchar类型，text类型就会出现中文乱码，对于varchar类型把它设为binary属性就可以解决中文问题，对于text类型就要用一个编码转换类来处理，实现如下： <BR>public class Convert { <BR>/** 把ISO-8859-1码转换成GB2312 <BR>*/ <BR>public static String ISOtoGB(String iso){ <BR>String gb; <BR>try{ <BR>if(iso.equals("") || iso == null){ <BR>return ""; <BR>} <BR>else{ <BR>iso = iso.trim(); <BR>gb = new String(iso.getBytes("ISO-8859-1"),"GB2312"); <BR>return gb; <BR>} <BR>} <BR>catch(Exception e){ <BR>System.err.print("编码转换错误："+e.getMessage()); <BR>return ""; <BR>} <BR>} <BR>} <BR>把它编译成class，就可以调用Convert类的静态方法ISOtoGB()来转换编码。 <BR><BR><BR>如果你还有什么不懂之处：我给大家推荐一个好的JSP-JAVA网站： <BR><BR>http://www.phy.hbnu.edu.cn/dsp/ <BR><BR>Linux和Java是互联网的宠儿,更是互联网时代的两头雄师, Linux的网络安全性和开放源代码,Java的平台独立性和安全易用性，正好符合Internet平台的要求，Linux和Java真是天生一对鸳鸯。双狮资源网给你提供了最好的Linux和Java学习资源， 欢迎大家多多访问并宣传： <BR>http://www.phy.hbnu.edu.cn/dsp/ <BR><img src ="http://www.blogjava.net/rkind/aggbug/17018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2005-10-27 13:00 <a href="http://www.blogjava.net/rkind/archive/2005/10/27/17018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>今天学习java的一点收获 </title><link>http://www.blogjava.net/rkind/archive/2005/10/27/17015.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Thu, 27 Oct 2005 04:59:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2005/10/27/17015.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/17015.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2005/10/27/17015.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/17015.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/17015.html</trackback:ping><description><![CDATA[<P><STRONG><FONT size=4>1</FONT></STRONG></P>
<P>java中当前日期的获取方法</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">旧方法（已不常用）：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>int year = 0;</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>int month = 0;</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>int day = 0;</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>java.util.Date now = new java.util.Date();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>year = now.getYear() + 1900;</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>month = now.getMonth() + 1;</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>day = now.getDate();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">新方法：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>SimpleDateFormat formatter = new SimpleDateFormat(“yyyy-mm-dd”);</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>Calendar cal_today = Calendar.getInstance();</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>int m_day = cal_today.get(cal_today.DAY_OF_MONTH);</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>int m_month = cal_today.get(cal_today.MONTH) + 1;</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>int m_hour = cal_today.get(cal_today.HOUR_OF_DAY);</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>int m_minute = cal_today.get(cal_today.MINUTE);</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>String d = formatter.format(cal_today.getTime());</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">我采用前一种方法实现了按日期生成文件夹.</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><STRONG><FONT size=5>2</FONT></STRONG></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">jsp传给mysql当前系统时间的方法</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">insert into youDB(date) values(NOW())</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">不过这样只能获得当前日期</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><STRONG><FONT size=4>3</FONT></STRONG>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">判断要建立的文件夹是否存在,如果不则新建立一个文件夹</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">int year,mm,dd;<BR>&nbsp;&nbsp;String month,day;<BR>&nbsp;&nbsp;Date d1=new Date();<BR>&nbsp;&nbsp;year=d1.getYear()+1900;<BR>&nbsp;&nbsp;mm=d1.getMonth()+1;<BR>&nbsp;&nbsp;if (mm&lt;10) month="0"+mm;<BR>&nbsp;&nbsp;else month=""+mm;<BR>&nbsp;&nbsp;dd=d1.getDate();<BR>&nbsp;&nbsp;if (dd&lt;10) day="0"+dd;<BR>&nbsp;&nbsp;else day=""+dd;<BR>&nbsp;&nbsp;String filepath="d:\\upload"+"<A href="file://%22+year+month+day+%22//"><FONT color=#223355>\\"+year+month+day+"\\</FONT></A>";<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;if(!new File(filepath).isDirectory())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new File(filepath).mkdirs();</P><img src ="http://www.blogjava.net/rkind/aggbug/17015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2005-10-27 12:59 <a href="http://www.blogjava.net/rkind/archive/2005/10/27/17015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jdbc笔记5 </title><link>http://www.blogjava.net/rkind/archive/2005/10/27/17008.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Thu, 27 Oct 2005 04:53:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2005/10/27/17008.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/17008.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2005/10/27/17008.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/17008.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/17008.html</trackback:ping><description><![CDATA[一、通过ResultSet对象对结果集进行处理<BR><BR><BR><BR>从前面的学习中，我们掌握了通过Statement类及其子类传递SQL语句，对数据库管理系统进行访问。一般来说，对数据库的操作大部分都是执行查询语句。这种语句执行的结果是返回一个ResultSet类的对象。要想把查询的结果返回给用户，必须对ResultSet对象进行相关处理。今天，我们就来学习对结果集的处理方法。<BR><BR>按照惯例，让我们先来看一个例子：<BR><BR><BR><BR>package com.rongji.demo;<BR><BR><BR><BR>import java.sql.*;<BR><BR><BR><BR>public class dataDemo {<BR><BR>public dataDemo() {<BR><BR>}<BR><BR><BR><BR>public static void main(String[] args) {<BR><BR><BR><BR>try {<BR><BR>Class.forName("oracle.jdbc.driver.OracleDriver");<BR><BR>//建立连接<BR><BR>//第二步是用适当的驱动程序连接到DBMS，看下面的代码[自行修改您所连接的数据库相关信息]：<BR><BR>String url = "jdbc:oracle:thin:@192.168.4.45:1521:oemrep";<BR><BR>String username = "ums";<BR><BR>String password = "rongji";<BR><BR>//用url创建连接<BR><BR>Connection con = DriverManager.getConnection(url, username, password);<BR><BR>Statement sta = con.createStatement();<BR><BR>String sql = "select * from rbac_application ";<BR><BR>ResultSet resultSet = sta.executeQuery(sql);<BR><BR>while (resultSet.next()) {<BR><BR>int int_value = resultSet.getInt(1);<BR><BR>String string_value = resultSet.getString(2);<BR><BR>String a = resultSet.getString(3);<BR><BR>String b = resultSet.getString(4);<BR><BR>//从数据库中以两种不同的方式取得数据。<BR><BR>System.out.println(int_value + " " + string_value + " " + a + " " +<BR><BR>b);<BR><BR>//将检索结果在用户浏览器上输出。<BR><BR>}<BR><BR>//获取结果集信息<BR><BR>ResultSetMetaData resultSetMD = resultSet.getMetaData();<BR><BR>System.out.println("ColumnCount:" + resultSetMD.getColumnCount());<BR><BR>for (int i = 1; i &lt; resultSetMD.getColumnCount(); i++) {<BR><BR>System.out.println("ColumnName:" + resultSetMD.getColumnName(i) + " " +<BR><BR>"ColumnTypeName:" +<BR><BR>resultSetMD.getColumnTypeName(i));<BR><BR>System.out.println("isReadOnly:" + resultSetMD.isReadOnly(i)<BR><BR>+ " isWriteable:" + resultSetMD.isWritable(i)<BR><BR>+ " isNullable:" + resultSetMD.isNullable(i));<BR><BR>System.out.println("tableName:" + resultSetMD.getTableName(i));<BR><BR>}<BR><BR><BR><BR>//关闭<BR><BR>con.close();<BR><BR>}<BR><BR>catch (Exception ex) {<BR><BR>ex.printStackTrace();<BR><BR>}<BR><BR>}<BR><BR>} <BR><BR><BR><BR>1、ResultSet类的基本处理方法<BR><BR><BR><BR>一个ResultSet对象对应着一个由查询语句返回的一个表,这个表中包含所有的查询结果,实际上,我们就可以将一个ResultSet对象看成一个表。对ResultSet对象的处理必须逐行进行,而对每一行中的各个列,可以按任何顺序进行处理。<BR><BR>ResultSet对象维持一个指向当前行的指针。最初,这个指针指向第一行之前。Result类的next()方法使这个指针向下移动一行。因此,第一次使用next()方法将指针指向结果集的第一行，这时可以对第一行的数据进行处理。处理完毕后，使用next()方法，将指针移向下一行，继续处理第二行数据。next()方法的返回值是一个boolean型的值，该值若为true, 说明结果集中还存在下一条记录，并且指针已经成功指向该记录，可以对其进行处理；若返回值是false,则说明没有下一行记录，结果集已经处理完毕。<BR><BR>在对每一行进行处理时，可以对各个列按任意顺序进行处理。不过，按从左到右的顺序对各列进行处理可以获得较高的执行效率．ResultSet类的getXXX()方法可以从某一列中获得检索结果。其中XXX是JDBC中的Java数据类型，如int, String ,Date等，这与PreparedStatement类和CallableStatement类设置SQL语句参数值相类似。 Sun公司提供的getXXX() API提供两种方法来指定列名进行检索：一种是以一个int值作为列的索引，另一种是以一个String对象作为列名来索引。大家可以参照一下上面的例子。<BR><BR><BR><BR>2、获取结果集的信息<BR><BR><BR><BR>在对数据库的表结构已经了解的前提下，可以知道返回的结果集中各个列的一些情况，如：列名数据类型等等。有时并不知道结果集中各个列的情况，这时可以使用Resultset类的getMetaData方法来获取结果集的信息。如上面的例子:<BR><BR>ResultSetMetaData resultSetMD = resultSet.getMetaData();<BR><BR>GetMetaData()方法返回一个ResultSetMetaData类的对象，使用该类的方法，得到许多关于结果集的信息，下面给出几个常用的方法：<BR><BR>(1) getColumnCount()返回一个int值，指出结果集中的列数。<BR><BR>(2) getTableName(int column)返回一个字符串，指出参数中所代表列的表的名称。 <BR><BR>(3) getColumnLabel(int column)返回一个String对象，该对象是column所指的列的显示标题。<BR><BR>(4) getColumnName（int column）返回的是该列在数据库中的名称。可以把此方法返回的String对象作为Resultset类的getXXX()方法的参数。不过，并没有太大的实际意义。<BR><BR>(5) getColumnType(int comlumn)返回指定列的SQL数据类型。他的返回值是一个int值。在java.sql.Types类中有关于各种SQL数据类型的定义。<BR><BR>(6) getColumnTypeName(int comlumn)返回指定列的数据类型在数据源中的名称。他的返回值是一个String对象。<BR><BR>(7) isReadOnly(int column) 返回一个boolean值，指出该列是否是只读的。<BR><BR>(8) isWriteable(int column) 返回一个boolean值，指出该列是否可写。<BR><BR>(9) isNullable（int column）返回一个boolean值，指出该列是否允许存入一个NULL 值。<BR><img src ="http://www.blogjava.net/rkind/aggbug/17008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2005-10-27 12:53 <a href="http://www.blogjava.net/rkind/archive/2005/10/27/17008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jdbc 学习笔记3(PreparedStatement对象) </title><link>http://www.blogjava.net/rkind/archive/2005/10/27/17006.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Thu, 27 Oct 2005 04:52:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2005/10/27/17006.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/17006.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2005/10/27/17006.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/17006.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/17006.html</trackback:ping><description><![CDATA[二、通过PreparedStatement对象访问数据库<BR><BR><BR><BR>前面，我们讨论了用连接对象Connection产生Statement对象，然后用Statement与数据库管理系统进行交互。Statement对象在每次执行SQL语句时都将该语句传递给数据库。在多次执行同一语句时，这样做效率较低。解决这个问题的办法是使用PreparedStatement对象。如果数据库支持预编译，可以在创建PreparedStatement对象时将SQL语句传递给数据库做预编译，以后每次执行这个SQL语句时，速度就可以提高很多。如果数据库不支持预编译，则在语句执行时，才将其传给数据库。这对于用户来说是完全透明的。<BR><BR>PreparedStatement对象的SQL语句还可以接受参数。在语句中指出需要接受那些参数，然后进行预编译。在每一次执行时，可以将不同的参数传递给SQL语句，大大提高了程序的效率与灵活性。一般情况下，使用PreparedStatement对象都是带输入参数的。<BR><BR><BR><BR>为了更好的理解，请看下面这个例子：<BR><BR><BR><BR>package com.rongji.demo;<BR><BR><BR><BR>import java.sql.Connection;<BR><BR>import java.sql.DriverManager;<BR><BR>import java.sql.Statement;<BR><BR>import java.sql.DatabaseMetaData;<BR><BR>import java.sql.PreparedStatement;<BR><BR><BR><BR><BR><BR>public class DataConn {<BR><BR>public DataConn() {<BR><BR>}<BR><BR>public static void main(String[] args) {<BR><BR>try<BR><BR>{<BR><BR>//加载驱动程序<BR><BR>//下面的代码为加载JDBD-ODBC驱动程序<BR><BR>Class.forName("oracle.jdbc.driver.OracleDriver");<BR><BR>//建立连接<BR><BR>//第二步是用适当的驱动程序连接到DBMS，看下面的代码[自行修改您所连接的数据库相关信息]：<BR><BR>String url="jdbc:oracle:thin:@192.168.4.45:1521:oemrep";<BR><BR>String user = "ums1";<BR><BR>String password = "rongji";<BR><BR>//用url创建连接<BR><BR>Connection con=DriverManager.getConnection(url,user,password);<BR><BR>//当前的表中有如下几个字段：ID,NAME,PASSWORD,TEXT,NOTE<BR><BR>PreparedStatement insertStatement = con.prepareStatement(<BR><BR>"INSERT INTO rbac_application values(?,?,?,?,?)");<BR><BR>insertStatement.setInt(1,10);<BR><BR>insertStatement.setString(2,"thinkersky");<BR><BR>insertStatement.setString(3,"88888");<BR><BR>insertStatement.setString(4,"这是个测试的应用程序");<BR><BR>insertStatement.setString(5,"备注");<BR><BR>int result = insertStatement.executeUpdate();<BR><BR>System.out.println("the result is" + result);<BR><BR>con.close();<BR><BR>}<BR><BR>catch (Exception e)<BR><BR>{<BR><BR>//输出异常信息<BR><BR>System.err.println("SQLException :"+e.getMessage());<BR><BR>e.printStackTrace();<BR><BR>}<BR><BR>}<BR><BR>}<BR><BR><BR><BR>相信通过这个例子，对PreparedStatement这个类的应用应该有了初步的了解。恩，让我详细介绍一下这个例子吧：）<BR><BR>1、 创建一个PreparedStatement对象<BR><BR><BR><BR>PreparedStatement类是Statement类的子类。同Statemetn类一样，PreparedStatement类的对象也是建立在Connection对象之上的。如下所示：<BR><BR>PreparedStatement insertStatement = con.prepareStatement(<BR><BR>"INSERT INTO rbac_application values(?,?,?,?,?)");<BR><BR>创建该PreparedStatement对象时，相应的插入记录的SQL语句已经被传递到数据库管理系统中进行预编译。<BR><BR><BR><BR>2、 为PreparedStatement对象提供参数<BR><BR><BR><BR>如果以带输入参数的SQL语句形式创建了一个PreparedStatement对象（绝大多数情况下都是如此）。在SQL语句被数据库管理系统正确执行之前，必须为参数（也就是SQL语句中是’?’的地方）进行初始化。初始化的方法是调用PreparedStatement类的一系列setXXX()方法。如果输入参数的数据类型是int型，则调用setInt()方法；如果输入参数是String型，则调用setString()方法。一般说来，Java中提供的简单和复合数据类型，都可以找到相应的setXXX()方法。<BR><BR>现在，让我们再回头看看我们例子中对几个参数的初始化情况：<BR><BR>insertStatement.setInt(1,10);<BR><BR>insertStatement.setString(2,"thinkersky");<BR><BR>insertStatement.setString(3,"88888");<BR><BR>insertStatement.setString(4,"这是个测试的应用程序");<BR><BR>insertStatement.setString(5,"备注");<BR><BR>这里，setXXX()方法一般有两个参数，第一个参数都是int型，该参数指示JDBC PreparedStatement对象的第几个参数将要被初始化。第二个参数的值就是PreparedStatemetn将要被初始化的参数取值，数据类型自然也就相同。这里要说明的是当PreparedStatement的一个对象的参数被初始化以后，该参数的值一直保持不变，直到他被再一次赋值为止。<BR><BR><BR><BR>3、 调用PreparedStatement对象的executeUpdate()方法<BR><BR><BR><BR>这里，要清楚PreparedStatement对象的executeUpdate（）方法不同于Statement对象的executeUpdate()方法，前者是不带参数的，其所需要的SQL语句型的参数已经在实例化该对象时提供了。另外，executeUpdate()方法将返回一个整数，这个整数代表executeUpdate()方法执行后所更新的数据库中记录的行数。执行完上面的例子，其结果返回为1。那么什么情况下返回0呢？其实啊，当PreparedStatement对象的executeUpdate()方法的返回值是0时。有两种可能：<BR><BR>(1) 所执行的SQL语句是对数据库管理系统的记录进行操作；并且没有记录被 更新<BR><BR>(2) 所执行的SQL语句是对数据库管理系统的表、视图等对象进行操作的DDL语言，没有数据记录被直接修改。<BR><img src ="http://www.blogjava.net/rkind/aggbug/17006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2005-10-27 12:52 <a href="http://www.blogjava.net/rkind/archive/2005/10/27/17006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jdbc笔记四,关于数据类型 </title><link>http://www.blogjava.net/rkind/archive/2005/10/27/17007.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Thu, 27 Oct 2005 04:52:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2005/10/27/17007.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/17007.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2005/10/27/17007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/17007.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/17007.html</trackback:ping><description><![CDATA[Java和SQL各自有一套自己定义的数据类型（jsp的数据类型实际上就是Java的数据类型），我们要在Jsp程序和数据库管理系统之间正确的交换数据，必然要将二者的数据类型进行转换。先让我们来看两个表：<BR><BR>表SQL到Java数据类型影射表<BR><BR>SQL 数据类型<BR>JAVA数据类型<BR><BR>CHAR<BR>String<BR><BR>VARCHAR<BR>String<BR><BR>LONGVARCHAR<BR>String<BR><BR>NUMERIC<BR>java.math.BigDecimal<BR><BR>DECIMAL<BR>java.math.BigDecimal<BR><BR>BIT<BR>Boolean<BR><BR>TINYINT<BR>Byte<BR><BR>SMALLINT<BR>Short<BR><BR>INTEGER<BR>Int<BR><BR>BIGINT<BR>Long<BR><BR>REAL<BR>Float<BR><BR>FLOAT<BR>Double<BR><BR>DOUBLE<BR>Double<BR><BR>BINARY<BR>byte[]<BR><BR>VARBINARY<BR>byte[]<BR><BR>LONGVARBINARY<BR>byte[]<BR><BR>DATE<BR>java.sql.Date<BR><BR>TIME<BR>java.sql.Time<BR><BR>TIMESTAMP<BR>java.sql.Timestamp<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>Java到SQL数据类型影射表<BR><BR>JAVA数据类型<BR>SQL 数据类型<BR><BR>String<BR>VARCHAR or LONGVARCHAR<BR><BR>java.math.BigDecimal<BR>NUMERIC<BR><BR>Boolean<BR>BIT<BR><BR>Byte<BR>TINYINT<BR><BR>Short<BR>SMALLINT<BR><BR>Int<BR>INTEGER<BR><BR>Long<BR>BIGINT<BR><BR>Float<BR>REAL<BR><BR>Double<BR>DOUBLE<BR><BR>byte[]<BR>VARBINARY or LONGVARBINARY<BR><BR>java.sql.Date<BR>DATE <BR><BR>java.sql.Time<BR>TIME<BR><BR>java.sql.Timestamp<BR>TIMESTAMP<BR><BR><BR><BR><BR>这里，大伙要注意了，并不是所有的数据类型在各种数据库管理系统中都被支持。下面，就几种常用的数据类型之间的转化进行说明：<BR><BR><BR><BR>（1） CHAR, VARCHAR, 和 LONGVARCHAR<BR><BR><BR><BR>在SQL语言中，有三种分别表示不同长度的字符类型CHAR, VARCHAR, 和 LONGVARCHAR，在Java/Jsp中并没有相应的三种不同的数据类型与之一一对应，JDBC的处理方法是将其与String或者char[]对应起来。在实际编程中不必对着三种SQL数据类型进行区分，全部将他们转化为Sting或者char[]就可以了。而且通常使用应用的非常普遍的String类型。我们还可以利用String类提供的方法将一个String对象转化为char[],或者用char[]为参数构造一个Stirng对象。<BR><BR>对于定长度的SQL数据类型CHAR(n)，当从数据库管理系统中获得的结果集提取该类型的数据时，JDBC会为其构造一个长度为n的String对象来代表他，如果实际的字符个数不足’n’,系统会自动为String对象补上空格。当向数据库管理系统写入的数据类型应该是CHAR(n)时，JDBC也会将该String对象的末尾补上相应数量的空格。<BR><BR>一般情况下，CHAR, VARCHAR, LONGVARCHAR和String之间可以无差错的进行转换。但非常值得注意的是LONGVARCHAR，这种SQL的数据类型有时在数据库中代表的数据可能有几兆字节的大小，超过了String对象的承受范围。JDBC解决的办法是用Java的Input Stream来接受这种类型的数据[以后我们回涉及到]。Input Stream不仅支持ASCII,而且支持Unicode，我们可以根据需要进行选择。<BR><BR><BR><BR>（2） DECIMAL 和 NUMERIC <BR><BR><BR><BR>SQL的DECIMAL 和 NUMERIC通常用来表示需要一定精度的定点数。在Java的简单数据类型中，没有一种类型与之相对应。但从JDK1.1开始，Sun公司在java.math.*包中加入了一个新的类BigDecimal，该类的对象可以与DECIMAL 、NUMERIC进行转换。<BR><BR>另外，当从数据库管理系统中读取数据时，还可以用getString()方法来获取DECIMAL 和 NUMERIC。<BR><BR><BR><BR>（3） BINARY, VARBINARY, 和 LONGVARBINARY <BR><BR><BR><BR>在编程时无须精确区分这三种SQL数据类型，JDBC将他们统一影射为byte[]。其中LONGVARBINARY和LONGVARCHAR相似，可以代表几兆字节的数据，超出数组的承受范围。解决的办法依然是用Input Stream来接受数据。 <BR><BR><BR><BR>（4） BIT<BR><BR><BR><BR>代表一个二进制位的BIT类型被JDBC影射为boolean型。<BR><BR><BR><BR>（5） TINYINT, SMALLINT, INTEGER, 和 BIGINT <BR><BR><BR><BR>SQL语言的TINYINT, SMALLINT, INTEGER, 和 BIGINT分别代表8位、16位、32位、64位的数据。他们分别被影射为Java的byte, short, int, 和 long <BR><BR><BR><BR>（6） REAL, FLOAT, 和 DOUBLE<BR><BR><BR><BR>SQL定义了REAL, FLOAT, DOUBLE来支持浮点数。JDBC将REAL影射到Java的float,将FLOAT,DOUBLE影射到java的double。<BR><BR><BR><BR>（7） DATE, TIME, 和 TIMESTAMP<BR><BR><BR><BR>SQL定义了三种和日期相关的数据类型。 DATE代表年、月、日，TIME代表时、分、秒，TIMESTAMP结合了DATE和TIME的全部信息，而且增加了更加精确的时间计量单位。<BR><BR>在java的标准类库中，java.util.*包中的Date类用来表示日期和时间。但是该类和SQL中的DATE, TIME, 和 TIMESTAMP直接影射关系并不清晰。并且，该类也不支持TIMESTAMP的精确时间计量单位。因此，Sun公司在java.sql.*中为java.util.Date增加了三个子类：java.sql.Date，java.sql.Time ，java.sql.Timestamp，分别与SQL中的三个日期数据类型相对应。<BR><BR><BR><BR>总之，关于SQL与JAVA之见数据类型的转化，还有很多细节方面的东西，这里就不一一介绍了，有需要的朋友自己可以去查一下相关文档。这里给大家介绍一个我常去的网站：<BR><BR>http://java.sun.com/docs/books/tutorial/jdbc。<BR><img src ="http://www.blogjava.net/rkind/aggbug/17007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2005-10-27 12:52 <a href="http://www.blogjava.net/rkind/archive/2005/10/27/17007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC学习笔记1 </title><link>http://www.blogjava.net/rkind/archive/2005/10/27/17004.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Thu, 27 Oct 2005 04:51:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2005/10/27/17004.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/17004.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2005/10/27/17004.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/17004.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/17004.html</trackback:ping><description><![CDATA[JSP调用JDBC API访问数据库管理系统是通过以下五个步骤来实现的：<BR><BR><BR><BR>（1）加载特定的JDBC驱动程序<BR><BR><BR><BR>为了与特定的数据源连接，JDBC必须加载相应的驱动程序。这些驱动程序都是通过语句：Class.forName("Driver Name"); 来加载的。这里面有一个小技巧，我们可以在”Driver Name”出填入一系列的驱动程序名称，例如：“Class.forName("sun.jdbc.odbc.JdbcOdbcDriver：oracle.jdbc.driver.OracleDriver”); 中间用冒号隔开。JSP将按照列表顺序搜索驱动程序，并且加载第一个能与给定的URL相连的驱动程序。在搜索驱动程序列表时，JSP将跳过包含不可信任代码的驱动程序，除非他与要打开的数据库管理系统是来源于同一处.<BR><BR><BR><BR>（2）用已注册的驱动程序建立到数据库管理系统的连接<BR><BR><BR><BR>我们要做的第二步是用已经注册的驱动程序建立到数据库管理系统的连接，这要通过DriverManager类的getConncetion方法来实现。这里特别需要注意的是String类型 url 参数的取值，url代表一个将要连接的特定的数据库管理系统的数据源。使用不同的数据库驱动程序，url的取值方式是不同的。例程中加载了“com.mysql.jdbc.Driver”驱动，url的取值方式“jdbc:mysql://localhost:3306/ums_db?useUnicode=true&amp;amp;characterEncoding=GB2312”，如果加载“oracle.jdbc.driver.OracleDriver”驱动，url的取值方式应该是“jdbc:oracle:thin:@host name:port number:service name”。其他驱动程序的url的取值方式，各位自行参阅相应的文挡。<BR><BR>例程中的GetConnection()方法只有一个参数String url，代表ODBC数据源，如果连接大型数据库，则需要三个参数：String url、Strng user、String password。User和password代表数据库管理系统的用户名和口令。一般的大型数据库如Oracle、MS SQL Server、DB2等用户名和口令是必须的。而小型的数据库如ACCESS、Foxpro等并不需要。<BR><BR>如果连接成功，则会返回一个Connection类的对象con。以后对数据库的操作都是建立在con对象的基础上的。GetConnection()方法是DriverManager类的静态方法，使用时不用生成DriverManager类的对象，直接使用类名DriverManager就可以调用。 <BR><BR><BR><BR>（3）创建Statement声明，执行SQL语句<BR><BR><BR><BR>在实例化一个Connection类的对象con，成功建立一个到数据库管理系统的连接之后。我们要做的第三步是利用该con对象生成一个Statement类的对象stmt。该对象负责将SQL语句传递给数据库管理系统执行，如果SQL语句产生结果集，stmt对象还会将结果集返回给一个ResultSet类的对象。<BR><BR>Statement类的主要的方法有三个：<BR><BR>executeUpdate(String sql) <BR><BR>executeQuery(String sql) <BR><BR>execute(String sql)<BR><BR>executeUpdate(String sql)方法用于执行DDL类型的SQL语句，这种类型的SQL语句会对数据库管理系统的对象进行创建、修改、删除操作，一般不会返回结果集。<BR><BR><BR><BR>executeQuery(String sql)方法用于执行一条查询数据库的SELECT语句。如果有符合查询条件的数据存在，该方法将返回一个包含相应数据的ResultSet类对象，否则，该对象的next()方法将返回false。<BR><BR><BR><BR>execute(String sql)方法用于执行一个可能返回多个结果集的存储过程（Stored Procedure）或者一条动态生成的不知道结果集个数的SQL语句。如果存储过程或者SQL语句产生一个结果集，该方法返回false.如果产生多个结果集，该方法返回true。我们可以综合运用Statement类的getResultSet(), getUpdateCount(), getMoreResults()方法来检索不同的结果集。<BR><BR>服务器对JSP程序进行编译时，并不对将要执行的SQL语句作语法检查，只是将其作为一个String对象。只有当客户端发出HTTP请求，Java虚拟机对Servlet进行解释执行，将SQL语句传递给数据库管理系统时，才能知道他是否正确。对于错误的SQL语句，在执行时会产生SQLExcepion。其实，所有与JDBC操作的JSP语句都与数据库管理系统及相应的驱动程序有关，是超出JSP的控制范围的。这些语句只有在实际的解释执行中才能检验出是否能顺利执行，因此一定要声明并捕获例外： <BR><BR>try{<BR><BR>….<BR><BR>}catch(SQLException e)<BR><BR>{<BR><BR>Sytem.err.println(“SQLException:”+e.getMessage());<BR><BR>}<BR><BR>否则，JSP程序无法被编译成Servlet。<BR><BR><BR><BR>（4）关闭Statement对象<BR><BR><BR><BR>一个Statement对象在打开后可以多次调用executeQuery(String sql)、executeUpdate(String sql)、execute(String sql)方法来执行SQL语句，与数据库管理系统进行交互。但一个Statement对象在同一时间只能打开一个结果集，对第二个结果集的打开隐含着对第一个结果集的关闭。如果想对多个结果集同时进行操作，必须创建多个Statement对象，在每个Statement对象上执行SQL语句获得相应的结果集。<BR><BR><BR><BR>（5）关闭Connection对象<BR><BR><BR><BR>在处理完对数据库的操作后，一定要将Connection对象关闭，以释放JDBC占用的系统资源。在不关闭Connection对象的前提下再次用DriverManager静态类初始化新的Connection对象会产生系统错误。而一个已经建立连接的Connection对象可以同时初始化多个Statement对象。对应不同的数据库管理系统的Connection对象可以初始化Statement对象的个数是不同的。在Oracle中是50个。<BR><img src ="http://www.blogjava.net/rkind/aggbug/17004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2005-10-27 12:51 <a href="http://www.blogjava.net/rkind/archive/2005/10/27/17004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 连接到远程mysql数据库</title><link>http://www.blogjava.net/rkind/archive/2005/10/27/17003.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Thu, 27 Oct 2005 04:49:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2005/10/27/17003.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/17003.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2005/10/27/17003.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/17003.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/17003.html</trackback:ping><description><![CDATA[<P>首先加载mm.mysql2.0.4-bin.jar驱动,并把其加入classpath,注意一定要打开远程mysql的你的主机的访问权限</P>
<P>然后编写如下代码</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name="org.gjt.mm.mysql.Driver";///加载jdbc driver<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String url="jdbc:mysql://172.20.0.73/jilei";&nbsp; //连接到172.20.0.73上的jilei的mysql数据库<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName(name),//创建类<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con=DriverManager.getConnection(url,"你的username","你的密码")//创建连接</P>
<P>输入以下代码供测试使用</P>
<P>Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <BR>&nbsp;&nbsp;&nbsp;String sql="select * from student"; <BR>&nbsp;&nbsp;ResultSet rs=stmt.executeQuery(sql); <BR>&nbsp;while(rs.next()) { <BR>System.out.println("您的第一个字段内容为："+rs.getString(1)); <BR>System.out.println("您的第二个字段内容为："+rs.getString(2) );<BR>System.out.println("您的第三个字段内容为："+rs.getString(3) );<BR>} <BR>&nbsp;&nbsp;rs.close();<BR>&nbsp;&nbsp;stmt.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.close();</P><img src ="http://www.blogjava.net/rkind/aggbug/17003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2005-10-27 12:49 <a href="http://www.blogjava.net/rkind/archive/2005/10/27/17003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA中正则表达式的应用（二）java.util.regex篇(转)</title><link>http://www.blogjava.net/rkind/archive/2005/10/27/16999.html</link><dc:creator>rkind</dc:creator><author>rkind</author><pubDate>Thu, 27 Oct 2005 04:44:00 GMT</pubDate><guid>http://www.blogjava.net/rkind/archive/2005/10/27/16999.html</guid><wfw:comment>http://www.blogjava.net/rkind/comments/16999.html</wfw:comment><comments>http://www.blogjava.net/rkind/archive/2005/10/27/16999.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rkind/comments/commentRss/16999.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rkind/services/trackbacks/16999.html</trackback:ping><description><![CDATA[现在JDK1.4里终于有了自己的正则表达式API包，JAVA程序员可以免去找第三方提供的正则表达式库的周折了，我们现在就马上来了解一下这个SUN提供的迟来恩物-&nbsp;-对我来说确实如此。 <BR>1.简介：&nbsp; <BR>java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。 <BR><BR>它包括两个类：Pattern和Matcher&nbsp;Pattern&nbsp;一个Pattern是一个正则表达式经编译后的表现模式。&nbsp; <BR>Matcher&nbsp;一个Matcher对象是一个状态机器，它依据Pattern对象做为匹配模式对字符串展开匹配检查。&nbsp;首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式，然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。 <BR><BR>以下我们就分别来看看这两个类： <BR><BR>2.Pattern类:&nbsp; <BR>Pattern的方法如下：&nbsp;static&nbsp;Pattern&nbsp;compile(String&nbsp;regex) <BR>将给定的正则表达式编译并赋予给Pattern类&nbsp; <BR>static&nbsp;Pattern&nbsp;compile(String&nbsp;regex,&nbsp;int&nbsp;flags) <BR>同上，但增加flag参数的指定，可选的flag参数包括：CASE&nbsp;INSENSITIVE,MULTILINE,DOTALL,UNICODE&nbsp;CASE，&nbsp;CANON&nbsp;EQ&nbsp; <BR>int&nbsp;flags() <BR>返回当前Pattern的匹配flag参数.&nbsp; <BR>Matcher&nbsp;matcher(CharSequence&nbsp;input) <BR>生成一个给定命名的Matcher对象&nbsp; <BR>static&nbsp;boolean&nbsp;matches(String&nbsp;regex,&nbsp;CharSequence&nbsp;input) <BR>编译给定的正则表达式并且对输入的字串以该正则表达式为模开展匹配,该方法适合于该正则表达式只会使用一次的情况，也就是只进行一次匹配工作，因为这种情况下并不需要生成一个Matcher实例。&nbsp;&nbsp; <BR>String&nbsp;pattern() <BR>返回该Patter对象所编译的正则表达式。&nbsp; <BR>String[]&nbsp;split(CharSequence&nbsp;input) <BR>将目标字符串按照Pattern里所包含的正则表达式为模进行分割。&nbsp; <BR>String[]&nbsp;split(CharSequence&nbsp;input,&nbsp;int&nbsp;limit) <BR>作用同上，增加参数limit目的在于要指定分割的段数，如将limi设为2，那么目标字符串将根据正则表达式分为割为两段。&nbsp; <BR><BR><BR>一个正则表达式，也就是一串有特定意义的字符，必须首先要编译成为一个Pattern类的实例，这个Pattern对象将会使用matcher()方法来生成一个Matcher实例，接着便可以使用该&nbsp;Matcher实例以编译的正则表达式为基础对目标字符串进行匹配工作，多个Matcher是可以共用一个Pattern对象的。 <BR><BR>现在我们先来看一个简单的例子，再通过分析它来了解怎样生成一个Pattern对象并且编译一个正则表达式，最后根据这个正则表达式将目标字符串进行分割：&nbsp; <BR>import&nbsp;java.util.regex.*; <BR>public&nbsp;class&nbsp;Replacement{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;Exception&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;生成一个Pattern,同时编译一个正则表达式 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pattern&nbsp;p&nbsp;=&nbsp;Pattern.compile("[/]+"); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//用Pattern的split()方法把字符串按"/"分割 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;result&nbsp;=&nbsp;p.split( <BR>"Kevin&nbsp;has&nbsp;seen《LEON》seveal&nbsp;times,because&nbsp;it&nbsp;is&nbsp;a&nbsp;good&nbsp;film." <BR>+"/&nbsp;凯文已经看过《这个杀手不太冷》几次了，因为它是一部" <BR>+"好电影。/名词:凯文。"); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;result.length; i++) <BR>System.out.println(result[i]); <BR>} <BR>} <BR><BR><BR><BR><BR>输出结果为： <BR><BR>Kevin has seen《LEON》seveal times,because it is a good film. <BR>凯文已经看过《这个杀手不太冷》几次了，因为它是一部好电影。 <BR>名词:凯文。 <BR><BR>很明显，该程序将字符串按"/"进行了分段，我们以下再使用 split(CharSequence input, int limit)方法来指定分段的段数，程序改动为： <BR>tring[] result = p.split("Kevin has seen《LEON》seveal times,because it is a good film./ 凯文已经看过《这个杀手不太冷》几次了，因为它是一部好电影。/名词:凯文。"，2); <BR><BR>这里面的参数"2"表明将目标语句分为两段。 <BR><BR>输出结果则为： <BR><BR>Kevin has seen《LEON》seveal times,because it is a good film. <BR>凯文已经看过《这个杀手不太冷》几次了，因为它是一部好电影。/名词:凯文。 <BR><BR>由上面的例子，我们可以比较出java.util.regex包在构造Pattern对象以及编译指定的正则表达式的实现手法与我们在上一篇中所介绍的Jakarta-ORO 包在完成同样工作时的差别，Jakarta-ORO 包要先构造一个PatternCompiler类对象接着生成一个Pattern对象，再将正则表达式用该PatternCompiler类的compile()方法来将所需的正则表达式编译赋予Pattern类： <BR><BR>PatternCompiler orocom=new Perl5Compiler(); <BR><BR>Pattern pattern=orocom.compile("REGULAR EXPRESSIONS"); <BR><BR>PatternMatcher matcher=new Perl5Matcher(); <BR><BR>但是在java.util.regex包里，我们仅需生成一个Pattern类，直接使用它的compile()方法就可以达到同样的效果: <BR>Pattern p = Pattern.compile("[/]+"); <BR><BR>因此似乎java.util.regex的构造法比Jakarta-ORO更为简洁并容易理解。 <BR><BR>3.Matcher类: <BR>Matcher方法如下： Matcher appendReplacement(StringBuffer sb, String replacement) <BR>将当前匹配子串替换为指定字符串，并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个StringBuffer对象里。 <BR>StringBuffer appendTail(StringBuffer sb) <BR>将最后一次匹配工作后剩余的字符串添加到一个StringBuffer对象里。 <BR>int end() <BR>返回当前匹配的子串的最后一个字符在原目标字符串中的索引位置 。 <BR>int end(int group) <BR>返回与匹配模式里指定的组相匹配的子串最后一个字符的位置。 <BR>boolean find() <BR>尝试在目标字符串里查找下一个匹配子串。 <BR>boolean find(int start) <BR>重设Matcher对象，并且尝试在目标字符串里从指定的位置开始查找下一个匹配的子串。 <BR>String group() <BR>返回当前查找而获得的与组匹配的所有子串内容 <BR>String group(int group) <BR>返回当前查找而获得的与指定的组匹配的子串内容 <BR>int groupCount() <BR>返回当前查找所获得的匹配组的数量。 <BR>boolean lookingAt() <BR>检测目标字符串是否以匹配的子串起始。 <BR>boolean matches() <BR>尝试对整个目标字符展开匹配检测，也就是只有整个目标字符串完全匹配时才返回真值。 <BR>Pattern pattern() <BR>返回该Matcher对象的现有匹配模式，也就是对应的Pattern 对象。 <BR>String replaceAll(String replacement) <BR>将目标字符串里与既有模式相匹配的子串全部替换为指定的字符串。 <BR>String replaceFirst(String replacement) <BR>将目标字符串里第一个与既有模式相匹配的子串替换为指定的字符串。 <BR>Matcher reset() <BR>重设该Matcher对象。 <BR>Matcher reset(CharSequence input) <BR>重设该Matcher对象并且指定一个新的目标字符串。 <BR>int start() <BR>返回当前查找所获子串的开始字符在原目标字符串中的位置。 <BR>int start(int group) <BR>返回当前查找所获得的和指定组匹配的子串的第一个字符在原目标字符串中的位置。 <BR><BR><BR>（光看方法的解释是不是很不好理解？不要急，待会结合例子就比较容易明白了） <BR><BR>一个Matcher实例是被用来对目标字符串进行基于既有模式（也就是一个给定的Pattern所编译的正则表达式）进行匹配查找的，所有往Matcher的输入都是通过CharSequence接口提供的，这样做的目的在于可以支持对从多元化的数据源所提供的数据进行匹配工作。 <BR><BR>我们分别来看看各方法的使用： <BR><BR>★matches()/lookingAt ()/find()： <BR>一个Matcher对象是由一个Pattern对象调用其matcher()方法而生成的，一旦该Matcher对象生成,它就可以进行三种不同的匹配查找操作： <BR><BR>matches()方法尝试对整个目标字符展开匹配检测，也就是只有整个目标字符串完全匹配时才返回真值。 <BR>lookingAt ()方法将检测目标字符串是否以匹配的子串起始。 <BR>find()方法尝试在目标字符串里查找下一个匹配子串。 <BR><BR>以上三个方法都将返回一个布尔值来表明成功与否。 <BR><BR>★replaceAll ()/appendReplacement()/appendTail()： <BR>Matcher类同时提供了四个将匹配子串替换成指定字符串的方法： <BR><BR>replaceAll() <BR>replaceFirst() <BR>appendReplacement() <BR>appendTail() <BR><BR>replaceAll()与replaceFirst()的用法都比较简单，请看上面方法的解释。我们主要重点了解一下appendReplacement()和appendTail()方法。 <BR><BR>appendReplacement(StringBuffer sb, String replacement) 将当前匹配子串替换为指定字符串，并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个StringBuffer对象里，而appendTail(StringBuffer sb) 方法则将最后一次匹配工作后剩余的字符串添加到一个StringBuffer对象里。 <BR><BR>例如，有字符串fatcatfatcatfat,假设既有正则表达式模式为"cat"，第一次匹配后调用appendReplacement(sb,"dog"),那么这时StringBuffer sb的内容为fatdog，也就是fatcat中的cat被替换为dog并且与匹配子串前的内容加到sb里，而第二次匹配后调用appendReplacement(sb,"dog")，那么sb的内容就变为fatdogfatdog，如果最后再调用一次appendTail（sb）,那么sb最终的内容将是fatdogfatdogfat。 <BR><BR>还是有点模糊？那么我们来看个简单的程序： <BR>//该例将把句子里的"Kelvin"改为"Kevin" <BR>import java.util.regex.*; <BR>public class MatcherTest{ <BR>public static void main(String[] args) <BR>throws Exception { <BR>//生成Pattern对象并且编译一个简单的正则表达式"Kelvin" <BR>Pattern p = Pattern.compile("Kevin"); <BR>//用Pattern类的matcher()方法生成一个Matcher对象 <BR>Matcher m = p.matcher("Kelvin Li and Kelvin Chan are both working in Kelvin Chen's KelvinSoftShop company"); <BR>StringBuffer sb = new StringBuffer(); <BR>int i=0; <BR>//使用find()方法查找第一个匹配的对象 <BR>boolean result = m.find(); <BR>//使用循环将句子里所有的kelvin找出并替换再将内容加到sb里 <BR>while(result) { <BR>i++; <BR>m.appendReplacement(sb, "Kevin"); <BR>System.out.println("第"+i+"次匹配后sb的内容是："+sb); <BR>//继续查找下一个匹配对象 <BR>result = m.find(); <BR>} <BR>//最后调用appendTail()方法将最后一次匹配后的剩余字符串加到sb里； <BR>m.appendTail(sb); <BR>System.out.println("调用m.appendTail(sb)后sb的最终内容是:"+ sb.toString()); <BR>} <BR>} <BR><BR><BR><BR>最终输出结果为： <BR>第1次匹配后sb的内容是：Kevin <BR>第2次匹配后sb的内容是：Kevin Li and Kevin <BR>第3次匹配后sb的内容是：Kevin Li and Kevin Chan are both working in Kevin <BR>第4次匹配后sb的内容是：Kevin Li and Kevin Chan are both working in Kevin Chen's Kevin <BR>调用m.appendTail(sb)后sb的最终内容是：Kevin Li and Kevin Chan are both working in Kevin Chen's KevinSoftShop company. <BR><BR>看了上面这个例程是否对appendReplacement()，appendTail()两个方法的使用更清楚呢，如果还是不太肯定最好自己动手写几行代码测试一下。 <BR><BR>★group()/group(int group)/groupCount()： <BR>该系列方法与我们在上篇介绍的Jakarta-ORO中的MatchResult .group()方法类似(有关Jakarta-ORO请参考上篇的内容)，都是要返回与组匹配的子串内容，下面代码将很好解释其用法： <BR>import java.util.regex.*; <BR><BR>public class GroupTest{ <BR>public static void main(String[] args) <BR>throws Exception { <BR>Pattern p = Pattern.compile("(ca)(t)"); <BR>Matcher m = p.matcher("one cat,two cats in the yard"); <BR>StringBuffer sb = new StringBuffer(); <BR>boolean result = m.find(); <BR>System.out.println("该次查找获得匹配组的数量为："+m.groupCount()); <BR>for(int i=1;i&lt;=m.groupCount();i++){ <BR>System.out.println("第"+i+"组的子串内容为： "+m.group(i)); <BR>} <BR>} <BR>} <BR><BR><BR><BR>输出为： <BR>该次查找获得匹配组的数量为：2 <BR>第1组的子串内容为：ca <BR>第2组的子串内容为：t <BR><BR>Matcher对象的其他方法因比较好理解且由于篇幅有限，请读者自己编程验证。 <BR><BR>4．一个检验Email地址的小程序： <BR>最后我们来看一个检验Email地址的例程，该程序是用来检验一个输入的EMAIL地址里所包含的字符是否合法，虽然这不是一个完整的EMAIL地址检验程序，它不能检验所有可能出现的情况，但在必要时您可以在其基础上增加所需功能。 <BR>import java.util.regex.*; <BR>public class Email { <BR>public static void main(String[] args) throws Exception { <BR>String input = args[0]; <BR>//检测输入的EMAIL地址是否以 非法符号"."或"@"作为起始字符 <BR>Pattern p = Pattern.compile("^\\.|^\\@"); <BR>Matcher m = p.matcher(input); <BR>if (m.find()){ <BR>System.err.println("EMAIL地址不能以'.'或'@'作为起始字符"); <BR>} <BR>//检测是否以"www."为起始 <BR>p = Pattern.compile("^www\\."); <BR>m = p.matcher(input); <BR>if (m.find()) { <BR>System.out.println("EMAIL地址不能以'www.'起始"); <BR>} <BR>//检测是否包含非法字符 <BR>p = Pattern.compile("[^A-Za-z0-9\\.\\@_\\-~#]+"); <BR>m = p.matcher(input); <BR>StringBuffer sb = new StringBuffer(); <BR>boolean result = m.find(); <BR>boolean deletedIllegalChars = false; <BR>while(result) { <BR>//如果找到了非法字符那么就设下标记 <BR>deletedIllegalChars = true; <BR>//如果里面包含非法字符如冒号双引号等，那么就把他们消去，加到SB里面 <BR>m.appendReplacement(sb, ""); <BR>result = m.find(); <BR>} <BR>m.appendTail(sb); <BR>input = sb.toString(); <BR>if (deletedIllegalChars) { <BR>System.out.println("输入的EMAIL地址里包含有冒号、逗号等非法字符，请修改"); <BR>System.out.println("您现在的输入为: "+args[0]); <BR>System.out.println("修改后合法的地址应类似: "+input); <BR>} <BR>} <BR>} <BR><BR><BR><BR>例如，我们在命令行输入：java Email www.kevin@163.net <BR><BR>那么输出结果将会是：EMAIL地址不能以'www.'起始 <BR><BR>如果输入的EMAIL为@kevin@163.net <BR><BR>则输出为：EMAIL地址不能以'.'或'@'作为起始字符 <BR><BR>当输入为：cgjmail#$%@163.net <BR><BR>那么输出就是： <BR><BR>输入的EMAIL地址里包含有冒号、逗号等非法字符，请修改 <BR>您现在的输入为: cgjmail#$%@163.net <BR>修改后合法的地址应类似: cgjmail@163.net <BR><BR>5．总结： <BR>本文介绍了jdk1.4.0-beta3里正则表达式库--java.util.regex中的类以及其方法，如果结合与上一篇中所介绍的Jakarta-ORO API作比较，读者会更容易掌握该API的使用，当然该库的性能将在未来的日子里不断扩展，希望获得最新信息的读者最好到及时到SUN的网站去了解。 <BR><BR>6．结束语： <BR>本来计划再多写一篇介绍一下需付费的正则表达式库中较具代表性的作品，但觉得既然有了免费且优秀的正则表达式库可以使用，何必还要去找需付费的呢，相信很多读者也是这么想的:，所以有兴趣了解更多其他的第三方正则表达式库的朋友可以自己到网上查找或者到我在参考资料里提供的网址去看看。 <BR><img src ="http://www.blogjava.net/rkind/aggbug/16999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rkind/" target="_blank">rkind</a> 2005-10-27 12:44 <a href="http://www.blogjava.net/rkind/archive/2005/10/27/16999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>