﻿<?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/badboyryan/category/13321.html</link><description>&lt;hr color=red&gt;
&lt;marquee  direction=left bgcolor= aaaaee behavior=scroll scrollamount=2 onmouseover="this.stop();" onmouseout="this.start();" width=500&gt;
&lt;font color=green&gt; 在恰当的时间、地点以恰当的方式表达给恰当的人...&lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;font color=blue&gt;阅读的时候请注意分类，佛曰我日里面是谈笑文章，其他是各个分类的文章，积极的热情投入到写博的队伍中来，支持blogjava做大做强！向dudu站长致敬&gt;&gt; &gt;  （qq群侠客岛:26858781）&lt;/font&gt;
&lt;/marquee&gt; 
&lt;hr color=blue&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 27 May 2008 04:23:28 GMT</lastBuildDate><pubDate>Tue, 27 May 2008 04:23:28 GMT</pubDate><ttl>60</ttl><item><title>把你的应用设置为JBOSS的默认应用</title><link>http://www.blogjava.net/badboyryan/archive/2007/12/06/165815.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Thu, 06 Dec 2007 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/12/06/165815.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/165815.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/12/06/165815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/165815.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/165815.html</trackback:ping><description><![CDATA[<p>1、删除jbossweb-tomcat55.sar 里面的ROOT.WAR<br />
2、把你的应用放在jboss-4.0.5.GA\server\default\deploy\下面<br />
&nbsp;&nbsp; 比如名称为MYAPP.war<br />
3、新建一个jboss-web.xml<br />
&nbsp;&lt;jboss-web&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;context-root&gt;/&lt;/context-root&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/jboss-web&gt;<br />
4、重新启动jboss<br />
我的环境是jboss-4.0.5.GA<br />
</p>
<p>最近要研究一下JBOSS的一系列产品：<br />
</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/badboyryan/aggbug/165815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-12-06 15:45 <a href="http://www.blogjava.net/badboyryan/archive/2007/12/06/165815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nod32与CVSNT不兼容</title><link>http://www.blogjava.net/badboyryan/archive/2007/10/23/155171.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Tue, 23 Oct 2007 01:34:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/10/23/155171.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/155171.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/10/23/155171.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/155171.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/155171.html</trackback:ping><description><![CDATA[<p>具体的错误是这样的：安装完成了CVS服务器以后，客户端登录的时候报<br />
</p>
<p>Error reading from server &lt;192.168.0.108&gt;: -1: Unknown error<br />
</p>
<p>解决的方法是这样的：NODE 32里面IMON点击后－－&gt;<br />
</p>
<p>右边窗口点击SETUp按钮－－&gt;<br />
</p>
<p>弹出的窗口里面Miscellaneous－－&gt;<br />
</p>
<p>ExcluSion－－&gt;<br />
<br />
</p>
<p>Edit--&gt;<br />
</p>
<p>C:\Program Files\CVSNT\cvsservice.exe－－&gt;添加上就ok了<br />
</p>
<p>你的CVS就能登录了！！！<br />
</p>
<p>&nbsp;</p>
<p><br />
&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/badboyryan/aggbug/155171.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-10-23 09:34 <a href="http://www.blogjava.net/badboyryan/archive/2007/10/23/155171.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jira如何配置使用LDAP认证</title><link>http://www.blogjava.net/badboyryan/archive/2007/09/28/149062.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Fri, 28 Sep 2007 05:16:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/09/28/149062.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/149062.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/09/28/149062.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/149062.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/149062.html</trackback:ping><description><![CDATA[
		<p>今天的手又痒痒了，觉得应该是时候写点东西了。<br />这一周的时间在忙活LDAP认证，这个已经不是什么新鲜名词了概念就免了；<br />之所以学LDAP,还是为了SSO和PORTAL。<br />经过一周的时间，搭建好了LDAP服务器，用的开源的APACHE的DS，还有APACHE的studio；配置起来非常的简单主要掌握几个要点就好了：<br />1、server.xml的配置<br />Adding your own partition resp. suffix<br />添加自己的数据格式<br />&lt;property name="contextPartitionConfigurations"&gt;<br />  &lt;set&gt;<br />    &lt;ref bean="examplePartitionConfiguration"/&gt;<br />    &lt;ref bean="myPartitionConfiguration"/&gt;<br />  &lt;/set&gt;<br />&lt;/property&gt;<br />然后查询examplePartitionConfiguration把他的bean配置重新复制一份需要修改几个地方<br />&lt;bean id="myPartitionConfiguration"<br />      class="org.apache.directory.server.core.partition.<br />                            impl.btree.MutableBTreePartitionConfiguration"&gt;<br />Next give the partition a name and change the suffix to o=mydomain<br />&lt;property name="name" value="mydomain" /&gt;<br /><br />&lt;property name="contextEntry"&gt;<br />    &lt;value&gt;<br />      objectClass: top<br />      objectClass: domain<br />      objectClass: extensibleObject<br />      dc: example ---&gt; o:mydomaim<br />    &lt;/value&gt;<br />&lt;/property&gt;<br />重新启动apache ds；<br /><br />2、LDIF文件的格式<br />第一步：组织结构以及管理员信息<br />dn: o=chinantn,dc=com<br />objectclass: organization<br />objectclass: top<br />o: chinantn</p>
		<p>dn: cn=manager,o=chinantn,dc=com<br />objectclass: organizationalPerson<br />objectclass: person<br />objectclass: top<br />cn: manager<br />sn: badboyryan<br />userpassword:: c2VjcmV0</p>
		<p>dn: ou=departments,o=chinantn,dc=com<br />objectclass: organizationalUnit<br />objectclass: top<br />ou: departments</p>
		<p>dn: ou=market,ou=departments,o=chinantn,dc=com<br />objectclass: organizationalUnit<br />objectclass: top<br />ou: market</p>
		<p>dn: ou=developer,ou=departments,o=chinantn,dc=com<br />objectclass: organizationalUnit<br />objectclass: top<br />ou: developer</p>
		<p>dn: ou=service,ou=departments,o=chinantn,dc=com<br />objectclass: organizationalUnit<br />objectclass: top<br />ou: service</p>
		<p>dn: ou=finance,ou=departments,o=chinantn,dc=com<br />objectclass: organizationalUnit<br />objectclass: top<br />ou: finance</p>
		<p>dn: ou=directorate,ou=departments,o=chinantn,dc=com<br />objectclass: organizationalUnit<br />objectclass: top<br />ou: directorate</p>
		<p>dn: ou=engineer,ou=departments,o=chinantn,dc=com<br />objectclass: organizationalUnit<br />objectclass: top<br />ou: engineer</p>
		<p>dn: ou=partners,o=chinantn,dc=com<br />objectclass: organizationalUnit<br />objectclass: top<br />ou: partners</p>
		<p>dn: ou=customers,ou=partners,o=chinantn,dc=com<br />objectclass: organizationalUnit<br />objectclass: top<br />ou: customers</p>
		<p>dn: ou=suppliers,ou=partners,o=chinantn,dc=com<br />objectclass: organizationalUnit<br />objectclass: top<br />ou: suppliers</p>
		<p>dn: ou=employees,ou=partners,o=chinantn,dc=com<br />objectclass: organizationalUnit<br />objectclass: top<br />ou: employees<br /><br />第二步：人员信息<br /><br />dn: uid=scf,ou=developer,ou=departments,o=chinantn,dc=com<br />objectClass: person<br />objectClass: uidObject<br />objectClass: organizationalPerson<br />objectClass: top<br />cn: sss<br />sn: scf<br />uid: scf<br />userpassword:: e01ENX1YTXNwY1ZWVFhUbFh1K1M0QllLY0hBPT0=<br />人员信息就少写一点了，有空你再慢慢的补充上。<br />第三步：导入LDIF文件，这个时候LDAP服务器里面就有了一棵树（组织结构）<br />第四步：被指jira让他利用LDAP认证来登录系统，如下图所示：<br /><img src="http://www.blogjava.net/images/blogjava_net/badboyryan/15229/o_ldapclient.bmp" /><br /><br /><br /><br />经过上面的折腾就完成了一个通过LDAP认证的小例子了。<br />注意转帖的时候带上：<br />©所有：http://badboyryan.blogjava.net<br />随意的转帖不受法律约束。<br /></p>
<img src ="http://www.blogjava.net/badboyryan/aggbug/149062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-09-28 13:16 <a href="http://www.blogjava.net/badboyryan/archive/2007/09/28/149062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LDAP:error code 一览表</title><link>http://www.blogjava.net/badboyryan/archive/2007/09/26/148200.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Wed, 26 Sep 2007 01:30:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/09/26/148200.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/148200.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/09/26/148200.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/148200.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/148200.html</trackback:ping><description><![CDATA[
		<font size="2">0 LDAP_SUCCESS Success <br />1 LDAP_OPERATIONS_ERROR Operations error <br />2 LDAP_PROTOCOL_ERROR Protocol error <br />3 LDAP_TIMELIMIT_EXCEEDED Timelimit exceeded <br />4 LDAP_SIZELIMIT_EXCEEDED Sizelimit exceeded <br />5 LDAP_COMPARE_FALSE Compare false <br />6 LDAP_COMPARE_TRUE Compare true <br />7 LDAP_STRONG_AUTH_NOT_SUPPORTED Strong authentication not supported <br />8 LDAP_STRONG_AUTH_REQUIRED Strong authentication required <br />9 LDAP_PARTIAL_RESULTS Partial results <br />16 LDAP_NO_SUCH_ATTRIBUTE No such attribute <br />17 LDAP_UNDEFINED_TYPE Undefined attribute type <br />18 LDAP_INAPPROPRIATE_MATCHING Inappropriate matching <br />19 LDAP_CONSTRAINT_VIOLATION Constraint violation <br />20 LDAP_TYPE_OR_VALUE_EXISTS Type or value exists <br />21 LDAP_INVALID_SYNTAX Invalid syntax <br />32 LDAP_NO_SUCH_OBJECT No such object <br />33 LDAP_ALIAS_PROBLEM Alias problem <br />34 LDAP_INVALID_DN_SYNTAX Invalid DN syntax <br />35 LDAP_IS_LEAF Object is a leaf <br />36 LDAP_ALIAS_DEREF_PROBLEM Alias dereferencing problem <br />48 LDAP_INAPPROPRIATE_AUTH Inappropriate authentication <br />49 LDAP_INVALID_CREDENTIALS Invalid credentials <br />50 LDAP_INSUFFICIENT_ACCESS Insufficient access <br />51 LDAP_BUSY DSA is busy <br />52 LDAP_UNAVAILABLE DSA is unavailable <br />53 LDAP_UNWILLING_TO_PERFORM DSA is unwilling to perform <br />54 LDAP_LOOP_DETECT Loop detected <br />64 LDAP_NAMING_VIOLATION Naming violation <br />65 LDAP_OBJECT_CLASS_VIOLATION Object class violation <br />66 LDAP_NOT_ALLOWED_ON_NONLEAF Operation not allowed on nonleaf <br />67 LDAP_NOT_ALLOWED_ON_RDN Operation not allowed on RDN <br />68 LDAP_ALREADY_EXISTS Already exists <br />69 LDAP_NO_OBJECT_CLASS_MODS Cannot modify object class <br />70 LDAP_RESULTS_TOO_LARGE Results too large <br />80 LDAP_OTHER Unknown error <br />81 LDAP_SERVER_DOWN Can't contact LDAP server <br />82 LDAP_LOCAL_ERROR Local error <br />83 LDAP_ENCODING_ERROR Encoding error <br />84 LDAP_DECODING_ERROR Decoding error <br />85 LDAP_TIMEOUT Timed out <br />86 LDAP_AUTH_UNKNOWN Unknown authentication method <br />87 LDAP_FILTER_ERROR Bad search filter <br />88 LDAP_USER_CANCELLED User cancelled operation <br />89 LDAP_PARAM_ERROR Bad parameter to an ldap routine <br />90 LDAP_NO_MEMORY Out of memory </font>
<img src ="http://www.blogjava.net/badboyryan/aggbug/148200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-09-26 09:30 <a href="http://www.blogjava.net/badboyryan/archive/2007/09/26/148200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>  jms消息类型（转）</title><link>http://www.blogjava.net/badboyryan/archive/2007/08/06/134713.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Mon, 06 Aug 2007 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/08/06/134713.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/134713.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/08/06/134713.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/134713.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/134713.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
								</td>
						</tr>
						<tr>
								<td>
										<strong>
										</strong>
								</td>
						</tr>
				</tbody>
		</table>
		<span class="oblog_text">
				<p>在JMS1.1规范中规定了5种JMS消息类型,分别如下:</p>
				<p>1.创建一个TextMessage</p>
				<p>TextMessage message;</p>
				<p>message = session.createTextMessage();</p>
				<p>2.解包一个TextMessage</p>
				<p>
						<br />去解包一个TextMessage类型的消息，客户端可以使用Message.getText方法：</p>
				<p>
						<br />String stockInfo; </p>
				<p>stockInfo = message.getText();</p>
				<p>3.创建一个BytesMessage</p>
				<p>byte[] stockData; </p>
				<p>BytesMessage message;</p>
				<p>message = session.createBytesMessage();</p>
				<p>message.writeBytes(stockData);</p>
				<p>
						<br />4.解包一个BytesMessage</p>
				<p>
						<br />当接收到一个ByteMessage时，可以使用下面的方式来解包：</p>
				<p>
						<br />byte[] stockInfo; </p>
				<p>int length;<br />length = message.readBytes(stockData);<br />消息体被拷贝到字节数组，客户端程序可以读取这个树组来解释数据。</p>
				<p>5.创建一个MapMessage</p>
				<p>MapMessage message;</p>
				<p>message = session.createMapMessage();<br />...其他代码<br />message.setString("Name", "CN-Java");</p>
				<p>message.setDouble("Value", stockValue);</p>
				<p>message.setLong("Time", stockTime);</p>
				<p>message.setDouble("Diff", stockDiff);<br />message.setString("Info", "Recent server announcement causes market interest");</p>
				<p>6.解包一个MapMessage</p>
				<p>stockName = message.getString("Name");</p>
				<p>stockDiff = message.getDouble("Diff");</p>
				<p>stockValue = message.getDouble("Value");</p>
				<p>stockTime = message.getLong("Time");<br />如果你想得到整个元素的列表，可以使用MapMessage.getMapNames方法来获得。</p>
				<p>7.创建一个StreamMessage</p>
				<p>
						<br />和MapMessage相似，一个应用程序可以按序列发送多个字段到一个消息中，这些字段都是原始类型的，要做这些，你可以使用一个StreamMessage，</p>
				<p>message.writeString(stockName);</p>
				<p>message.writeDouble(stockValue);</p>
				<p>message.writeLong(stockTime);<br />message.writeDouble(stockDiff);<br />message.writeString(stockInfo);</p>
				<p>8.解包一个StreamMessage</p>
				<p>
						<br />StreamMessage中的元素必须按照被写入的顺序读出：</p>
				<p>stockName = message.readString();</p>
				<p>stockValue = message.readDouble();</p>
				<p>stockTime = message.readLong();</p>
				<p>stockDiff = message.readDouble();</p>
				<p>stockInfo = message.readString();</p>
				<p>9.创建一个ObjectMessage</p>
				<p>ObjectMessage message;</p>
				<p>message = session.createObjectMessage();</p>
				<p>message.setObject(stockObject);</p>
				<p>10.解包ObjectMessage</p>
				<p>去解包ObjectMessage,使用ObjectMessage.getObject得到对象，一但对象被取出来，客户端程序使用Java造型语句将对象还原成原始对象。<br />StockObject stockObject;<br />stockObject = (StockObject)message.getObject();</p>
		</span>
<img src ="http://www.blogjava.net/badboyryan/aggbug/134713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-08-06 15:45 <a href="http://www.blogjava.net/badboyryan/archive/2007/08/06/134713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>今天复习一下Eclipse里面的快捷键</title><link>http://www.blogjava.net/badboyryan/archive/2007/07/17/130753.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Tue, 17 Jul 2007 02:35:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/07/17/130753.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/130753.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/07/17/130753.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/130753.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/130753.html</trackback:ping><description><![CDATA[关于文本编辑，里面常用的快捷键；<br /><br />1、查看eclipse的快捷键<br /><br />  Ctrl +Shift+L<br /><br />2、修改<br /><br />    Ctrl+Shilf+L+L<br /><br />这样就可以自己定义快捷键了！<img src ="http://www.blogjava.net/badboyryan/aggbug/130753.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-07-17 10:35 <a href="http://www.blogjava.net/badboyryan/archive/2007/07/17/130753.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ireport设计jasper报表提高java报表开发效率</title><link>http://www.blogjava.net/badboyryan/archive/2007/07/05/128290.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Thu, 05 Jul 2007 03:21:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/07/05/128290.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/128290.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/07/05/128290.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/128290.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/128290.html</trackback:ping><description><![CDATA[今天发现了小家碧玉，jasper，用ireport2.0设计报表，大致流程是这样的：<br /><br />1、设置classpath把mysql的jdbc驱动加到里面；<br /><br />2、连接数据库；<br /><br />3、设定动态链接<br /><br />4、报表查询<br /><br />5、设计报表<br /><br />6、编译，选择jrviewer<br /><br />7、在设计报表的时候把字段的属性里面，TExtField里面的stretch  with over flow勾上不然不显示啊<br /><br />     common里面的stretch type选择relative to tallest object<br /><br />8、执行报表（使用动态连结）<br /><br />9、看到效果了吗？<br /><br />10、使用的时候在jsp里面调用.jasper文件啊！！！<br /><br /><br /><img src ="http://www.blogjava.net/badboyryan/aggbug/128290.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-07-05 11:21 <a href="http://www.blogjava.net/badboyryan/archive/2007/07/05/128290.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBuilder2007企业版破解及汉化方法</title><link>http://www.blogjava.net/badboyryan/archive/2007/06/21/125487.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Thu, 21 Jun 2007 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/06/21/125487.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/125487.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/06/21/125487.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/125487.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/125487.html</trackback:ping><description><![CDATA[<div class="tit">&nbsp;</div>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt">
            <p>JBUILDER2007企业版下载 </p>
            <p>支持迅雷<a href="http://altd.borland.com/akdlm/download/jbuilder/JBuilder_2007/Enterprise/JBuilder2007_enttrial.zip">http://altd.borland.com/akdlm/download/jbuilder/JBuilder_2007/Enterprise/JBuilder2007_enttrial.zip</a></p>
            <p>破解补丁的两个文件 </p>
            <p><a href="http://www.china-polo.com.cn/%5BJBuilder.2007.%5D.sanct6.jar">http://www.china-polo.com.cn/[JBuilder.2007.].sanct6.jar</a> </p>
            <p><a href="http://www.china-polo.com.cn/%5BJBuilder.2007.%5D.sanctuary.jar">http://www.china-polo.com.cn/[JBuilder.2007.].sanctuary.jar</a> </p>
            <p>这两个文件放到csdn的下载频道了攒点积分</p>
            <p>http://download.csdn.net/user/songchaunfang</p>
            <p>&nbsp;</p>
            <p>破解说明： <br />
            将两个jar文件复制到X:\JBuilder2007\jbuilder\eclipse\plugins\com.borland.sanctuary.client.core_6.0.0 目录下（X:\JBuilder2007　为您的安装目录）。 </p>
            <p><br />
            官方中文包下载地址(支持迅雷): <br />
            <a href="http://eclipse.cdpa.nsysu.edu.tw/downloads/drops/L-3.2.1_Language_Packs-200609210945/NLpack1-eclipse-SDK-3.2.1-win32.zip">http://eclipse.cdpa.nsysu.edu.tw/downloads/drops/L-3.2.1_Language_Packs-200609210945/NLpack1-eclipse-SDK-3.2.1-win32.zip</a></p>
            <p>中文包安装方法:把中文包里的两个目录:license和features 解压到 X:\JBuilder2007\jbuilder\eclipse\ <br />
            目录下 </p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/badboyryan/aggbug/125487.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-06-21 10:08 <a href="http://www.blogjava.net/badboyryan/archive/2007/06/21/125487.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中的Boxing和unboxing</title><link>http://www.blogjava.net/badboyryan/archive/2007/06/12/123733.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Tue, 12 Jun 2007 14:39:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/06/12/123733.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/123733.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/06/12/123733.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/123733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/123733.html</trackback:ping><description><![CDATA[
		<table style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellspacing="1" cellpadding="3" width="98%" bgcolor="#cccccc" border="0">
				<tbody>
						<tr bgcolor="#f8f8f8">
								<td>
										<p>
												<a href="http://blogger.org.cn/blog/blog.asp?name=hongrui" target="_blank">邢红瑞</a> 发表于 2007-6-8 16:00:58 </p>
								</td>
						</tr>
						<tr bgcolor="#ffffff">
								<td height="0">
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>最近给替一个朋友出的几道java的面试题，主要是面试java高级工程师，报酬就是晚饭，已经沦落的卖艺的境地。<br />题目很简单<br />   Integer i1 = 100;<br />   Integer i2 = 100;<br />   Integer i3 = 1000;<br />   Integer i4 = 1000;<br />   System.out.println(i1==i2);<br />   System.out.println(i3==i4);<br />很遗憾，没有一个答对的，正确答案是<br />true<br />false<br />如果面试者写这样的写是错误的，就算通过。<br />这个的原因要从java5的Boxing和unboxing谈起，boxing就是封装基本类型的对象，unboxing就是转换对象到基本类型。<br />Integer, Long, Float, Double, Short, Character etc.都是这样的类型他们是immutable。<br />Boxing<br />在jdk1.4.2中，<br />必须是// Assigning primitive type to wrapper type<br />   Integer iWrapper = new Integer(10);<br />java5中<br /> // Assigning primitive type to wrapper type<br />   Integer iWrapper = 10;<br />unboxing<br />在jdk1.4.2中，<br />int iPrimitive = iWrapper.intValue();<br />java5中<br />int iPrimitive = iWrapper;<br />下面是基本类型作为对象存储的范围，<br />boolean values true and false <br />All byte values <br />short values between -128 and 127 <br />int values between -128 and 127 <br />char in the range \u0000 to \u007F <br />如果int values between -128 and 127，VM使用相同的对象，否则创建新的对象。<br />所以这段代码，大家不要奇怪<br />System.out.println(0L == 0);<br />System.out.println(((Long)0L).equals(0));<br />第二行代码是0不等于0<br />因为大家犯这样的一个错误<br /> static private final String LOCK = "LOCK";<br />  void testMethod() {<br />    synchronized(LOCK) {<br />    ...<br />    }<br />  }<br />应该用new，不要直接=，对于int，最好使用int a[0] ，因为array也是对象，不像Integer，a[0]的值可以改变。<br /></td>
														</tr>
												</tbody>
										</table>
										<br />
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/badboyryan/aggbug/123733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-06-12 22:39 <a href="http://www.blogjava.net/badboyryan/archive/2007/06/12/123733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何通过java或jsp向数据库存取二进制图片</title><link>http://www.blogjava.net/badboyryan/archive/2007/06/01/121285.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Fri, 01 Jun 2007 00:38:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/06/01/121285.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/121285.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/06/01/121285.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/121285.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/121285.html</trackback:ping><description><![CDATA[前几天突然看到学校音乐站上的图片原来是存储在数据库上的,是二进制而不是使用路径保存的,在网上招了找发现大多介绍的都是hph方式,在这里做个总结,首先要存储二进制文件在数据库中要搞清楚下面几个内容:<br />1 mysql存储大容量的二进制文件的格式是blob，其实除了图片还可以存别的<br />2 要向数据库存储二进制的文件一定要把要存储的数据转换成二进制流<br />废话就不多说了，大家看看代码很容易明白，先来看一个app程序，当然首先您要在数据库中先建立一个用于保存图片的表和相应的列，数据格式为blob<br />package com.lizhe;<br />import java.io.*;<br />import java.sql.*;<br />public class PutImg {<br />public void putimg() {<br />try {<br />Class.forName("org.gjt.mm.mysql.Driver").newInstance();<br />String url = "jdbc:mysql://localhost/img?user=root&amp;password=root&amp;useUnicode=true&amp;characterEncoding=gbk";<br />Connection conn = DriverManager.getConnection(url);<br />Statement stmt = conn.createStatement();<br />//stmt.execute("insert into imgt (id) values (5)");<br />stmt.close();<br />PreparedStatement pstmt = null;<br />String sql = "";<br />File file = new File("c:\blog.jpg");<br />InputStream photoStream = new FileInputStream(file);<br />//sql = " UPDATE imgt SET img = ? ";<br /><br />sql = "INSERT INTO imgtable (img) VALUES (?)";<br /><br />pstmt = conn.prepareStatement(sql);<br />pstmt.setBinaryStream(1, photoStream, (int) file.length());<br />pstmt.executeUpdate();<br />pstmt.close();<br />conn.close();<br />} catch (Exception e) {<br />e.printStackTrace();<br />}<br />}<br />public static void main(String args[]){<br />PutImg pi=new PutImg();<br />pi.putimg();<br />}<br />}<br /><br />InputStream photoStream = new FileInputStream(file);<br />可以很清楚的看到我们首先把一个图片文件(当然也可以是别的什么文件)转换成了一个二进制输入流<br />pstmt.setBinaryStream(1, photoStream, (int) file.length());<br />这个方法建议大家去查一下API文档,第一个参数是通配符位置没的说,第二个参数是流,这和以往的string类型的参数不太一样,我刚看到的时候也觉得豁然开朗了,但是到这里还没完,不同于以往的字符串参数,这里我们还需要第三个参数来设置这个流的长度,这里也就是这个文件的长度,导出数据库中的sql,一切都清楚了<br />INSERT INTO `m_diy` VALUES (2,? JFIF HH?? ExifMM* b j ( 1 r 2 ?i H H Adobe Photoshop CS Windows2007:03:18 23:08:15 ? ??? ? ........等等<br />其实就是将文件先转换成了二进制的流,然后插入到了sql语言中,向数据库写入了很长很长的一段sql语句<br /><br /><br /><br />然后我们再来写一个app程序将这个文件读出来,存储成一个图片文件<br />package com.lizhe;<br />import java.io.*;<br />import java.sql.*;<br />class GetImg {<br /><br />private static final String URL = "jdbc:mysql://localhost/img?user=root&amp;password=root&amp;useUnicode=true&amp;characterEncoding=gbk";<br />private Connection conn = null; <br />private PreparedStatement pstmt = null; <br />private ResultSet rs = null; <br />private File file = null; <br /><br />public void blobRead(String outfile, int picID) throws Exception {<br />FileOutputStream fos = null;<br />InputStream is = null;<br />byte[] Buffer = new byte[4096];<br />try {<br />Class.forName("org.gjt.mm.mysql.Driver").newInstance();<br />conn = DriverManager.getConnection(URL);<br />pstmt = conn.prepareStatement("select img from imgt where id=?");<br />pstmt.setInt(1, picID); // 传入要取的图片的ID<br />rs = pstmt.executeQuery();<br />rs.next();<br />file = new File(outfile);<br />if (!file.exists()) {<br />file.createNewFile(); // 如果文件不存在，则创建<br />}<br />fos = new FileOutputStream(file);<br />is = rs.getBinaryStream("img");<br />int size = 0;<br /><br />while ((size = is.read(Buffer)) != -1) {<br />// System.out.println(size);<br />fos.write(Buffer, 0, size);<br />}<br />} catch (Exception e) {<br />System.out.println( e.getMessage());<br />} finally {<br />// 关闭用到的资源<br />fos.close();<br />rs.close();<br />pstmt.close();<br />conn.close();<br />}<br />}<br />public static void main(String[] args) {<br />try {<br />GetImg gi=new GetImg();<br />gi.blobRead("c:/getimgs/1.jpg", 5);<br />} catch (Exception e) {<br />System.out.println("[Main func error: ]" + e.getMessage());<br />}<br />}<br />}<br />这里需要注意的是<br />is = rs.getBinaryStream("img");<br />img是数据库中相应的列名,其实和rs.getString()方法差不多,只不过这个方法是读取二进制流的<br />最后在帖两个bs系统上用的文件给大家参考<br />通过struts的action向数据库写入二进制图片<br />/*<br />* Generated by MyEclipse Struts<br />* Template path: templates/java/JavaClass.vtl<br />*/<br />package com.lizhe.struts.action;<br />import java.io.File;<br />import java.io.FileInputStream;<br />import java.io.FileNotFoundException;<br />import java.io.IOException;<br />import java.io.InputStream;<br />import java.sql.Connection;<br />import java.sql.DriverManager;<br />import java.sql.PreparedStatement;<br />import java.sql.Statement;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />import org.apache.struts.action.Action;<br />import org.apache.struts.action.ActionForm;<br />import org.apache.struts.action.ActionForward;<br />import org.apache.struts.action.ActionMapping;<br />import org.apache.struts.upload.FormFile;<br />import com.lizhe.struts.form.UpimgForm;<br />/** <br />* MyEclipse Struts<br />* Creation date: 05-18-2007<br />* <br />* XDoclet definition:<br />* @struts.action path="/upimg" name="upimgForm" input="/userhomepage.jsp"<br />* @struts.action-forward name="userhome" path="/userhomepage.jsp" redirect="true" contextRelative="true"<br />*/<br />public class UpimgAction extends Action {<br />/*<br />* Generated Methods<br />*/<br />/** <br />* Method execute<br />* @param mapping<br />* @param form<br />* @param request<br />* @param response<br />* @return ActionForward<br />* @throws IOException <br />* @throws FileNotFoundException <br />*/<br />public ActionForward execute(ActionMapping mapping, ActionForm form,<br />HttpServletRequest request, HttpServletResponse response) throws FileNotFoundException, IOException {<br />UpimgForm upimgForm = (UpimgForm) form;// TODO Auto-generated method stub<br /><br />FormFile file=upimgForm.getFile();<br />InputStream is=file.getInputStream();<br /><br />try {<br />Class.forName("org.gjt.mm.mysql.Driver").newInstance();<br />String url = "jdbc:mysql://localhost/blog?user=root&amp;password=root&amp;useUnicode=true&amp;characterEncoding=gb2312";<br />Connection conn = DriverManager.getConnection(url);<br />Statement stmt = conn.createStatement();<br />//stmt.execute("insert into img (id) values (5)");<br />stmt.close();<br />PreparedStatement pstmt = null;<br />String sql = "";<br />//File file = new File("c:\blog.jpg");<br />//InputStream photoStream = new FileInputStream(file);<br />//sql = " UPDATE imgt SET img = ? ";<br /><br />sql = "INSERT INTO img (img) VALUES (?)";<br /><br />pstmt = conn.prepareStatement(sql);<br />pstmt.setBinaryStream(1, is, (int) file.getFileSize());<br />pstmt.executeUpdate();<br />pstmt.close();<br />conn.close();<br />} catch (Exception e) {<br />e.printStackTrace();<br />}<br /><br />return mapping.findForward("userhomepage");<br />}<br />}<br />和app的方式几乎是一样的<br />第二个文件是通过jsp将数据库中的图片显示在页面上<br />这个有些不同<br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.sql.*" %&gt; <br />&lt;%@ page import="java.util.*"%&gt; <br />&lt;%@ page import="java.text.*"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;%@ page import="java.awt.*"%&gt; <br />&lt;html&gt; <br />&lt;body&gt; <br />&lt;% <br />Class.forName("org.gjt.mm.mysql.Driver").newInstance();<br />String url="jdbc:mysql://localhost/img?user=root&amp;password=root";<br />Connection con = DriverManager.getConnection(url); <br />String sql = "select * from imgt where id=5"; <br />Statement stmt = con.createStatement(); <br /><br />ResultSet rs = stmt.executeQuery(sql); <br />if(rs.next()) { <br />InputStream in = rs.getBinaryStream("img"); <br />ServletOutputStream op = response.getOutputStream(); <br />int len; <br />byte[] buf=new byte[1024]; <br />while((len= in.read(buf))!=-1) { <br />op.write(buf, 0, len); <br />} <br />op.close(); <br />in.close(); <br />} <br /><br />rs.close(); <br />stmt.close(); <br />con.close(); <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br /><img src ="http://www.blogjava.net/badboyryan/aggbug/121285.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-06-01 08:38 <a href="http://www.blogjava.net/badboyryan/archive/2007/06/01/121285.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于WEB应用开发的java程序员必备工具</title><link>http://www.blogjava.net/badboyryan/archive/2007/05/18/118237.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Fri, 18 May 2007 01:29:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/05/18/118237.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/118237.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/05/18/118237.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/118237.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/118237.html</trackback:ping><description><![CDATA[
		<p>
				<font face="黑体" size="4">
						<table cellspacing="0" cellpadding="0" width="100%" border="0">
								<tbody>
										<tr>
												<td valign="top" width="86%">一个好的程序员除了具备扎实的基本功外，还应该具有更为灵活的逻辑思维与判断能力。除此之外，撑握一些行之有效的辅助工具也很重要。工欲善其事,必先利其器。有好的工具辅助，所做的工作将事半功倍。下面向大家推荐基于WEB应用开发的java程序员应该必备的辅助开发工具。<br /><br />　　1，Java剖析工具　--　profiler<br />　　是一个全功能的Java剖析工具（profiler），专用于分析J2SE和J2EE应用程序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中。JProfiler可提供许多IDE整合和应用服务器整合用途。JProfiler直觉式的GUI让你可以找到效能瓶颈、抓出内存漏失 (memory leaks)、并解决执行绪的问题。它让你得以对heap walker作资源回收器的root analysis，可以轻易找出内存漏失；heap快照（snapshot）模式让未被参照（reference）的对象、稍微被参照的对象、或在终结（finalization）队列的对象都会被移除；整合精灵以便剖析浏览器的Java外挂功能。<br />下载地址：http://www.ej-technologies.com/download/overview.html<br /><br /><br />　 <br />　　2，冗余代码检查　--　Simian<br />　　Simian UI 是一个用来发现重复代码的eclipse插件，对于改善设计，消除冗余代码很有帮助。<br />安装方法：使用eclipse的Help-&gt;Software Update进行安装。站点地址为:http://www.integility.com/eclipse/<br />安装后，按照提示重新启动eclipse。在希望进行分析的项目上点击右键，选择Simian-&gt;Add Simian to this project，就可以为该项目进行代码检查。<br /><br /><br />　　3，浏览器端调试工具（IE）　--　Internet Explorer Developer Toolbar<br />　　微软发布了Internet Explorer Developer Toolbar Beta版。该产品让开发人员能够深入探索和理解Web页面，帮助开发者更好地创建Web应用。浏览和修改Web页的文档对象模型（DOM）。具备以下特性：<br />－通过多种技术方式定位、选定Web页上的特定元素。<br />－禁止或激活IE设置。<br />－查看HTML对象的类名、ID，以及类似链接路径、tab顺序、快捷键等细节。<br />－描绘表格、单元格、图片或选定标签的轮廓。<br />－显示图片象素、大小、路径、替代文字等。<br />－即时重定义浏览器窗口大小到800x600或自定义大小。<br />－清空浏览器缓存和cookie，被清除项可从所有对象或给定域中选择。<br />－直接访问关联W3C规范参考、IE开发组blog或其他来源。<br />－显示设计时标尺，帮助对齐对象。<br />该工具条可集成在IE窗口，或以浮动窗口形式存在。<br /><br />下载地址：从微软官方下载<br /><br /><br /><br />　　4，浏览器端调试工具（Firefox）　--　Firebug<br />　　JavaScript, CSS, HTML，Ajax调试工具。功能包括HTML/CSS检查，除错工具，错误控制台和命令行等。可对javascript做调试和性能分析，查看html代码的结构，css样式动态提示，检测并显示页面错误，浏览树型结构的DOM数据，可以显示javascript的log等等功能。<br /><br />下载地址：http://www.getfirebug.com/ </td>
												<td valign="top" width="14%">
														<div align="right">
																<font color="gray">    </font>
														</div>
														<script type="text/javascript">
																<!--
google_ad_client = "pub-1552958637257019";
google_ad_width = 160;
google_ad_height = 600;
google_ad_format = "160x600_as";
google_ad_channel ="";
google_ad_type = "text";
google_color_border = "A8DDA0";
google_color_bg = "EBFFED";
google_color_link = "0000CC";
google_color_url = "008000";
google_color_text = "6F6F6F";
//-->
														</script>
														<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
														</script>
														<iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-1552958637257019&amp;dt=1179451618468&amp;lmt=1179451618&amp;format=160x600_as&amp;output=html&amp;correlator=1179451618468&amp;url=http%3A%2F%2Fwww.cn-java.com%2Ftarget%2Fnews.php%3Fnews_id%3D3817&amp;color_bg=EBFFED&amp;color_text=6F6F6F&amp;color_link=0000CC&amp;color_url=008000&amp;color_border=A8DDA0&amp;ad_type=text&amp;ref=http%3A%2F%2Fwww.cn-java.com%2F&amp;cc=99&amp;flash=9&amp;u_h=768&amp;u_w=1024&amp;u_ah=738&amp;u_aw=1024&amp;u_cd=32&amp;u_tz=480&amp;u_java=true" frameborder="0" width="160" scrolling="no" height="600" allowtransparency="">
														</iframe>
												</td>
										</tr>
								</tbody>
						</table>
				</font>
		</p>
<img src ="http://www.blogjava.net/badboyryan/aggbug/118237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-05-18 09:29 <a href="http://www.blogjava.net/badboyryan/archive/2007/05/18/118237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR 入門與應用（二） </title><link>http://www.blogjava.net/badboyryan/archive/2007/03/05/101868.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Mon, 05 Mar 2007 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/03/05/101868.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/101868.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/03/05/101868.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/101868.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/101868.html</trackback:ping><description><![CDATA[
		<span class="javascript" id="text166425">假設您要從資料庫中查詢出一些字串，然後填寫到表單的下拉選單中。 <br /><br />例如一個示意的Java程式如下： <br /><table class="java" cellspacing="1" cellpadding="3" bgcolor="#999999" border="0"><tbody><tr><td valign="top" align="left" width="1" bgcolor="#dddddd"><pre><font color="#555555">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></font></pre></td><td valign="top" align="left" bgcolor="#ffffff"><pre><font class="java-reserved_word"><strong>package</strong></font> onlyfun.caterpillar;<br /> <br /><font class="java-reserved_word"><strong>public</strong></font><font class="java-reserved_word"><strong>class</strong></font> Option <font class="java-bracket">{</font><br /><font class="java-reserved_word"><strong>public</strong></font> String[] getOptions() <font class="java-bracket">{</font><br /><font class="java-comment">// 實際上這些字串是從資料庫中查到的啦…</font><br /><font class="java-reserved_word"><strong>return</strong></font><font class="java-reserved_word"><strong>new</strong></font> String[] <font class="java-bracket">{</font><font class="java-string">"良葛格"</font>, <font class="java-string">"毛美眉"</font>, <font class="java-string">"米小狗"</font><font class="java-bracket">}</font>; <br /><font class="java-bracket">}</font><br /><font class="java-bracket">}</font></pre></td></tr></tbody></table><br /><br />傳回的字串陣列，您要填寫到下拉選單中，當然，首先我們要在dwr.xml中開發這個物件… <br /><table class="java" cellspacing="1" cellpadding="3" bgcolor="#999999" border="0"><tbody><tr><td valign="top" align="left" width="1" bgcolor="#dddddd"><pre><font color="#555555">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></font></pre></td><td valign="top" align="left" bgcolor="#ffffff"><pre>&lt;?xml version=<font class="java-string">"1.0"</font> encoding=<font class="java-string">"UTF-8"</font>?&gt;<br />&lt;!DOCTYPE dwr PUBLIC <font class="java-string">"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"</font><font class="java-string">"http://www.getahead.ltd.uk/dwr/dwr10.dtd"</font>&gt;<br /><br />&lt;dwr&gt;<br />  &lt;allow&gt;<br />    &lt;create creator=<font class="java-string">"new"</font> javascript=<font class="java-string">"OPT"</font>&gt;<br />        &lt;param name=<font class="java-string">"class"</font> value=<font class="java-string">"onlyfun.caterpillar.Option"</font>/&gt;<br />    &lt;/create&gt;  <br />  &lt;/allow&gt;<br />&lt;/dwr&gt;<br /></pre></td></tr></tbody></table><br /><br />這是我們的網頁… <br /><table class="java" cellspacing="1" cellpadding="3" bgcolor="#999999" border="0"><tbody><tr><td valign="top" align="left" width="1" bgcolor="#dddddd"><pre><font color="#555555">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></font></pre></td><td valign="top" align="left" bgcolor="#ffffff"><pre>&lt;!DOCTYPE HTML PUBLIC <font class="java-string">"-//W3C//DTD HTML 4.01 Transitional//EN"</font>&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;meta http-equiv=<font class="java-string">"Content-Type"</font> content=<font class="java-string">"text/html; charset=BIG5"</font>&gt;<br />&lt;script src=<font class="java-string">"option.js"</font> type=<font class="java-string">"text/javascript"</font>&gt;&lt;/script&gt;<br />&lt;script src=<font class="java-string">"dwr/interface/OPT.js"</font> type=<font class="java-string">"text/javascript"</font>&gt;&lt;/script&gt;<br />&lt;script src=<font class="java-string">"dwr/engine.js"</font> type=<font class="java-string">"text/javascript"</font>&gt;&lt;/script&gt;<br />&lt;script src=<font class="java-string">"dwr/util.js"</font> type=<font class="java-string">"text/javascript"</font>&gt;&lt;/script&gt;<br /> <br />&lt;/head&gt;<br /> <br />&lt;body&gt;<br />    選項: &lt;select id=<font class="java-string">"opts"</font>&gt;&lt;/select&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br /></pre></td></tr></tbody></table><br /><br />傳回的字串陣列會填入opts這個select中，我們的option.js如下… <br /><table class="java" cellspacing="1" cellpadding="3" bgcolor="#999999" border="0"><tbody><tr><td valign="top" align="left" width="1" bgcolor="#dddddd"><pre><font color="#555555">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></font></pre></td><td valign="top" align="left" bgcolor="#ffffff"><pre>window.onload = function() <font class="java-bracket">{</font><br />    OPT.getOptions(populate);  <br /><font class="java-bracket">}</font>;<br /> <br />function populate(list)<font class="java-bracket">{</font><br />    DWRUtil.removeAllOptions(<font class="java-string">"opts"</font>);<br />    DWRUtil.addOptions(<font class="java-string">"opts"</font>, list);<br /><font class="java-bracket">}</font></pre></td></tr></tbody></table><br /><br />夠簡單了…不需要解釋了… <br /><br />看一下結果…  </span>
		<br />
		<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/caterpillar_here/88753484.jpg" />
		<br />
		<br />
		<span class="javascript" id="text166427">好啦！我知道有人在說了，這個程式有夠無聊…<img alt="Dead" src="http://www.javaworld.com.tw/jute/images/smiles/smile_dead.gif" width="15" /><br /><br />改一下！就是個不錯的範例了，例如連動方塊，唔！在Ajax in action中叫啥？Dynamic double combo？… <br /><br />假設一個會去從資料庫中查詢資料的Java程式示意如下： <br /><table class="java" cellspacing="1" cellpadding="3" bgcolor="#999999" border="0"><tbody><tr><td valign="top" align="left" width="1" bgcolor="#dddddd"><pre><font color="#555555">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br /></font></pre></td><td valign="top" align="left" bgcolor="#ffffff"><pre><font class="java-reserved_word"><strong>package</strong></font> onlyfun.caterpillar;<br /> <br /><font class="java-reserved_word"><strong>import</strong></font> java.util.Map;<br /><font class="java-reserved_word"><strong>import</strong></font> java.util.TreeMap;<br /> <br /><font class="java-reserved_word"><strong>public</strong></font><font class="java-reserved_word"><strong>class</strong></font> Bike <font class="java-bracket">{</font><br />  <font class="java-reserved_word"><strong>private</strong></font> Map&lt;String, String[]&gt; bikes;<br />  <br />  <font class="java-reserved_word"><strong>public</strong></font> Bike() <font class="java-bracket">{</font><br />    bikes = <font class="java-reserved_word"><strong>new</strong></font> TreeMap&lt;String, String[]&gt;();<br />    bikes.put(<font class="java-string">"2000"</font>, <font class="java-reserved_word"><strong>new</strong></font> String[] <font class="java-bracket">{</font><font class="java-string">"2000 T1"</font>, <font class="java-string">"2000 T2"</font>, <font class="java-string">"2000 T3"</font><font class="java-bracket">}</font>);<br />    bikes.put(<font class="java-string">"2001"</font>, <font class="java-reserved_word"><strong>new</strong></font> String[] <font class="java-bracket">{</font><font class="java-string">"2001 A1"</font>, <font class="java-string">"2001 A2"</font><font class="java-bracket">}</font>);<br />    bikes.put(<font class="java-string">"2002"</font>, <font class="java-reserved_word"><strong>new</strong></font> String[] <font class="java-bracket">{</font><font class="java-string">"2002 BW1"</font>, <font class="java-string">"2002 BW2"</font>, <font class="java-string">"2002 BW"</font><font class="java-bracket">}</font>);<br />    bikes.put(<font class="java-string">"2003"</font>, <font class="java-reserved_word"><strong>new</strong></font> String[] <font class="java-bracket">{</font><font class="java-string">"2003 S320"</font><font class="java-bracket">}</font>);<br />    bikes.put(<font class="java-string">"2004"</font>, <font class="java-reserved_word"><strong>new</strong></font> String[] <font class="java-bracket">{</font><font class="java-string">"2004 TA1"</font>, <font class="java-string">"2004 TA2"</font>, <font class="java-string">"2004 TA3"</font><font class="java-bracket">}</font>);<br />  <font class="java-bracket">}</font><br />  <br />  <font class="java-reserved_word"><strong>public</strong></font> String[] getYears() <font class="java-bracket">{</font><br />    String[] keys = <font class="java-reserved_word"><strong>new</strong></font> String[bikes.size()];<br />    <font class="java-reserved_word"><strong>int</strong></font> i = 0;<br />    <font class="java-reserved_word"><strong>for</strong></font>(String key : bikes.keySet()) <font class="java-bracket">{</font><br />      keys[i++] = key;<br />    <font class="java-bracket">}</font><br />    <font class="java-reserved_word"><strong>return</strong></font> keys; <br />  <font class="java-bracket">}</font><br />  <br />  <font class="java-reserved_word"><strong>public</strong></font> String[] getBikes(String year) <font class="java-bracket">{</font><br />    <font class="java-reserved_word"><strong>return</strong></font> bikes.get(year);<br />  <font class="java-bracket">}</font><br /><font class="java-bracket">}</font></pre></td></tr></tbody></table><br /><br />getYears()跟getBkies()分別表示產品的年份跟型號，這邊用Map模擬，實際上資料是來自資料庫的查詢。 <br /><br />一樣的，在dwr.xml中設定： <br /><table class="java" cellspacing="1" cellpadding="3" bgcolor="#999999" border="0"><tbody><tr><td valign="top" align="left" width="1" bgcolor="#dddddd"><pre><font color="#555555">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></font></pre></td><td valign="top" align="left" bgcolor="#ffffff"><pre>&lt;?xml version=<font class="java-string">"1.0"</font> encoding=<font class="java-string">"UTF-8"</font>?&gt;<br />&lt;!DOCTYPE dwr PUBLIC <font class="java-string">"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"</font><font class="java-string">"http://www.getahead.ltd.uk/dwr/dwr10.dtd"</font>&gt;<br /><br />&lt;dwr&gt;<br />  &lt;allow&gt;<br />    &lt;create creator=<font class="java-string">"new"</font> javascript=<font class="java-string">"Bike"</font> scope=<font class="java-string">"application"</font>&gt;<br />        &lt;param name=<font class="java-string">"class"</font> value=<font class="java-string">"onlyfun.caterpillar.Bike"</font>/&gt;<br />    &lt;/create&gt;<br />  &lt;/allow&gt;<br />&lt;/dwr&gt;<br /></pre></td></tr></tbody></table><br /><br />我們會有個腳踏車年份與型號查詢頁面： <br /><table class="java" cellspacing="1" cellpadding="3" bgcolor="#999999" border="0"><tbody><tr><td valign="top" align="left" width="1" bgcolor="#dddddd"><pre><font color="#555555">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></font></pre></td><td valign="top" align="left" bgcolor="#ffffff"><pre>&lt;!DOCTYPE HTML PUBLIC <font class="java-string">"-//W3C//DTD HTML 4.01 Transitional//EN"</font>&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;meta http-equiv=<font class="java-string">"Content-Type"</font> content=<font class="java-string">"text/html; charset=BIG5"</font>&gt;<br />&lt;title&gt;Insert title here&lt;/title&gt;<br />  &lt;script type=<font class="java-string">'text/javascript'</font> src=<font class="java-string">'dwr/interface/Bike.js'</font>&gt;&lt;/script&gt;<br />  &lt;script type=<font class="java-string">'text/javascript'</font> src=<font class="java-string">'dwr/engine.js'</font>&gt;&lt;/script&gt;<br />  &lt;script type=<font class="java-string">'text/javascript'</font> src=<font class="java-string">'dwr/util.js'</font>&gt;&lt;/script&gt;<br />  &lt;script type=<font class="java-string">'text/javascript'</font> src=<font class="java-string">'bike.js'</font>&gt;&lt;/script&gt;<br />&lt;/head&gt;<br />&lt;body onload=<font class="java-string">"refreshYearList();"</font>&gt;<br />  年份：&lt;select id=<font class="java-string">"years"</font> onchange=<font class="java-string">"refreshBikeList();"</font>&gt;&lt;/select&gt;&lt;br/&gt;&lt;br/&gt;<br />  型號：&lt;select id=<font class="java-string">"bikes"</font>&gt;&lt;/select&gt;&lt;br/&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br /></pre></td></tr></tbody></table><br /><br />注意，在選完第一個年份後，會觸發onchange事件，接著第二個下拉選單會自動填上對應年份的型號，而不是按鈕按下，再去取得第二個下拉選單，然後refresh...blah...blah... <br /><br />bike.js如下… <br /><table class="java" cellspacing="1" cellpadding="3" bgcolor="#999999" border="0"><tbody><tr><td valign="top" align="left" width="1" bgcolor="#dddddd"><pre><font color="#555555">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br /></font></pre></td><td valign="top" align="left" bgcolor="#ffffff"><pre>function refreshYearList() <font class="java-bracket">{</font><br />    Bike.getYears(populateYearList);<br /><font class="java-bracket">}</font><br /> <br />function populateYearList(list)<font class="java-bracket">{</font><br />    DWRUtil.removeAllOptions(<font class="java-string">"years"</font>);<br />    DWRUtil.addOptions(<font class="java-string">"years"</font>, list);<br />    refreshBikeList();<br /><font class="java-bracket">}</font><br /> <br />function refreshBikeList() <font class="java-bracket">{</font><br />    var year = $(<font class="java-string">"years"</font>).value;<br />    Bike.getBikes(year, populateBikeList);<br /><font class="java-bracket">}</font><br /> <br />function populateBikeList(list)<font class="java-bracket">{</font><br />    DWRUtil.removeAllOptions(<font class="java-string">"bikes"</font>);<br />    DWRUtil.addOptions(<font class="java-string">"bikes"</font>, list);<br /><font class="java-bracket">}</font></pre></td></tr></tbody></table><br /><br />一樣很簡單… <br /><br />看個無聊的畫面…XD </span>
		<br />
		<br />
		<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/caterpillar_here/42270937.jpg" />
		<br />
		<br />
		<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1239538</p>
<img src ="http://www.blogjava.net/badboyryan/aggbug/101868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-03-05 11:48 <a href="http://www.blogjava.net/badboyryan/archive/2007/03/05/101868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IBM Portal的web剪切出现乱码的解决办法！</title><link>http://www.blogjava.net/badboyryan/archive/2007/01/05/91997.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Fri, 05 Jan 2007 07:00:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/01/05/91997.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/91997.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/01/05/91997.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/91997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/91997.html</trackback:ping><description><![CDATA[
		<p>文档出处：<a href="/badboyryan/archive/2007/01/05/91997.html">http://www.blogjava.net/badboyryan/archive/2007/01/05/91997.html</a><br /><br />同事在用IBM Portal的WEB剪切的时候，预览效果的时候发现页面全部是乱码why？<br /><br />其实这个问题是编码的问题，理解了jsp里面的编码是解决问题的关键，看看这段代码：<br />&lt;%@ page language="java" contentType="text/html; charset=gb2312" pageEncoding="GB18030"%&gt;<br />&lt;%@ taglib uri="<a href="http://jakarta.apache.org/struts/tags-bean">http://jakarta.apache.org/struts/tags-bean</a>" prefix="bean"%&gt;<br />&lt;%@ taglib uri="<a href="http://jakarta.apache.org/struts/tags-html">http://jakarta.apache.org/struts/tags-html</a>" prefix="html"%&gt;<br />&lt;%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %&gt;<br />&lt;tiles:insert page="/common/tiles/level2pageTiles.jsp" flush="true"&gt; <br />      &lt;tiles:put name="header" value="/daohang/shouye/display_l_1_indexHeader.jsp" /&gt;<br />      &lt;tiles:put name="top" value="/common/jsppage/top.jsp" /&gt;<br />      &lt;tiles:put name="middle" value="/daohang/shouye/display_l_1_indexMiddle.jsp"/&gt;<br />      &lt;%-- 带计数器的为/common/jsppage/bottom2.jsp --%&gt;<br />      &lt;tiles:put name="bottom" value="/common/jsppage/bottom.jsp"/&gt;<br />&lt;/tiles:insert&gt;<br /><br />我们看到：pageEncoding="GB18030"的作用是表示了该JSP文件使用的编码方式，这个属性主要是用于应用服务器在解析JSP文件，并转换为servlet时使用；<br />contentType="text/html; charset=gb2312" 的作用是：表示该网页采用GB2312国标码,这也是简体中文标准版本,如果不加,部分浏览器会自动选择编码,从而导致乱码出现,所以最好还是要加上；<br />&lt;meta   http－equiv=″Content－Type″   content=″text/html;   charset=gb2312″&gt;   　　   <br />　　   &lt;!－－网页内容类型，TXT或HTML格式，编码方式为GB2312   －－&gt;   　   <br />因为JSP要经过两次编码, 第一阶段会用到pageEncoding, 第二阶段会用 utf-8 至utf-8, 第三阶段就是由web容器出來的网页, 用的是contentType.<br /><br />阶段一是 JSPC的 JSP至JAVA(.java)原码的"翻译", 它会根据pageEncoding 的设定读取JSP. 结果是 由指定的 pageEncoding(utf-8,Big5,gb2312)的JSP 翻译成统一的utf-8 JAVA原码(.java). 如果pageEncoding设定错了, 或沒设定(预设ISO8859-1), 出来的 在这个阶段就已是中文乱码. <br />阶段二是由 JAVAC的JAVA原码至JAVA BYTECODE的编译. 不论JSP的编写时是用(utf-8,Big5,gb2312),经过阶段一的结果全都是utf-8的ENCODING的JAVA原码. <br />JAVAC用 utf-8的ENCODING读取AVA原码, 编译成字串是 utf-8 ENCODING的二进制码(.class). 這这是 JAVA VIRTUAL MACNHINE 对常数字串在 二进制码(JAVA BYTECODE)內表单的规范. <br />阶段三是TOMCAT(或其的application container)载入和执行 階段二得来的JAVA二进制码, 输出的结果( 也就是BROWSER(客戶端)) 見到的. 这时一早隐藏在階段一和二的参数contentType, 就发挥了功效.<br />Portal WEB剪切出现乱码是因为原始剪切源的原因而引起的需要注意在页面里面把编码方式写全、写对基本就没有问题了，还有注意如果出现？说明是在字符集中找不到这个字符就是浏览器解析不了，比如&amp;nbsp；解决的办法把他替换为全角的空格；<br /><br /><br /><br /></p>
<img src ="http://www.blogjava.net/badboyryan/aggbug/91997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-01-05 15:00 <a href="http://www.blogjava.net/badboyryan/archive/2007/01/05/91997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态类型判定，运行时多态问题</title><link>http://www.blogjava.net/badboyryan/archive/2007/01/05/91899.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Fri, 05 Jan 2007 01:53:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/01/05/91899.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/91899.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/01/05/91899.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/91899.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/91899.html</trackback:ping><description><![CDATA[class A<br />{<br />   public void func1()<br />   {<br />      System.out.println("A func1 is calling");<br />   }<br />   public void func2()<br />   {<br />      func1();<br />   }<br />}<br />class B extends A<br />{<br />   public void func1()<br />   {<br />      System.out.println("B fun1 is calling");<br />   }<br />}<br />class C<br />{<br />   public static void main(String [] args)<br />   {<br />      B b=new B();<br />      A a=b;<br />      callA(a);<br />      callA(new B());<br />   }<br />   public static void callA(A a)<br />   {<br />      a.func1();<br />      a.func2();<br />   }<br />}<br /><br /><br /><span id="post2" style="FONT-SIZE: 12px; COLOR: #000000">运行结果：<br /><br />D:\&gt;javac C.java<br /><br />D:\&gt;java C<br />B fun1 is calling<br />B fun1 is calling<br />B fun1 is calling<br />B fun1 is calling<br /><br />简单来说，就是RTTI，动态类型判定，也就是<br /><br />B b=<b>new B();</b><br />A a=<b>new B();</b><br /><br />只要等号右边类型是什么类型，而且已经覆盖父类的方法，那么调用该方法时，会自动知道相应的B中的覆盖方法。这是一定的，运行时多态。<br /><br />==================================================<br /><br />只对方法进行动态判定，属性的取值看，等号左边，也就是编译时类型。<br /><br />将A和B添加一个属性，在索取值，看结果：<br /><br />class A<br />{<br />   <b>public String name = "A CLASS";</b><br />   public void func1()<br />   {<br />      System.out.println("A func1 is calling");<br />   }<br />   public void func2()<br />   {<br />      func1();<br />   }<br />}<br />class B extends A<br />{<br />   <b>public String name = "B CLASS";</b><br />   public void func1()<br />   {<br />      System.out.println("B fun1 is calling");<br />   }<br />}<br />public class C<br />{<br />   public static void main(String [] args)<br />   {<br />      B b=new B();<br />      A a=b;<br />      callA(a);<br />      callA(new B());<br />      <br />      <b><br />      System.out.println(a.name);<br />      System.out.println(b.name);<br />      System.out.println(new B().name);<br />      </b><br />   }<br />   public static void callA(A a)<br />   {<br />      a.func1();<br />      a.func2();<br />   }<br />}<br /><br />运行结果：<br /><br />D:\&gt;javac C.java<br /><br />D:\&gt;java C<br />B fun1 is calling<br />B fun1 is calling<br />B fun1 is calling<br />B fun1 is calling<br />A CLASS<br />B CLASS<br />B CLASS<br /></span><img src ="http://www.blogjava.net/badboyryan/aggbug/91899.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-01-05 09:53 <a href="http://www.blogjava.net/badboyryan/archive/2007/01/05/91899.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转帖]多线程设计要点</title><link>http://www.blogjava.net/badboyryan/archive/2007/01/05/91890.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Fri, 05 Jan 2007 01:28:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/01/05/91890.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/91890.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/01/05/91890.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/91890.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/91890.html</trackback:ping><description><![CDATA[
		<span id="post1" style="FONT-SIZE: 12px; COLOR: #000000">1.多线程中有主内存和工作内存之分， 在JVM中，有一个主内存，专门负责所有线程共享数据；而每个线程都有他自己私有的工作内存， 主内存和工作内存分贝在JVM的stack区和heap区。<br /><br />2.线程的状态有'Ready', 'Running', 'Sleeping', 'Blocked', 和 'Waiting'几个状态，<br />'Ready' 表示线程正在等待CPU分配允许运行的时间。<br /><br /><br />3.线程运行次序并不是按照我们创建他们时的顺序来运行的，CPU处理线程的顺序是不确定的，如果需要确定，那么必须手工介入，使用setPriority()方法设置优先级。<br /><br />4.我们无从知道一个线程什么时候运行，两个或多个线程在访问同一个资源时，需要synchronized<br /><br />5. 每个线程会注册自己，实际某处存在着对它的引用，因此，垃圾回收机制对它就“束手无策”了。<br /><br />6. Daemon线程区别一般线程之处是：主程序一旦结束，Daemon线程就会结束。<br /><br />7. 一个对象中的所有synchronized方法都共享一把锁，这把锁能够防止多个方法对通用内存同时进行的写操作。synchronized static方法可在一个类范围内被相互间锁定起来。<br /><br />8. 对于访问某个关键共享资源的所有方法，都必须把它们设为synchronized，否则就不能正常工作。<br /><br />9. 假设已知一个方法不会造成冲突，最明智的方法是不要使用synchronized，能提高些性能。<br /><br />10. 如果一个"同步"方法修改了一个变量，而我们的方法要用到这个变量(可能是只读),最好将自己的这个方法也设为 synchronized。<br /><br />11. synchronized不能继承，　父类的方法是synchronized，那么其子类重载方法中就不会继承“同步”。<br /><br />12. 线程堵塞Blocked有几个原因造成：<br /><br />(1)线程在等候一些IO操作 <br />(2)线程试图调用另外一个对象的“同步”方法，但那个对象处于锁定状态，暂时无法使用。<br /><br />13.原子型操作(atomic), 对原始型变量(primitive)的操作是原子型的atomic. 意味着这些操作是线程安全的， 但是大部分情况下，我们并不能正确使用，来看看 i = i + 1 , i是int型，属于原始型变量：<br /><br />(1)从主内存中读取i值到本地内存. <br />(2)将值从本地内存装载到线程工作拷贝中. <br />(3)装载变量1. <br />(4)将i 加 1. <br />(5)将结果给变量i. <br />(6)将i保存到线程本地工作拷贝中. <br />(7)写回主内存. <br /><br />注意原子型操作只限于第1步到第2步的读取以及第6到第7步的写, i的值还是可能被同时执行i=i+1的多线程中断打扰(在第4步)。<br /><br />double 和long 变量是非原子型的(non-atomic)。数组是object 非原子型。<br /><br /><br /><br />14. 由于13条的原因，我们解决办法是：<br /><br />class xxx extends Thread{<br /><br />//i会被经常修改<br />private int i;<br /><br />public synchronized int read(){ return i;}<br /><br />public synchronized void update(){ i = i + 1;}<br /><br />..........<br /><br />}<br /><br />15. Volatile变量， volatile变量表示保证它必须是与主内存保持一致，它实际是"变量的同步", 也就是说对于volatile变量的操作是原子型的，如用在long 或 double变量前。<br /><br /><br />16. 使用yield()会自动放弃CPU，有时比sleep更能提升性能。<br /><br />17. sleep()和wait()的区别是：wait()方法被调用时会解除锁定，但是我们能使用它的地方只是在一个同步的方法或代码块内。<br /><br />18. 通过制造缩小同步范围，尽可能的实现代码块同步，wait(毫秒数)可在指定的毫秒数可退出wait；对于wait()需要被notisfy()或notifyAll()踢醒。<br /><br />19. 构造两个线程之间实时通信的方法分几步：<br />(1). 创建一个PipedWriter和一个PipedReader和它们之间的管道;<br />PipedReader in = new PipedReader(new PipedWriter())<br />(2). 在需要发送信息的线程开始之前，将外部的PipedWriter导向给其内部的Writer实例out<br />(3). 在需要接受信息的线程开始之前，将外部的PipedReader导向给其内部的Reader实例in<br />(4). 这样放入out的所有东西度可从in中提取出来。<br /><br />20. synchronized带来的问题除性能有所下降外，最大的缺点是会带来死锁DeadLock，只有通过谨慎设计来防止死锁，其他毫无办法，这也是线程难以驯服的一个原因。不要再使用stop() suspend() resume()和destory()方法<br /><br />21. 在大量线程被堵塞时，最高优先级的线程先运行。但是不表示低级别线程不会运行，运行概率小而已。<br /><br />22. 线程组的主要优点是：使用单个命令可完成对整个线程组的操作。很少需要用到线程组。<br /><br />23. 从以下几个方面提升多线程的性能：<br /><br />检查所有可能Block的地方，尽可能的多的使用sleep或yield()以及wait();<br /><br />尽可能延长sleep(毫秒数)的时间;<br /><br />运行的线程不用超过100个，不能太多；<br /><br />不同平台linux或windows以及不同JVM运行性能差别很大。<br /><br />24. 推荐几篇相关英文文章:<br /><br /><a href="http://www.fawcette.com/javapro/2003_03/magazine/features/odoerderlein/default_pf.asp" target="_blank">Use Threading Tricks to Improve Programs</a><br /></span>
<img src ="http://www.blogjava.net/badboyryan/aggbug/91890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-01-05 09:28 <a href="http://www.blogjava.net/badboyryan/archive/2007/01/05/91890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>准确的掌握 String 类</title><link>http://www.blogjava.net/badboyryan/archive/2007/01/05/91886.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Fri, 05 Jan 2007 01:19:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/01/05/91886.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/91886.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/01/05/91886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/91886.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/91886.html</trackback:ping><description><![CDATA[
		<span id="post1" style="FONT-SIZE: 12px; COLOR: #000000">public class J0 {<br />public static void main(String[] args) {<br />String str1 = new String("strOne");<br />String str2 = new String("strOne");<br />String str3 = "strTwo";<br />String str4 = "strTwo";<br /><br />System.out.println(str1 == str2);<br />System.out.println(str3 == str4);<br /><br />}<br />}<br />估计答案是什么？<br />是不是false,false ？<br />因为 String 类不能直接 "==" 号比较！new 出来的两个String对象不在同一内存。<br />应该用 "equals()"。<br />------------------------------------<br />可是答案是：false,true;<br />------------------------------------<br />怎么理解呢？<br /><br /><span id="post3" style="FONT-SIZE: 12px; COLOR: #000000">String str = new String("string");<br /> 与 String str = "string";<br /><br />声明:以下解释是保证正确的，我会从内存空间上来解释，比较清楚。<br /><br />区别是，new String是在堆空间上分配一个空间，将指针指向这个空间，每一个new都是新的空间，==判断当然是不等。<br /><br />而String str = "ssss"，说一下，在每种语言中对于字符串都有特殊的处理。<br />Java有一个专门的字符串池来保存可以重用的字符串。对于相同的字面值（也就是"双引号里面你看到东西"）相同，多少个变量他们都指向相同的空间，==判断当然相等。<br /><br />所以最正确的判断字符串内容相等的方法，就是用equals方法。String类这个immuable的类已经覆盖了这个从Object类继承的eqauls方法，达到了对于内容相等的判断。<br /></span><br /></span>
<img src ="http://www.blogjava.net/badboyryan/aggbug/91886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-01-05 09:19 <a href="http://www.blogjava.net/badboyryan/archive/2007/01/05/91886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPringInAction配书源代码下载</title><link>http://www.blogjava.net/badboyryan/archive/2007/01/04/91672.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Thu, 04 Jan 2007 00:35:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2007/01/04/91672.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/91672.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2007/01/04/91672.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/91672.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/91672.html</trackback:ping><description><![CDATA[真的难找啊，书上说的那个网站把中国的IP给封了；；<br />因为文件比较大，所以放到我的ftp空间了。<br />侠客岛的朋友可以去我们的ftp下载啊！<br />放到侠客岛目录里面了<br />文件名称：spring_in_action_source.rar<br />侠客岛群号：<font color="#0000ff">26858781<br /></font><br />推荐一个网址：<br /><br />http://secure.manning.com/books/walls2/source<br /><br /><br /><img src ="http://www.blogjava.net/badboyryan/aggbug/91672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2007-01-04 08:35 <a href="http://www.blogjava.net/badboyryan/archive/2007/01/04/91672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA 正则表达式4种常用的功能</title><link>http://www.blogjava.net/badboyryan/archive/2006/12/31/91163.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Sun, 31 Dec 2006 06:54:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2006/12/31/91163.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/91163.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2006/12/31/91163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/91163.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/91163.html</trackback:ping><description><![CDATA[正则表达式在字符串处理上有着强大的功能，sun在jdk1.4加入了对它的支持 <br /><br />　　下面简单的说下它的4种常用功能：<br />　　<br />　　<strong>查询：</strong><br />　　<br />以下是代码片段：<br />String str="abc efg ABC"; <br /><br />String regEx="a|f"; //表示a或f <br /><br />Pattern p=Pattern.compile(regEx); <br /><br />Matcher m=p.matcher(str); <br /><br />boolean rs=m.find(); <br /><br />　　<br />　　如果str中有regEx，那么rs为true，否则为flase。如果想在查找时忽略大小写，则可以写成Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);<br />　　<br />　　<strong>提取：</strong><br /><br />以下是代码片段：<br />String regEx=".+\(.+)$"; <br /><br />String str="c:\dir1\dir2\name.txt"; <br /><br />Pattern p=Pattern.compile(regEx); <br /><br />Matcher m=p.matcher(str); <br /><br />boolean rs=m.find(); <br /><br />for(int i=1;i&lt;=m.groupCount();i++){ <br /><br />System.out.println(m.group(i)); <br /><br />} <br /><br />　　<br />　　以上的执行结果为name.txt，提取的字符串储存在m.group(i)中，其中i最大值为m.groupCount();<br />　　<br />　　<strong>分割：<br /></strong>　　<br />以下是代码片段：<br />String regEx="::"; <br /><br />Pattern p=Pattern.compile(regEx); <br /><br />String[] r=p.split("xd::abc::cde"); <br /><br />执行后，r就是{"xd","abc","cde"}，其实分割时还有跟简单的方法： <br /><br />String str="xd::abc::cde"; <br /><br />String[] r=str.split("::"); <br /><br />　　<br />　　<strong>替换（删除）：</strong><br />　　<br />以下是代码片段：<br />String regEx="a+"; //表示一个或多个a <br /><br />Pattern p=Pattern.compile(regEx); <br /><br />Matcher m=p.matcher("aaabbced a ccdeaa"); <br /><br />String s=m.replaceAll("A"); <br />　　<br />　　结果为"Abbced A ccdeA"<br />　　<br />　　如果写成空串，既可达到删除的功能，比如：<br />　　<br />String s=m.replaceAll("");<br />　　<br />　　结果为"bbced ccde"<br />　　<br />　　<strong>附：</strong><br />　　<br />　\D 等於 [^0-9] 非数字 <br />　\s 等於 [ \t\n\x0B\f ] 空白字元 <br />　\S 等於 [^ \t\n\x0B\f ] 非空白字元 <br />　\w 等於 [a-zA-Z_0-9] 数字或是英文字 <br />　　\W 等於 [^a-zA-Z_0-9] 非数字与英文字 <br />　　<br />　　^ 表示每行的开头<br />　　$ 表示每行的结尾<br /><img src ="http://www.blogjava.net/badboyryan/aggbug/91163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2006-12-31 14:54 <a href="http://www.blogjava.net/badboyryan/archive/2006/12/31/91163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于RMI的分布式银行自助终端监控系统的研究及实现</title><link>http://www.blogjava.net/badboyryan/archive/2006/12/31/91159.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Sun, 31 Dec 2006 06:49:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2006/12/31/91159.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/91159.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2006/12/31/91159.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/91159.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/91159.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="550" border="0">
				<tbody>
						<tr>
								<td class="l16" height="40">
										<div align="center">基于RMI的分布式银行自助终端监控系统的研究及实现</div>
								</td>
						</tr>
						<tr class="l12">
								<td height="30">
										<div align="center">张永福<sup>1</sup>，张娟<sup>2</sup></div>
								</td>
						</tr>
						<tr class="l12">
								<td height="25">
										<div align="center">(1．陕西师范大学计算机科学学院 陕西 西安 710062；2．西安财经学院 陕西 西安 710061)</div>
								</td>
						</tr>
						<tr class="l12">
								<td>
										<p>
												<br />近年来随着我国金融体制改革的不断深人，银行企业不断利用信息技术拓宽业务，其中对于自助银行，使其得到了飞速发展，因此，依托现在计算机技术、网络通信技术、数据安全技术开发出能对各种自助终端进行监控，网络拓展性良好，使用灵活方便，安全的银行自助终端监控系统成为当务之急。利用J2EE系统平台<sup>[1]</sup>，能有效地实现分布式多层体系结构的应用程序开发。</p>
										<p>
												<strong>1 RMI<sup>[2]</sup></strong>
										</p>
										<p>RMI(Remote Method Invocation，远程方法调用)是J2EE技术中的一项，是Java语言实现有力网络功能的固有机制，RMI允许Java编写分布式对象，并允许对象在内存中通信，可跨越Java虚拟机通信<sup>[3-4]</sup>，也可跨越物理设备。<br /><br />RMI实现实际上由3个抽象层建立：</p>
										<p>Stubs／Skeletons Layer(存根/主架层)；Remote Reference Layer(远程引用层)；Transport Layer(传输层)。</p>
										<p>
												<strong>2 监控系统的设计与实现</strong>
										</p>
										<p>
												<strong>2．1 系统网络结构</strong>
												<br />
												<br />本系统以中国银行内部Intranet网络为依托，采用集中式网络结构构建而成。如图1所示。</p>
										<table cellspacing="0" cellpadding="0" width="550" border="0">
												<tbody>
														<tr>
																<th scope="row">
																		<img height="279" src="http://www.chinaecnet.com/xsj06/image/xsj063941w-1.jpg" width="350" />
																</th>
														</tr>
												</tbody>
										</table>
										<p>系统采用一台监控服务器，连在中国银行Intranet主干网上，和提供数据源的前置机放入同一网段。服务器主机上运行Web服务器、应用服务器和数据库服务器，为用户提供Web方式访问。监控客户端以浏览器的形式在工作站上通过网络直接访问web服务器，进行信息查询、监控管理、报表打印、系统维护等。Intranet环境内其他用户可通过路由器、DDN专线从相应工作站以web形式访问Web服务器。</p>
										<p>
												<strong>2．2 系统逻辑层次结构图</strong>
										</p>
										<p>监控系统由数据库服务器、应用服务器、web服务器和浏览器组成，通过Intranet／Internet与综合前置系统连接。<br /><br />本文将3层结构模式应用于银行自助终端监控系统，这3层分别是：客户层；Web层(应用逻辑层)；数据存储层(见图2)。</p>
										<table cellspacing="0" cellpadding="0" width="550" border="0">
												<tbody>
														<tr>
																<th scope="row">
																		<img height="142" src="http://www.chinaecnet.com/xsj06/image/xsj063941w-2.jpg" width="320" />
																</th>
														</tr>
												</tbody>
										</table>
										<p>这种结构无疑是富有生命力的，监控台使用浏览器直接与银行Intranet连接，监控服务器(监控服务器由Application Server和DB Servet两台服务器组成)在接入Intranet之前与一个Web Server连接，再通过Web Server接入Internet。通过Internet在监控服务器与监控台之间建立物理连接。</p>
										<p>
												<strong>2.3 应用系统结构</strong>
												<br />
												<br />自助设备监控系统是监控前端自助设备运行状态，交易情况的网上应用系统，他的数据来自于数据采集模块。前端自助设备运行时发送状态交易数据到前置机、主机系统，由前置机、主机系统进行处理，并将状态数据、交易情况记入数据库或LOG文件中。如图3所示，由监控系统数据采集模块定时采集数据库或LOG文件中的数据到监控数据库中，监控应用系统负责对监控数据统一处理，并通过监控客户端实时请求发送到监控客户端进行显示及其他处理。</p>
										<table cellspacing="0" cellpadding="0" width="550" border="0">
												<tbody>
														<tr>
																<th scope="row">
																		<img height="234" src="http://www.chinaecnet.com/xsj06/image/xsj063941w-3.jpg" width="350" />
																</th>
														</tr>
												</tbody>
										</table>
										<p>
												<strong>3 RMI技术在监控系统中的应用</strong>
												<br />
												<br />中国银行天津分行在每个地区都下设支行，每个支行负责管理本地区的ATM网点，因此各个支行之间网点ATM自助设备的状态、交易信息不能共享．那么各个地区的监控客户端就只能通过本地区支行的监控服务器实时监控本地区的ATM网点的自助终端设备，为了使身处各个地区的监控客户端都能够监控各个支行所辖的ATM网点自助终端设备，就必须采用分布式的监控系统。每个支行都设置一台监控服务器，与各自所在支行的前置系统相连接，利用RMI技术将实时监控、远程控制、查询统计组件注册为远程对象，监控客户机在任何支行的监控服务器上的注册服务表用远程对象的名字查找相应远程对象，然后调用他的方法，就可以像监控本地区的ATM自助终端设备那样监控其他地区的ATM自助终端设备。 <br /><br />下面本文将以对ATM状态的实时监控如何借助RMI技术实现做以讨论<sup>[5]</sup>。</p>
										<p>
												<strong>3．1 定义远程接口</strong>
												<br />
												<br />在Java中，远程对象是实现远程接口的类的实例，远程接口声明每个要远程调用的方法。在需要创建一个远程对象的时候，通过传递一个接口来隐藏基层的实施细节，客户通过接口句柄发送消息即可。远程接口具有如下特点：<br /><br />(1)远程接口必须为public属性。<br /><br />(2)远程接口必须扩展接口java．rmi．Remote。<br /><br />(3)除与应用程序本身特定的例外之外，远程接口中的每个方法都必须在自己的throws从句中声明java．rmi．RemoteException。<br /><br />(4)作为参数或返回值传递的一个远程对象(不管是直接，还是本地对象中嵌入)必须声明为远程接口，而不应声明为实施类。<br /><br />下面是对ATM状态实时监控的远程接口ATM_StatusShow_Interface的定义。</p>
										<p>
												<strong>3．2 实现远程接口<sup>[6]</sup></strong>
												<br />
												<br />远程对象实现类必须扩展远程对象java．rmi．UnicastRemoteObject类，并实现所定义的远程接口。远程对象的实现类中包含实现每个远程接口所指定的远程方法的代码。这个类也可以含有附加的方法，但客户只能使用远程接口中的方法。因为客户是指向接口的一个句柄，而不是他的哪个类。必须为远程对象定义构造函数，即使只准备定义一个默认构造函数，用他调用基础类构造函数。</p>
										<p>
												<strong>3．3 编写服务器类<br /></strong>
												<br />通过ATM_StatusShow_Server创建一个远程对象的实例，并通过java．rmi．registry．LocateRegistry类的createRegistry方法从指定端口号启动注册服务程序，注册服务程序的缺省运行端口为1099。必须将远程对象名字绑定到对远程对象的引用上。</p>
										<p>
												<strong>3．4 编写使用远程服务的客户机类。</strong>
												<br />
												<br />客户机类的主要功能有2个：一是通过Naming．lookup方法来构造注册服务程序stub程序实例；二是调用服务器远程对象上的远程方法。</p>
										<p>
												<strong>3．5 为远程对象实现创建根和干</strong>
												<br />
												<br />要创建存根程序和主架文件，应以包含远程对象实现的已编译类包全名运行rmic编译器。存根(Stub)是远程对象在客户端的代理，他将RMI调用传递给服务器端的主架(Skeleton)，后者负责将该调用传递给实际的远程方法：</p>
										<p>运行rmic，RMI目录下就会多出2个新类：</p>
										<p>ATM_StatusShow_Impl_Stub．class</p>
										<p>ATM_StatusShow_Impl_Skel．class</p>
										<p>他们分别对应的是存根(stub)和主架(skeleton)。</p>
										<p>
												<strong>4 结 论</strong>
										</p>
										<p>本系统在中国银行天津分行的支持下已投入使用，经过多次测试和实际运行，用户对于本系统的评价比较满意。在运行速度和运行稳定性上都能达到要求。对于用户的日常工作负担起到了较大减轻的作用，提高了工作效率，简化了沟通手续，丰富了查询能力，使统计结果更加实时、灵活和准确。从技术角度上看，本系统采用RMI技术非常好地解决了分布式应用的问题。<br /></p>
								</td>
						</tr>
						<tr>
								<td> </td>
						</tr>
						<tr>
								<td>
										<div align="center">本文摘自《现代电子技术》</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/badboyryan/aggbug/91159.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2006-12-31 14:49 <a href="http://www.blogjava.net/badboyryan/archive/2006/12/31/91159.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>中间件编程之RMI在Java中的应用 </title><link>http://www.blogjava.net/badboyryan/archive/2006/12/31/91151.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Sun, 31 Dec 2006 06:18:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2006/12/31/91151.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/91151.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2006/12/31/91151.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/91151.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/91151.html</trackback:ping><description><![CDATA[本篇用实例来说明采用Java进行RMI远程方法调用的实现方法，从而为分布应用软件的开发者提供参考和帮助。 <br />　　Internet/Intranet的飞速发展使得Web应用日益广泛而复杂，Web早已不仅仅是超媒体信息的浏览工具，它正逐步发展成为分布异构环境中企业应用的通用前端和事务处理的展现窗口。在分布式环境异构中，各种机器所采用的操作系统、网络通信协议和应用软件千差万别，要实现信息共享和软件资源的整合十分困难，然而一个健壮的分布式计算框架能为可移植的分布式应用软件开发带来巨大的便利和好处。 <br />　　分布式对象技术主要是在分布式异构环境下建立应用系统框架和对象构件。在应用系统框架的支撑下，开发者可以将软件功能封装为更易管理和使用的对象，这些对象可以跨越不同的软、硬件平台进行互操作。目前，分布式互操作标准主要有Microsoft的COM/DCOM标准、Sun公司的Java RMI标准和OMG组织的CORBA标准。 <br />　　Java RMI调用实例<br />　　Java RMI简介 <br />　　远程方法调用（RMI，Remote Method Invocation）是jdk1.1中引入的分布式对象软件包，它的出现大大简化了分布异构环境中Java应用之间的通信。 <br />　　<br />　　要使用RMI，必须构建四个主要的类：远程对象的本地接口、远程对象实现、RMI客户机和RMI服务器。RMI服务器生成远程对象实现的一个实例，并用一个专有的URL注册。RMI客户机在远程RMI服务器上查找服务对象，并将它转换成本地接口类型，然后像对待一个本地对象一样使用它。 <br />　　<br />　　下面是一个简单的RMI实例，RMI客户机通过RMI服务器提供的方法实现对两个双精度浮点数的加减运算。例子虽然很简单，但掌握了Java RMI调用的基本原理和方法，在实现复杂应用时，我们需要做的也只是完善远程对象的实现类而已。 <br />　　<br />　　RMI实例分析 <br />　　<br />　　1.远程对象的本地接口声明（RMIOperate.java） <br />　　<br />　　该类仅仅是一个接口声明，RMI客户机可以直接使用它，RMI服务器必须通过一个远程对象来实现它，并用某个专有的URL注册它的一个实例。 <br />　　<br />　　具体代码如下： <br />　　<br />　　package wf.rmi;　//包名<br />　　import java.rmi.*; //导入类包<br />　　/*RMI本地接口必须从Remote接口派生*/<br />　　 public interface RMIOperate extends Remote<br />　　{<br />　　 /*接口中的具体方法声明，注意必须声明抛出RemoteException*/<br />　　　public double add(double x, double y) throws RemoteException; <br />　　//输入两个浮点数，返回其和<br />　　　public double minus(double x, double y) throws RemoteException; <br />　　//输入两个浮点数，返回其差<br />　　}<br />　　2.远程对象实现类（OperateImpl.java） <br />　　这个类应实现RMI客户机调用的远程服务对象的本地接口，它必须从UnicastRemoteObject继承，构造函数应抛出RemoteException异常。 <br />　　具体代码如下： <br />　　<br />　　package wf.rmi; //包名<br />　　//导入需要的类包<br />　　import java.rmi.*;<br />　　import wf.rmi.RMIOperate;<br />　　import java.rmi.server.UnicastRemoteObject;<br />　　public class OperateImpl extends UnicastRemoteObject implements RMIOperate<br />　　{<br />　　 /*构造函数*/<br />　　 public OperateImpl() throws RemoteException<br />　　 {<br />　　 }<br />　　 /*实现本地接口中声明的add方法*/<br />　　 public double add(double x, double y) throws RemoteException<br />　　 {<br />　　　double z = x + y;<br />　　　return z;<br />　　 }<br />　　　/*实现本地接口中声明的minus方法*/<br />　　 public double minus(double x, double y) throws RemoteException<br />　　 {<br />　　　double z = x - y;<br />　　　return z;<br />　　 }<br />　　}<br />　　3.RMI服务器类（RMIServer.java） <br />　　该类创建远程对象实现类OperateImpl的一个实例，然后通过一个专有的URL来注册它。所谓注册就是通过Java.rmi.Naming.bind()方法或Java.rmi.Naming.rebind()方法，将OperateImpl实例绑定到指定的URL上。 <br />　　<br />　　具体实现代码如下： <br />　　<br />　　package wf.rmi; //包名<br />　　//导入需要的类包<br />　　import java.rmi.Naming;<br />　　import wf.rmi.OperateImpl;<br />　　public class RMIServer<br />　　{<br />　　 public static void main(String[] args)<br />　　 {<br />　　　try<br />　　　{<br />　　　 //创建远程对象的实现实例<br />　　　 OperateImpl operObj = new OperateImpl();<br />　　　 //提示信息 <br />　　　 System.out.println("RMI Server Starting...");<br />　　　 //将实例注册到专有的URL <br />　　　 Naming.rebind("rmi:///RMIOperate", operObj);<br />　　　 //等待RMI客户机调用的提示信息 <br />　　　 System.out.println("Waiting RMI Client Invoke..."); <br />　　　}<br />　　　catch(Exception e)<br />　　　{<br />　　　 e.printStackTrace();<br />　　　}<br />　　 }<br />　　}<br />　　4.RMI客户机类（RMIClient.java） <br />　　<br />　　RMI客户使用java.rmi.Naming.lookup()方法，在指定的远程主机上查找RMI服务对象，若找到就把它转换成本地接口RMIOperate类型。它与CORBA不同之处在于RMI客户机必须知道提供RMI服务主机的URL，这个URL可以通过rmi://host/path或rmi://host:port/path来指定，如果省略端口号，就默认使用1099。Java.rmi.Naming.lookup()方法可能产生三个异常：Java.rmi.RemoteException、Java.rmi.NotBoundException、java.net. MalformedURLException，三个异常都需要捕获。 <br />　　<br />　　下面是详细代码： <br />　　<br />　　package wf.rmi; //包名<br />　　//导入需要的类包<br />　　import java.rmi.*;<br />　　import java.net.*;<br />　　import java.io.*;<br />　　public class RMIClient<br />　　{<br />　　　　public static void main(String[] args)<br />　　　　{<br />　　　　　　try<br />　　　　　　{<br />　　　　　　　　BufferedReader readIn = new BufferedReader(new <br />　　InputStreamReader(System.in));<br />　　　　　　　　String host = "localhost"; //默认为本地主机<br />　　 //带输入参数时，将host设置为指定主机<br />　　　　　　　　if (args.length &gt; 0) <br />　　　　　　　　　　host = args[0];<br />　　　　　　　 //根据指定的URL定位远程实现对象<br />　　RMIOperate rmiObj = (RMIOperate)Naming.lookup("rmi://" + host + <br />　　"/RMIOperate");　　　　　　//提示输入运算参数1<br />　　System.out.println("Please Input Data1: ");<br />　　　　　　　　String str1 = readIn.readLine(); //读取输入参数1<br />　　　　　　　　double x = 0;<br />　　　　　　　　try<br />　　　　　　　　{<br />　　　　 x = Double.parseDouble(str1); //分析输入参数1，转换为double类型<br />　　　　　　　　}<br />　　　　　　　catch(NumberFormatException nfe)<br />　　　　　　　　{<br />　　　　　　　　　　x = 0; //如果转换异常，则重置x为0<br />　　　　　　　　}<br />　　 //提示输入运算参数2<br />　　　　　　　　System.out.println("Please Input Data2: ");<br />　　　　　　　　String str2 = readIn.readLine();//读取输入参数2<br />　　　　　　　　double y = 0;<br />　　　　　　　　try<br />　　　　　　　　{<br />　　　　　　　　　　y = Double.parseDouble(str2); //分析输入参数2，转换为double类型<br />　　　　　　　　}<br />　　　　　　　　catch(NumberFormatException nfe)<br />　　　　　　　　{<br />　　　　　　　　　　y = 0; //如果转换异常，则重置y为0<br />　　　　　　　　}<br />　　 //调用远程对象的本地接口方法，实现输入参数的加、减运算，并输出结果<br />　　　　　　　System.out.println("Data1 Add Data2 Result is: " + rmiObj.add(x, y));<br />　　　　　　　System.out.println("Data1 minus Data2 Result is: " + <br />　　 　rmiObj.minus(x, y));<br />　　　　　　}<br />　　　　　　catch(Exception e)<br />　　　　　　{<br />　　　　　　　　e.printStackTrace();<br />　　　　　　}<br />　　　　}<br />　　}<br />　　RMI Server/Client的编译与运行 <br />　　<br />　　(1).编译所有的源代码(如图1) <br />　　　<img src="http://www.chinaitlab.com/www/imgfiles/2002.10.2.11.31.59.1.gif" /><br />　　图1<br />　　(2).生成客户端存根和服务器框架(如图2) <br />　　　<img src="http://www.chinaitlab.com/www/imgfiles/2002.10.2.11.39.39.2.gif" /><br />　　图2<br />　　这将构造OperateImpl_Stub.class和OperateImpl_Skel.class。这时可将所有的Class文件打包成jar，并将其分别置于RMI客户机和RMI服务器的ClassPath中(如图3): <br />　　　<img src="http://www.chinaitlab.com/www/imgfiles/2002.10.2.11.40.9.3.gif" /><br />　　图3<br />　　当然，也可以只将RMIOperate.class、RMIClient.class和OperateImpl_Stub.class复制到RMI客户机，将RMIOperate.class、OperateImpl.class 、RMIServer.class和OperateImpl_Skel.class复制到RMI服务器。 <br />　　(3).启动RMI注册(如图4) <br />　　　<img src="http://www.chinaitlab.com/www/imgfiles/2002.10.2.11.40.25.4.gif" /><br />　　图4<br />　　(4).运行和调用 <br />　　● 在服务器上执行RMIServer(如图5) <br />　　　<img src="http://www.chinaitlab.com/www/imgfiles/2002.10.2.11.40.53.5.gif" /><br />　　图5<br />　　● 在本地客户机上运行RMIClient(如图6) <br />　　　<img src="http://www.chinaitlab.com/www/imgfiles/2002.10.2.11.41.18.6.gif" /><br />　　图6<br />　　● 在远程客户机上运行RMIClient（须指明RMI服务器主机名或IP地址，如图7） <br />　　　<img src="http://www.chinaitlab.com/www/imgfiles/2002.10.2.11.41.35.7.gif" /><br />　　图7<br />　　至此，RMI调用完成。<br /><br />        摘自：<a href="http://youngyj1982.bokee.com/">http://youngyj1982.bokee.com/</a><img src ="http://www.blogjava.net/badboyryan/aggbug/91151.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2006-12-31 14:18 <a href="http://www.blogjava.net/badboyryan/archive/2006/12/31/91151.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring交流学习群建立</title><link>http://www.blogjava.net/badboyryan/archive/2006/12/25/89821.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Mon, 25 Dec 2006 01:34:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2006/12/25/89821.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/89821.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2006/12/25/89821.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/89821.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/89821.html</trackback:ping><description><![CDATA[为了系统的学习SPRING的精华思想建立一个QQ群，<font color="#0000ff">qq群侠客岛:26858781<br /></font><br />欢迎spring的高手进入。<br /><br /><img src ="http://www.blogjava.net/badboyryan/aggbug/89821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2006-12-25 09:34 <a href="http://www.blogjava.net/badboyryan/archive/2006/12/25/89821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>展示JDBC存取ORACLE大型数据对象LOB几种情况的示范类</title><link>http://www.blogjava.net/badboyryan/archive/2006/12/20/88986.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Wed, 20 Dec 2006 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2006/12/20/88986.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/88986.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2006/12/20/88986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/88986.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/88986.html</trackback:ping><description><![CDATA[
		<div style="FONT-SIZE: 12px">import java.io.*; <br />import java.util.*; <br />import java.sql.*; <br />  <br />public class LobPros <br />{ <br />  <br />    /** <br />     * ORACLE驱动程序 <br />     */ <br />    private static final String DRIVER = "oracle.jdbc.driver.OracleDriver"; <br />  <br />    /** <br />     * ORACLE连接用URL <br />     */ <br />    private static final String URL = "jdbc:oracle:thin:@test2000:1521:orac"; <br />  <br />    /** <br />     * 用户名 <br />     */ <br />    private static final String USER = "user"; <br />  <br />    /** <br />     * 密码 <br />     */ <br />    private static final String PASSWORD = "pswd"; <br />  <br />    /** <br />     * 数据库连接 <br />     */ <br />    private static Connection conn = null; <br />  <br />    /** <br />     * SQL语句对象 <br />     */ <br />    private static Statement stmt = null; <br />  <br />    /** <br />     * @roseuid 3EDA089E02BC <br />     */ <br />    public LobPros() <br />    { <br />  <br />    } <br />  <br />    /** <br />     * 往数据库中插入一个新的CLOB对象 <br />     * <br />     * @param infile - 数据文件 <br />     * @throws java.lang.Exception <br />     * @roseuid 3EDA04A902BC <br />     */ <br />    public static void clobInsert(String infile) throws Exception <br />    { <br />        /* 设定不自动提交 */ <br />        boolean defaultCommit = conn.getAutoCommit(); <br />        conn.setAutoCommit(false); <br />  <br />        try { <br />            /* 插入一个空的CLOB对象 */ <br />            stmt.executeUpdate("INSERT INTO TEST_CLOB VALUES ('111', EMPTY_CLOB())"); <br />            /* 查询此CLOB对象并锁定 */ <br />            ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE"); <br />            while (rs.next()) { <br />                /* 取出此CLOB对象 */ <br />                oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL"); <br />                /* 向CLOB对象中写入数据 */ <br />                BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream()); <br />                BufferedReader in = new BufferedReader(new FileReader(infile)); <br />                int c; <br />                while ((c=in.read())!=-1) { <br />                    out.write(c); <br />                } <br />                in.close(); <br />                out.close(); <br />            } <br />            /* 正式提交 */ <br />            conn.commit(); <br />        } catch (Exception ex) { <br />            /* 出错回滚 */ <br />            conn.rollback(); <br />            throw ex; <br />        } <br />  <br />        /* 恢复原提交状态 */ <br />        conn.setAutoCommit(defaultCommit); <br />    } <br />  <br />    /** <br />     * 修改CLOB对象（是在原CLOB对象基础上进行覆盖式的修改） <br />     * <br />     * @param infile - 数据文件 <br />     * @throws java.lang.Exception <br />     * @roseuid 3EDA04B60367 <br />     */ <br />    public static void clobModify(String infile) throws Exception <br />    { <br />        /* 设定不自动提交 */ <br />        boolean defaultCommit = conn.getAutoCommit(); <br />        conn.setAutoCommit(false); <br />  <br />        try { <br />            /* 查询CLOB对象并锁定 */ <br />            ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE"); <br />            while (rs.next()) { <br />                /* 获取此CLOB对象 */ <br />                oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");   <br />                /* 进行覆盖式修改 */ <br />                BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream()); <br />                BufferedReader in = new BufferedReader(new FileReader(infile)); <br />                int c; <br />                while ((c=in.read())!=-1) { <br />                    out.write(c); <br />                } <br />                in.close(); <br />                out.close(); <br />            } <br />            /* 正式提交 */ <br />            conn.commit(); <br />        } catch (Exception ex) { <br />            /* 出错回滚 */ <br />            conn.rollback(); <br />            throw ex; <br />        } <br />  <br />        /* 恢复原提交状态 */ <br />        conn.setAutoCommit(defaultCommit); <br />    } <br />  <br />    /** <br />     * 替换CLOB对象（将原CLOB对象清除，换成一个全新的CLOB对象） <br />     * <br />     * @param infile - 数据文件 <br />     * @throws java.lang.Exception <br />     * @roseuid 3EDA04BF01E1 <br />     */ <br />    public static void clobReplace(String infile) throws Exception <br />    { <br />        /* 设定不自动提交 */ <br />        boolean defaultCommit = conn.getAutoCommit(); <br />        conn.setAutoCommit(false); <br />  <br />        try { <br />            /* 清空原CLOB对象 */ <br />            stmt.executeUpdate("UPDATE TEST_CLOB SET CLOBCOL=EMPTY_CLOB() WHERE ID='111'"); <br />            /* 查询CLOB对象并锁定 */ <br />            ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE"); <br />            while (rs.next()) { <br />                /* 获取此CLOB对象 */ <br />                oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL"); <br />                /* 更新数据 */ <br />                BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream()); <br />                BufferedReader in = new BufferedReader(new FileReader(infile)); <br />                int c; <br />                while ((c=in.read())!=-1) { <br />                    out.write(c); <br />                } <br />                in.close(); <br />                out.close(); <br />            } <br />            /* 正式提交 */ <br />            conn.commit(); <br />        } catch (Exception ex) { <br />            /* 出错回滚 */ <br />            conn.rollback(); <br />            throw ex; <br />        } <br />  <br />        /* 恢复原提交状态 */ <br />        conn.setAutoCommit(defaultCommit); <br />    } <br />  <br />    /** <br />     * CLOB对象读取 <br />     * <br />     * @param outfile - 输出文件名 <br />     * @throws java.lang.Exception <br />     * @roseuid 3EDA04D80116 <br />     */ <br />    public static void clobRead(String outfile) throws Exception <br />    { <br />        /* 设定不自动提交 */ <br />        boolean defaultCommit = conn.getAutoCommit(); <br />        conn.setAutoCommit(false); <br />  <br />        try { <br />            /* 查询CLOB对象 */ <br />            ResultSet rs = stmt.executeQuery("SELECT * FROM TEST_CLOB WHERE ID='111'"); <br />            while (rs.next()) { <br />                /* 获取CLOB对象 */ <br />                oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL"); <br />                /* 以字符形式输出 */ <br />                BufferedReader in = new BufferedReader(clob.getCharacterStream()); <br />                BufferedWriter out = new BufferedWriter(new FileWriter(outfile)); <br />                int c; <br />                while ((c=in.read())!=-1) { <br />                    out.write(c); <br />                } <br />                out.close(); <br />                in.close(); <br />            } <br />        } catch (Exception ex) { <br />            conn.rollback(); <br />            throw ex; <br />        } <br />  <br />        /* 恢复原提交状态 */ <br />        conn.setAutoCommit(defaultCommit); <br />    } <br />  <br />    /** <br />     * 向数据库中插入一个新的BLOB对象 <br />     * <br />     * @param infile - 数据文件 <br />     * @throws java.lang.Exception <br />     * @roseuid 3EDA04E300F6 <br />     */ <br />    public static void blobInsert(String infile) throws Exception <br />    { <br />        /* 设定不自动提交 */ <br />        boolean defaultCommit = conn.getAutoCommit(); <br />        conn.setAutoCommit(false); <br />  <br />        try { <br />            /* 插入一个空的BLOB对象 */ <br />            stmt.executeUpdate("INSERT INTO TEST_BLOB VALUES ('222', EMPTY_BLOB())"); <br />            /* 查询此BLOB对象并锁定 */ <br />            ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE"); <br />            while (rs.next()) { <br />                /* 取出此BLOB对象 */ <br />                oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL"); <br />                /* 向BLOB对象中写入数据 */ <br />                BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream()); <br />                BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile)); <br />                int c; <br />                while ((c=in.read())!=-1) { <br />                    out.write(c); <br />                } <br />                in.close(); <br />                out.close(); <br />            } <br />            /* 正式提交 */ <br />            conn.commit(); <br />        } catch (Exception ex) { <br />            /* 出错回滚 */ <br />            conn.rollback(); <br />            throw ex; <br />        } <br />  <br />        /* 恢复原提交状态 */ <br />        conn.setAutoCommit(defaultCommit); <br />    } <br />  <br />    /** <br />     * 修改BLOB对象（是在原BLOB对象基础上进行覆盖式的修改） <br />     * <br />     * @param infile - 数据文件 <br />     * @throws java.lang.Exception <br />     * @roseuid 3EDA04E90106 <br />     */ <br />    public static void blobModify(String infile) throws Exception <br />    { <br />        /* 设定不自动提交 */ <br />        boolean defaultCommit = conn.getAutoCommit(); <br />        conn.setAutoCommit(false); <br />  <br />        try { <br />            /* 查询BLOB对象并锁定 */ <br />            ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE"); <br />            while (rs.next()) { <br />                /* 取出此BLOB对象 */ <br />                oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL"); <br />                /* 向BLOB对象中写入数据 */ <br />                BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream()); <br />                BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile)); <br />                int c; <br />                while ((c=in.read())!=-1) { <br />                    out.write(c); <br />                } <br />                in.close(); <br />                out.close(); <br />            } <br />            /* 正式提交 */ <br />            conn.commit(); <br />        } catch (Exception ex) { <br />            /* 出错回滚 */ <br />            conn.rollback(); <br />            throw ex; <br />        } <br />  <br />        /* 恢复原提交状态 */ <br />        conn.setAutoCommit(defaultCommit); <br />    } <br />  <br />    /** <br />     * 替换BLOB对象（将原BLOB对象清除，换成一个全新的BLOB对象） <br />     * <br />     * @param infile - 数据文件 <br />     * @throws java.lang.Exception <br />     * @roseuid 3EDA0505000C <br />     */ <br />    public static void blobReplace(String infile) throws Exception <br />    { <br />        /* 设定不自动提交 */ <br />        boolean defaultCommit = conn.getAutoCommit(); <br />        conn.setAutoCommit(false); <br />  <br />        try { <br />            /* 清空原BLOB对象 */ <br />            stmt.executeUpdate("UPDATE TEST_BLOB SET BLOBCOL=EMPTY_BLOB() WHERE ID='222'"); <br />            /* 查询此BLOB对象并锁定 */ <br />            ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE"); <br />            while (rs.next()) { <br />                /* 取出此BLOB对象 */ <br />                oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL"); <br />                /* 向BLOB对象中写入数据 */ <br />                BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream()); <br />                BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile)); <br />                int c; <br />                while ((c=in.read())!=-1) { <br />                    out.write(c); <br />                } <br />                in.close(); <br />                out.close(); <br />            } <br />            /* 正式提交 */ <br />            conn.commit(); <br />        } catch (Exception ex) { <br />            /* 出错回滚 */ <br />            conn.rollback(); <br />            throw ex; <br />        } <br />  <br />        /* 恢复原提交状态 */ <br />        conn.setAutoCommit(defaultCommit); <br />    } <br />  <br />    /** <br />     * BLOB对象读取 <br />     * <br />     * @param outfile - 输出文件名 <br />     * @throws java.lang.Exception <br />     * @roseuid 3EDA050B003B <br />     */ <br />    public static void blobRead(String outfile) throws Exception <br />    { <br />        /* 设定不自动提交 */ <br />        boolean defaultCommit = conn.getAutoCommit(); <br />        conn.setAutoCommit(false); <br />  <br />        try { <br />            /* 查询BLOB对象 */ <br />            ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222'"); <br />            while (rs.next()) { <br />                /* 取出此BLOB对象 */ <br />                oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL"); <br />                /* 以二进制形式输出 */ <br />                BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outfile)); <br />                BufferedInputStream in = new BufferedInputStream(blob.getBinaryStream()); <br />                int c; <br />                while ((c=in.read())!=-1) { <br />                    out.write(c); <br />                } <br />                in.close(); <br />                out.close(); <br />            } <br />            /* 正式提交 */ <br />            conn.commit(); <br />        } catch (Exception ex) { <br />            /* 出错回滚 */ <br />            conn.rollback(); <br />            throw ex; <br />        } <br />  <br />        /* 恢复原提交状态 */ <br />        conn.setAutoCommit(defaultCommit); <br />    } <br />  <br />    /** <br />     * 建立测试用表格 <br />     * @throws Exception <br />     */ <br />    public static void createTables() throws Exception { <br />        try { <br />            stmt.executeUpdate("CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)"); <br />            stmt.executeUpdate("CREATE TABLE TEST_BLOB ( ID NUMBER(3), BLOBCOL BLOB)"); <br />        } catch (Exception ex) { <br />  <br />        } <br />    } <br />  <br />    /** <br />     * @param args - 命令行参数 <br />     * @throws java.lang.Exception <br />     * @roseuid 3EDA052002AC <br />     */ <br />    public static void main(String[] args) throws Exception <br />    { <br />        /* 装载驱动,建立数据库连接 */ <br />        Class.forName(DRIVER); <br />        conn = DriverManager.getConnection(URL,USER,PASSWORD); <br />        stmt = conn.createStatement(); <br />  <br />        /* 建立测试表格 */ <br />        createTables(); <br />  <br />        /* CLOB对象插入测试 */ <br />        clobInsert("c:/clobInsert.txt"); <br />        clobRead("c:/clobInsert.out"); <br />  <br />        /* CLOB对象修改测试 */ <br />        clobModify("c:/clobModify.txt"); <br />        clobRead("c:/clobModify.out"); <br />  <br />        /* CLOB对象替换测试 */ <br />        clobReplace("c:/clobReplace.txt"); <br />        clobRead("c:/clobReplace.out"); <br />  <br />        /* BLOB对象插入测试 */ <br />        blobInsert("c:/blobInsert.doc"); <br />        blobRead("c:/blobInsert.out"); <br />  <br />        /* BLOB对象修改测试 */ <br />        blobModify("c:/blobModify.doc"); <br />        blobRead("c:/blobModify.out"); <br />  <br />        /* BLOB对象替换测试 */ <br />        blobReplace("c:/blobReplace.doc"); <br />        blobRead("c:/bolbReplace.out"); <br />  <br />        /* 关闭资源退出 */ <br />        conn.close(); <br />        System.exit(0); <br />    } <br />}</div>
<img src ="http://www.blogjava.net/badboyryan/aggbug/88986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badboyryan/" target="_blank">坏男孩</a> 2006-12-20 10:34 <a href="http://www.blogjava.net/badboyryan/archive/2006/12/20/88986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript中文排序</title><link>http://www.blogjava.net/badboyryan/archive/2006/12/19/88790.html</link><dc:creator>坏男孩</dc:creator><author>坏男孩</author><pubDate>Tue, 19 Dec 2006 06:39:00 GMT</pubDate><guid>http://www.blogjava.net/badboyryan/archive/2006/12/19/88790.html</guid><wfw:comment>http://www.blogjava.net/badboyryan/comments/88790.html</wfw:comment><comments>http://www.blogjava.net/badboyryan/archive/2006/12/19/88790.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badboyryan/comments/commentRss/88790.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badboyryan/services/trackbacks/88790.html</trackback:ping><description><![CDATA[
		<table style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellspacing="0" cellpadding="0" width="96%" border="0">
				<tbody>
						<tr>
								<td bgcolor="#e8f0f1">javascript中文排序</td>
						</tr>
						<tr>
								<td>
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<div align="right">
																		</div>
																</td>
														</tr>
												</tbody>
										</table>
										<span class="oblog_text">  原文来自：<a class="ubblink" href="http://blog.iyi.cn/hily/archives/2005/10/javascriptsort.html" target="_blank" rel="external">风微柳细</a><br />原来的方法是用个大中文字数组，一个个比较，：（<br /><br /><blockquote><div>以下为引用内容: 
<hr class="hr1" />
更新[2005.10.06]：<br />JavaScript提供了一种更简便的方法用于比较两个字符串——localeCompare()，localeCompare()使用本地特定的顺序来比较两个字符串，语法如下：<br />string.localeCompare(target)<br />参数target是要与string进行比较的字符串。<br />如果string小于target，则localeCompare()返回小于0的数；<br />如果string大于target，返回大于0的数；<br />如果相等（或按照本地顺序的约定两者顺序相当），则返回0。<br />利用该方法替换上面冗长的作法后，除了代码减少了之外，运行速度也快了不少，而且还支持其它字符库的本地排序。<br />修改后代码如下：<br /><br />该方法目前已作为ECMAScript v3标准，在支持JavaScript 1.5（Mozilla、Netscape 6+）以及JScript 5.5（IE 5.5+）的浏览器中均得到了支持。 </div></blockquote></span>
								</td>
						</tr>
				</tbody>
		</table>
		<p>代码如下：<br /><br />&lt;script type="text/javascript"&gt;<br />&lt;!--<br />     function startSort(){<br />          var a=document.getElementById('s').value;<br />          a=a.split(',')<br />          a.sort();<br />        