﻿<?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精髓-随笔分类-Java</title><link>http://www.blogjava.net/jhyan/category/3870.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 27 Apr 2008 12:49:54 GMT</lastBuildDate><pubDate>Sun, 27 Apr 2008 12:49:54 GMT</pubDate><ttl>60</ttl><item><title>最轻便的客户端oracle instant client安装备忘.(转载)</title><link>http://www.blogjava.net/jhyan/archive/2008/04/27/196619.html</link><dc:creator>Joshua Yan</dc:creator><author>Joshua Yan</author><pubDate>Sun, 27 Apr 2008 12:07:00 GMT</pubDate><guid>http://www.blogjava.net/jhyan/archive/2008/04/27/196619.html</guid><wfw:comment>http://www.blogjava.net/jhyan/comments/196619.html</wfw:comment><comments>http://www.blogjava.net/jhyan/archive/2008/04/27/196619.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jhyan/comments/commentRss/196619.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jhyan/services/trackbacks/196619.html</trackback:ping><description><![CDATA[<div class="postTitle"><a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/rocky/archive/2007/09/13/oracle_instant_client.html">最轻便的客户端oracle instant client安装备忘.</a> </div>
<p>轻便的客户端oracle instant client安装备忘：<br />
假定instant client 解压到E:\OracleInstantClient<br />
1.SET PATH=E:\OracleInstantClient;<br />
2.SET TNS_ADMIN=E:\OracleInstantClient<br />
3.新建一个tnsnames.ora，然后填入<br />
for example:<br />
192.168.0.20 =<br />
&nbsp; (DESCRIPTION =<br />
&nbsp;&nbsp;&nbsp; (ADDRESS_LIST =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.20)(PORT = 1521))<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp;&nbsp; (CONNECT_DATA =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SERVICE_NAME = orcl)<br />
&nbsp;&nbsp;&nbsp; )<br />
)<br />
4.SET LD_LIBRARY_PATH=E:\OracleInstantClient</p>
<p>5.如果要安装SQL plus那么需要设置SET SQLPATH=E:\OracleInstantClient<br />
6.如果查询结果为乱码，设置set NLS_LANG=XXXX（我自己是SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280）<br />
<br />
原地址：http://www.blogjava.net/rocky/archive/2007/09/13/oracle_instant_client.html</p>
<img src ="http://www.blogjava.net/jhyan/aggbug/196619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jhyan/" target="_blank">Joshua Yan</a> 2008-04-27 20:07 <a href="http://www.blogjava.net/jhyan/archive/2008/04/27/196619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解惑 spring 嵌套事务 （转载）</title><link>http://www.blogjava.net/jhyan/archive/2008/03/19/187216.html</link><dc:creator>Joshua Yan</dc:creator><author>Joshua Yan</author><pubDate>Wed, 19 Mar 2008 04:38:00 GMT</pubDate><guid>http://www.blogjava.net/jhyan/archive/2008/03/19/187216.html</guid><wfw:comment>http://www.blogjava.net/jhyan/comments/187216.html</wfw:comment><comments>http://www.blogjava.net/jhyan/archive/2008/03/19/187216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jhyan/comments/commentRss/187216.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jhyan/services/trackbacks/187216.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 解惑 spring 嵌套事务 /** * @author 王政 * @date 2006-11-24 * @note 转载请注明出处 */ 在所有使用 spring 的应用中, 声明式事务管理可能是使用率最高的功能了, 但是, 从我观察到的情况看, 绝大多数人并不能深刻理解事务声明中不同事务传播属性配置的的含义, 让我们来看一下 TransactionDefin...&nbsp;&nbsp;<a href='http://www.blogjava.net/jhyan/archive/2008/03/19/187216.html'>阅读全文</a><img src ="http://www.blogjava.net/jhyan/aggbug/187216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jhyan/" target="_blank">Joshua Yan</a> 2008-03-19 12:38 <a href="http://www.blogjava.net/jhyan/archive/2008/03/19/187216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 error (转载)</title><link>http://www.blogjava.net/jhyan/archive/2008/01/21/176725.html</link><dc:creator>Joshua Yan</dc:creator><author>Joshua Yan</author><pubDate>Mon, 21 Jan 2008 04:36:00 GMT</pubDate><guid>http://www.blogjava.net/jhyan/archive/2008/01/21/176725.html</guid><wfw:comment>http://www.blogjava.net/jhyan/comments/176725.html</wfw:comment><comments>http://www.blogjava.net/jhyan/archive/2008/01/21/176725.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jhyan/comments/commentRss/176725.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jhyan/services/trackbacks/176725.html</trackback:ping><description><![CDATA[<br />
<div>当把struts2下所有的包放在lib下，启动时的确会报错（啥错给忘了），最好是用到什么包自己加什么包，我最常用ssh所以~~~，一下错误经验分享一下。<br />
1。没有加入spring包以前，只加入了struts2-spring-plugin-2.0.6.jar<br />
&nbsp; 2007-3-21 17:37:29 org.apache.catalina.core.StandardContext filterStart <br />
&nbsp;&nbsp; 严重: Exception starting filter struts2 <br />
&nbsp;&nbsp; Unable to load bean: type:com.opensymphony.xwork2.ObjectFactory <br />
2。加入了spring包以后的工程<br />
&nbsp;&nbsp;&nbsp; java.lang.NullPointerException<br />
&nbsp;&nbsp; at com.opensymphony.xwork2.spring.SpringObjectFactory.getClassInstance&nbsp; (SpringObjectFactory.java:188)at&nbsp;&nbsp;&nbsp; com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.verifyResultType&nbsp;&nbsp; (XmlConfigurationProvider.java:479)<br />
3。/在web.xml文件中加入，问题解决<br />
&lt;context-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/applicationContext.xml&lt;/param-value&gt;<br />
&lt;/context-param&gt;<br />
//listenre会自动在web-inf文件夹下寻找applicationcontext.xml文件，如果你的spring配置文件配置了好多，可以采取&nbsp; context-param的参数来解决<br />
&nbsp; &lt;listener&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<br />
&nbsp;&nbsp; &lt;/listener&gt;<br />
4。struts2的标签无法读取<br />
&nbsp; Servlet.service() for servlet jsp threw exception<br />
&nbsp;&nbsp; java.lang.NullPointerException<br />
&nbsp;&nbsp; at org.apache.struts2.views.jsp.TagUtils.getStack(TagUtils.java:58)<br />
&nbsp;&nbsp; at org.apache.struts2.views.jsp.StrutsBodyTagSupport.getStack(StrutsBodyTagSupport.java:52)<br />
&nbsp;&nbsp; 在web.xml中加入<br />
&lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&nbsp;&lt;/filter-mapping〉<br />
<br />
<br />
From: <a href="http://blog.csdn.net/qiuxiao1981/archive/2007/10/19/1832852.aspx">http://blog.csdn.net/qiuxiao1981/archive/2007/10/19/1832852.aspx</a><br />
<br />
<br />
经过本人测试主要是由于web.xml中少了如下listener的配置:<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;listener&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/listener&gt;</div>
<img src ="http://www.blogjava.net/jhyan/aggbug/176725.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jhyan/" target="_blank">Joshua Yan</a> 2008-01-21 12:36 <a href="http://www.blogjava.net/jhyan/archive/2008/01/21/176725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转载:dW 中国 2007 年 TOP 10 最受欢迎的文章和教程</title><link>http://www.blogjava.net/jhyan/archive/2008/01/11/174652.html</link><dc:creator>Joshua Yan</dc:creator><author>Joshua Yan</author><pubDate>Fri, 11 Jan 2008 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/jhyan/archive/2008/01/11/174652.html</guid><wfw:comment>http://www.blogjava.net/jhyan/comments/174652.html</wfw:comment><comments>http://www.blogjava.net/jhyan/archive/2008/01/11/174652.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jhyan/comments/commentRss/174652.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jhyan/services/trackbacks/174652.html</trackback:ping><description><![CDATA[http://www.ibm.com/developerworks/cn/top10/?ca=drs-tp4707&amp;S_TACT=105AGX52&amp;S_CMP=techcsdn
<img src ="http://www.blogjava.net/jhyan/aggbug/174652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jhyan/" target="_blank">Joshua Yan</a> 2008-01-11 16:20 <a href="http://www.blogjava.net/jhyan/archive/2008/01/11/174652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>注意properties的使用</title><link>http://www.blogjava.net/jhyan/archive/2006/10/27/77567.html</link><dc:creator>Joshua Yan</dc:creator><author>Joshua Yan</author><pubDate>Fri, 27 Oct 2006 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/jhyan/archive/2006/10/27/77567.html</guid><wfw:comment>http://www.blogjava.net/jhyan/comments/77567.html</wfw:comment><comments>http://www.blogjava.net/jhyan/archive/2006/10/27/77567.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/jhyan/comments/commentRss/77567.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jhyan/services/trackbacks/77567.html</trackback:ping><description><![CDATA[众所周知，java中Properties类继承于Hashtable，但是它的目的是只存储string，如果用法不当可能会造成无法取出数据。<br /><br />例子：<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span> <span style="COLOR: #000000">Properties prop</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Properties();<br /></span><span style="COLOR: #008080">2</span> <span style="COLOR: #000000">prop.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">id</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">3</span> <span style="COLOR: #000000">prop.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">price</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BigDecimal(</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">));<br /></span><span style="COLOR: #008080">4</span> <span style="COLOR: #000000">System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">prop=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">prop.toString());<br /></span><span style="COLOR: #008080">5</span> <span style="COLOR: #000000">String price</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">prop.getProperty(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">price</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">6</span> <span style="COLOR: #000000">System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">price=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">price);<br /></span><span style="COLOR: #008080">7</span> <span style="COLOR: #000000"></span></div><br /><br />打印的结果可能象下面所示<br />第4行的结果：prop={id=12,price=4}<br />第6行的结果：price=null<br /><br /><br />为什么取出来的price为null，而不是我们传入的值4？？<br /><br />1.首先让我们看下jdk中getProperty的源码<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img id="Codehighlighter1_39_222_Open_Image" onclick="this.style.display='none'; Codehighlighter1_39_222_Open_Text.style.display='none'; Codehighlighter1_39_222_Closed_Image.style.display='inline'; Codehighlighter1_39_222_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_39_222_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_39_222_Closed_Text.style.display='none'; Codehighlighter1_39_222_Open_Image.style.display='inline'; Codehighlighter1_39_222_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> String getProperty(String key) </span><span id="Codehighlighter1_39_222_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_39_222_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Object oval </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">super</span><span style="COLOR: #000000">.get(key);<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    String sval </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (oval </span><span style="COLOR: #0000ff">instanceof</span><span style="COLOR: #000000"> String) </span><span style="COLOR: #000000">?</span><span style="COLOR: #000000"> (String)oval : </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> ((sval </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> (defaults </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)) </span><span style="COLOR: #000000">?</span><span style="COLOR: #000000"> defaults.getProperty(key) : sval;<br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span></div><br />从第3行可以看出，如果Properties中的value不是String的实例就会返回null。<br /><br /><br />2。在例子中，我们用put方法传入了BigDecimal的实例，因此取出的时候返回了null。<br /><br />为了避免这种情况的出现，我们用Properties时应该使用setProperty和getProperty方法，但这样会限制传入的只能是String的实例。<br /><img src ="http://www.blogjava.net/jhyan/aggbug/77567.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jhyan/" target="_blank">Joshua Yan</a> 2006-10-27 11:00 <a href="http://www.blogjava.net/jhyan/archive/2006/10/27/77567.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编写简单SOAP客户机(转载)</title><link>http://www.blogjava.net/jhyan/archive/2005/10/28/17162.html</link><dc:creator>Joshua Yan</dc:creator><author>Joshua Yan</author><pubDate>Fri, 28 Oct 2005 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/jhyan/archive/2005/10/28/17162.html</guid><wfw:comment>http://www.blogjava.net/jhyan/comments/17162.html</wfw:comment><comments>http://www.blogjava.net/jhyan/archive/2005/10/28/17162.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jhyan/comments/commentRss/17162.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jhyan/services/trackbacks/17162.html</trackback:ping><description><![CDATA[<TABLE class=tablenormal>
<TBODY>
<TR>
<TD>
<TABLE class=tablenormal>
<TBODY>
<TR>
<TD vAlign=top height=150>本文描述了一个用Java编写的不使用专门SOAP库的简单通用SOAP客户机。该客户机可以让您用任何 XML 编辑器（或文本编辑器）创建自己的请求， 而不是在暗中为您创建 SOAP 请求 XML 文档。 该客户机向您显示实际的 SOAP 响应 XML 文档，而不是仅仅提供远程方法的返回值。 这个简短的 Java 程序精确显示了什么是 SOAP：打开 HTTP 连接、发送适当 XML 以调用远程方法、接着读取服务器返回的 XML 响应。 <BR><BR><BR>通用 Java SOAP 客户机<BR><BR><BR>SOAP（简单对象访问协议）是 IBM、Microsoft、DevelopMentor 和 UserLand Software 为在网络上交换信息而开发的一种已在发展的 W3C 标准。 随着Web上可以公开使用的SOAP服务器的不断增加，SOAP几乎对用任何语言编写的程序——即使是用流行的简单语言（如 Visual Basic、JavaScript 和 perl）编写的非常短小的程序——执行着HTML对Web浏览器所做的事：它为这些程序提供一个简单的方法来利用万维网上不断增加的可用信息源。 <BR><BR>与 HTML 类似，SOAP 提供一套标记来表示在Web上使用HTTP传输协议（从 SOAP 1.1 以来，SMTP 也可以）发送的不同信息块的作用。但是，SOAP向您提供的能力远远强于HTML。使用SOAP，您的程序向 SOAP服务器发送“SOAP请求”（一个简短的XML文档，描述在远程机器上要调用的方法和所有要传递给它的参数）。SOAP服务器将尝试用那些参数执行该方法，并将SOAP响应发回程序。响应可以是执行的结果，也可以是相应的错误消息。可以使用公共SOAP服务器为提出请求的客户机提供股票价格、最新的货币兑换率、FedEx 包裹跟踪信息、代数表达式的解决方案以及其它各类信息。 <BR><BR>在SOAP存在之前，尝试使用这种信息的程序必须先捕获Web页面，然后“刮下”HTML，以查找适当的文本。 对这些Web页面进行可视的重新设计（例如，将当前股票价格放到表中第三列而不是第二列中）就可以使这些程序无用。SOAP规范以及它所携带的简要的SOAP请求和响应模式为客户机和服务器之间的联络提供了一个框架，该框架是那些强健得多的信息收集工具的基础。 <BR><BR>有许多SOAP客户机可用于大多数的流行编程语言；有关详尽列表，请参阅 SOAP::Lite for Perl 主页上的 SOAP Toolkits 部分（请参阅参考资料）。大多数 SOAP 客户机都提供类库、COM 对象或从您自己程序调用的等同对象。通常，使用这些客户机库遵循以下模式： <BR><BR>· 程序传递要调用的远程方法的名称和所有必需参数。 <BR><BR>· 库组装 SOAP 请求的适当 XML 文档以将这一信息打包。 <BR><BR>· 库将这一 XML 文档传递给 SOAP 端点 URL 标识的 SOAP 服务器，这与通过指定服务器的 URL 将浏览器指向 Web 服务器地址很类似。 <BR><BR>· SOAP 服务器尝试执行方法后，它组装包含执行结果的 SOAP 响应 XML 文档，并将它发回 SOAP 客户机。 <BR><BR>· 接收SOAP响应时，客户机库对XML进行语法分析以获得方法调用的结果，并将结果传递给使用库的程序。 <BR><BR><BR>SOAPClient4XG<BR><BR><BR>SOAP 的介绍（请参阅 developerWorks 上 Graham Glass 编写得极佳的“ Web 服务革命”专栏）总是讨论用于 SOAP 请求和响应的 XML 的结构，但是我接触到的 SOAP 客户机总是会暗中进行 XML 组装和语法分析，所以我从来不用知道。 作为使用 XML 的人员，我曾想自己执行 XML 部分；我认为如果 SOAP 这样简单，那么我应该能够编写一个简单的 SOAP 客户机来读取 SOAP 请求的 XML 文档、将它发送到命令行上指定的 SOAP 端点 URL、读回响应文档并输出该响应。这将使它成为一个真正的通用 SOAP 客户机，因为它调用任何 SOAP 服务器上的任何方法。 <BR><BR>清单1中显示的 SoapClient4XG（“SOAP Client for XML Geeks”）Java类执行该任务，而不使用早先提到的 SOAP Toolkits 页面上列出的任何专用 Java SOAP 类（请参阅参考资料）。 检查了必需的 SOAP 端点 URL 和 SOAP XML 文档文件名参数及可选的 SOAP 操作参数后，读入文件，将它发送到 SOAP 服务器，读回响应，然后将其输出到标准出口。 <BR><BR>清单1 <BR><BR>Listing 1. The complete SOAP client <BR>/** <BR>* SOAPClient4XG. Read the SOAP envelope file passed as the second<BR>* parameter, pass it to the SOAP endpoint passed as the first parameter, and<BR>* print out the SOAP envelope passed as a response.&nbsp;&nbsp;with help from Michael<BR>* Brennan 03/09/01<BR>* <BR>*<BR>* @author&nbsp;&nbsp;Bob DuCharme<BR>* @version 1.1<BR>* @param&nbsp;&nbsp; SOAPUrl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL of SOAP Endpoint to send request.<BR>* @param&nbsp;&nbsp; xmlFile2Send A file with an XML document of the request.&nbsp;&nbsp;<BR>*<BR>* 5/23/01 revision: SOAPAction added<BR>*/<BR>import java.io.*;<BR>import java.net.*;<BR>public class SOAPClient4XG {<BR>&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) throws Exception {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (args.length&nbsp;&nbsp;&lt; 2) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println("Usage:&nbsp;&nbsp;java SOAPClient4XG " +<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "http://soapURL soapEnvelopefile.xml" +<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " [SOAPAction]");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println("SOAPAction is optional.");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String SOAPUrl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= args[0];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String xmlFile2Send = args[1];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String SOAPAction = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (args.length&nbsp;&nbsp;&gt; 2) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOAPAction = args[2];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Create the connection where we&amp;#39;re going to send the file.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL url = new URL(SOAPUrl);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URLConnection connection = url.openConnection();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpURLConnection httpConn = (HttpURLConnection) connection;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Open the input file. After we copy it to a byte array, we can see<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// how big it is so that we can set the HTTP Cotent-Length<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// property. (See complete e-mail below for more on this.)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInputStream fin = new FileInputStream(xmlFile2Send);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayOutputStream bout = new ByteArrayOutputStream();&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Copy the SOAP file to the open connection.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;copy(fin,bout);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fin.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[] b = bout.toByteArray();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Set the appropriate HTTP parameters.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpConn.setRequestProperty( "Content-Length",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String.valueOf( b.length ) );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpConn.setRequestProperty("Content-Type","text/xml; charset=utf-8");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpConn.setRequestProperty("SOAPAction",SOAPAction);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpConn.setRequestMethod( "POST" );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpConn.setDoOutput(true);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpConn.setDoInput(true);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Everything&amp;#39;s set up; send the XML that was read in to b.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream out = httpConn.getOutputStream();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.write( b );&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Read the response and write it to standard out.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStreamReader isr =<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new InputStreamReader(httpConn.getInputStream());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader in = new BufferedReader(isr);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String inputLine;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while ((inputLine = in.readLine()) != null)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(inputLine);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;// copy method from From E.R. Harold&amp;#39;s book "Java I/O"<BR>&nbsp;&nbsp;public static void copy(InputStream in, OutputStream out) <BR>&nbsp;&nbsp; throws IOException {<BR>&nbsp;&nbsp;&nbsp;&nbsp;// do not allow other threads to read from the<BR>&nbsp;&nbsp;&nbsp;&nbsp;// input or write to the output while copying is<BR>&nbsp;&nbsp;&nbsp;&nbsp;// taking place<BR>&nbsp;&nbsp;&nbsp;&nbsp;synchronized (in) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;synchronized (out) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[] buffer = new byte[256];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (true) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int bytesRead = in.read(buffer);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (bytesRead == -1) break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.write(buffer, 0, bytesRead);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;} <BR>}<BR><BR><!-- the post be hidden --></TD></TR></TBODY></TABLE></TD></TR><!-- user pen -->
<TR>
<TD><BR></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/jhyan/aggbug/17162.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jhyan/" target="_blank">Joshua Yan</a> 2005-10-28 13:26 <a href="http://www.blogjava.net/jhyan/archive/2005/10/28/17162.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Timer使用经历</title><link>http://www.blogjava.net/jhyan/archive/2005/09/15/13106.html</link><dc:creator>Joshua Yan</dc:creator><author>Joshua Yan</author><pubDate>Thu, 15 Sep 2005 12:20:00 GMT</pubDate><guid>http://www.blogjava.net/jhyan/archive/2005/09/15/13106.html</guid><wfw:comment>http://www.blogjava.net/jhyan/comments/13106.html</wfw:comment><comments>http://www.blogjava.net/jhyan/archive/2005/09/15/13106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jhyan/comments/commentRss/13106.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jhyan/services/trackbacks/13106.html</trackback:ping><description><![CDATA[今天，我为一个Timer（java.util.Timer）添加了4个TimerTask，让他们对我的程序进行不断的更新。<BR>task1：处理接收到的数据，并构建为程序中所需的对象。<BR>task2：解析task1所构建的对象，并作出相应处理，最终返回结果给请求端。<BR>task3：处理外部请求队列。<BR>task4：发送应答信息（实时性要求不高）。<BR>当接收到外部的请求时，把请求加入到请求队列。但中间出现了一些问题，当task3处理请求时，由于需要和外部进行通信，它的通信结果需要task2来提供，这样就造成得不到结果的情况。这是因为如果task3没有完成，task2就不能执行，因此他们需要分开处理。用两个Timer即可。<img src ="http://www.blogjava.net/jhyan/aggbug/13106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jhyan/" target="_blank">Joshua Yan</a> 2005-09-15 20:20 <a href="http://www.blogjava.net/jhyan/archive/2005/09/15/13106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>