ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>免费日韩一区二区三区 ,青青草久久爱,亚洲欧美自拍偷拍http://www.aygfsteel.com/baizhihui19870626/category/51441.html记录æœ?/description>zh-cnTue, 19 Jun 2012 16:03:08 GMTTue, 19 Jun 2012 16:03:08 GMT60è½?------------利用AXIS开发Webservice(ä¸? —â€?如何传递JavaBean和你的对è±?åQˆç›®çš„:学习åQ?/title><link>http://www.aygfsteel.com/baizhihui19870626/articles/380258.html</link><dc:creator>ž®ç™½19870626</dc:creator><author>ž®ç™½19870626</author><pubDate>Thu, 07 Jun 2012 09:05:00 GMT</pubDate><guid>http://www.aygfsteel.com/baizhihui19870626/articles/380258.html</guid><wfw:comment>http://www.aygfsteel.com/baizhihui19870626/comments/380258.html</wfw:comment><comments>http://www.aygfsteel.com/baizhihui19870626/articles/380258.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/baizhihui19870626/comments/commentRss/380258.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/baizhihui19870626/services/trackbacks/380258.html</trackback:ping><description><![CDATA[<p>˜q™å‡ å¤©è²Œä¼¼æˆ˜æ–—力无穷åQŒè¶ç€æœ‰ç²¾åŠ›å°±å¤šæ›´æ–îC¸¤½‹‡ã€‚随着对Axis的研½I¶åŠ æ·±ï¼Œ­‘Šæ„Ÿè§‰webservice是个很好玩的东西。这½‹‡è¯´ä¸€ä¸‹å¦‚何传递一个JavaBean和你自己的一个special Objectã€?/p> <p> </p> <p>在第一½‹‡ä»‹¾lAxis的文章里åQŒæˆ‘们做了一个简单的webserviceåQŒæˆ‘们client side传递了Stringå’Œint¾cÕdž‹çš„æ•°æ®ç»™service object。Service处理之后˜q”回处理¾l“æžœ¾l™Client。对于大多数需求,那个demo昄¡„¶å·²ç»­‘›_¤Ÿåº”付了。但是如果client端需要传输一个对象给serveråQŒé‚£ä¹ˆé‚£ä¸ªdemož®±æ˜¾å¾—力不从心了。Axis中提供了˜qœç¨‹ä¼ è¾“对象的方法,通过那些æ–ÒŽ(gu¨©)³•我们同样可以随心的传递自å·Þqš„对象ã€?/p> <p> </p> <p>我们先从传递一个JavaBean开始,首先¾~–写一个JavaBeanã€?/p> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Java代码 <a title="复制代码" ><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏˜q™æ®µä»£ç " href="javascript:void()"><img class="star" alt="收藏代码" src="http://chnic.iteye.com/images/icon_star.png" /><img style="display: none" class="spinner" src="http://chnic.iteye.com/images/spinner.gif" alt="" /></a></div></div> <ol class="dp-j"><li><span id="wmqeeuq" class="keyword">package</span><span> com.chnic.bean; </span></li><li><span></span></li><li><span></span><span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">class</span><span> OrderBean { </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">private</span><span> String name; </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">private</span><span> </span><span id="wmqeeuq" class="keyword">int</span><span> age; </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">private</span><span> String[] items; </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">private</span><span> </span><span id="wmqeeuq" class="keyword">int</span><span>[] price; </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">private</span><span> </span><span id="wmqeeuq" class="keyword">boolean</span><span> checked; </span></span></li><li><span></span></li><li><span></span><span id="wmqeeuq" class="keyword">public</span><span> OrderBean() { </span></span></li><li><span>} </span></li><li><span></span><span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">int</span><span> getAge() { </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">return</span><span> age; </span></span></li><li><span>} </span></li><li><span></span><span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">void</span><span> setAge(</span><span id="wmqeeuq" class="keyword">int</span><span> age) { </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">this</span><span>.age = age; </span></span></li><li><span>} </span></li><li><span></span><span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">boolean</span><span> isChecked() { </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">return</span><span> checked; </span></span></li><li><span>} </span></li><li><span></span><span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">void</span><span> setChecked(</span><span id="wmqeeuq" class="keyword">boolean</span><span> checked) { </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">this</span><span>.checked = checked; </span></span></li><li><span>} </span></li><li><span></span><span id="wmqeeuq" class="keyword">public</span><span> String[] getItems() { </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">return</span><span> items; </span></span></li><li><span>} </span></li><li><span></span><span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">void</span><span> setItems(String[] items) { </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">this</span><span>.items = items; </span></span></li><li><span>} </span></li><li><span></span><span id="wmqeeuq" class="keyword">public</span><span> String getName() { </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">return</span><span> name; </span></span></li><li><span>} </span></li><li><span></span><span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">void</span><span> setName(String name) { </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">this</span><span>.name = name; </span></span></li><li><span>} </span></li><li><span></span><span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">int</span><span>[] getPrice() { </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">return</span><span> price; </span></span></li><li><span>} </span></li><li><span></span><span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">void</span><span> setPrice(</span><span id="wmqeeuq" class="keyword">int</span><span>[] price) { </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">this</span><span>.price = price; </span></span></li><li><span>} </span></li><li><span>} </span></li></ol></div><pre style="display: none" class="java" title="利用AXIS开发Webservice(ä¸? —— 如何传递JavaBean和你的对è±? pre_index="0" source_url="http://chnic.iteye.com/blog/170552" codeable_type="Blog" codeable_id="170552" name="code">package com.chnic.bean; public class OrderBean { private String name; private int age; private String[] items; private int[] price; private boolean checked; public OrderBean() { } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean isChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; } public String[] getItems() { return items; } public void setItems(String[] items) { this.items = items; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int[] getPrice() { return price; } public void setPrice(int[] price) { this.price = price; } } </pre> <p>˜q™ä¸ªJavaBean的前4ä¸ªå±žæ€§éƒ½å¾ˆæ¸…æ¥šï¼Œè¦è§£é‡Šä¸€ä¸‹æœ€åŽä¸€ä¸ªã€‚å› ä¸ø™¿™ä¸ªJavaBean被传递到Service端处理之后要接着被传回,用来½CÞZ¾‹webservce传进和传出。这个变量用来区别传˜q›å’Œä¼ å‡ºçš„差别。解释完我们来看下service</p> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Java代码 <a title="复制代码" ><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏˜q™æ®µä»£ç " href="javascript:void()"><img class="star" alt="收藏代码" src="http://chnic.iteye.com/images/icon_star.png" /><img style="display: none" class="spinner" src="http://chnic.iteye.com/images/spinner.gif" alt="" /></a></div></div> <ol class="dp-j"><li><span id="wmqeeuq" class="keyword">package</span><span> com.chnic.webservice; </span></li><li><span></span></li><li><span></span><span id="wmqeeuq" class="keyword">import</span><span> com.chnic.bean.OrderBean; </span></span></li><li><span></span></li><li><span></span><span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">class</span><span> AnalyzeOrder { </span></span></li><li><span></span></li><li><span></span><span id="wmqeeuq" class="keyword">public</span><span> AnalyzeOrder(){ </span></span></li><li><span>} </span></li><li><span></span></li><li><span></span><span id="wmqeeuq" class="keyword">public</span><span> OrderBean process(OrderBean order){ </span></span></li><li><span>order.setChecked(</span><span id="wmqeeuq" class="keyword">true</span><span>); </span></span></li><li><span>System.out.println(</span><span id="wmqeeuq" class="string">"name: "</span><span> + order.getName() + </span><span id="wmqeeuq" class="string">" age: "</span><span> + order.getAge()); </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">for</span><span>(</span><span id="wmqeeuq" class="keyword">int</span><span> i=</span><span id="wmqeeuq" class="number"><font color="#c00000">0</font></span><span>; i<order.getItems().length; i++) </span></span></li><li><span>System.out.println(</span><span id="wmqeeuq" class="string">"Item "</span><span> + (i+</span><span id="wmqeeuq" class="number"><font color="#c00000">1</font></span><span>) + order.getItems()[i] + </span></span></li><li><span></span><span id="wmqeeuq" class="string">" and price is "</span><span> + order.getPrice()[i]); </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">return</span><span> order; </span></span></li><li><span>} </span></li><li><span>} </span></li></ol></div><pre style="display: none" class="java" title="利用AXIS开发Webservice(ä¸? —— 如何传递JavaBean和你的对è±? pre_index="1" source_url="http://chnic.iteye.com/blog/170552" codeable_type="Blog" codeable_id="170552" name="code">package com.chnic.webservice; import com.chnic.bean.OrderBean; public class AnalyzeOrder { public AnalyzeOrder(){ } public OrderBean process(OrderBean order){ order.setChecked(true); System.out.println("name: " + order.getName() + " age: " + order.getAge()); for(int i=0; i<order.getItems().length; i++) System.out.println("Item " + (i+1) + order.getItems()[i] + " and price is " + order.getPrice()[i]); return order; } }</pre> <p>Service Object的代码很½Ž€å•,ž®×ƒ¸è§£é‡Šäº†ã€‚惯例,我们来编写发布文件ã€?/p> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Xml代码 <a title="复制代码" ><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏˜q™æ®µä»£ç " href="javascript:void()"><img class="star" alt="收藏代码" src="http://chnic.iteye.com/images/icon_star.png" /><img style="display: none" class="spinner" src="http://chnic.iteye.com/images/spinner.gif" alt="" /></a></div></div> <ol class="dp-xml"><li><span><strong><font color="#006699"><span id="wmqeeuq" class="tag"><</span><span id="wmqeeuq" class="tag-name">deployment</span></font></strong><span> </span><span id="wmqeeuq" class="attribute"><font color="#ff0000">xmlns</font></span><span>=</span><span id="wmqeeuq" class="attribute-value"><font color="#0000ff">"http://xml.apache.org/axis/wsdd/"</font></span><span> </span></span></li><li><span></span><span id="wmqeeuq" class="attribute"><font color="#ff0000">xmlns:java</font></span><span>=</span><span id="wmqeeuq" class="attribute-value"><font color="#0000ff">"http://xml.apache.org/axis/wsdd/providers/java"</font></span><span id="wmqeeuq" class="tag"><strong><font color="#006699">></font></strong></span><span> </span></span></li><li><span></span></li><li><span></span><strong><font color="#006699"><span id="wmqeeuq" class="tag"><</span><span id="wmqeeuq" class="tag-name">service</span></font></strong><span> </span><span id="wmqeeuq" class="attribute"><font color="#ff0000">name</font></span><span>=</span><span id="wmqeeuq" class="attribute-value"><font color="#0000ff">"CheckOrder"</font></span><span> </span><span id="wmqeeuq" class="attribute"><font color="#ff0000">provider</font></span><span>=</span><span id="wmqeeuq" class="attribute-value"><font color="#0000ff">"java:RPC"</font></span><span id="wmqeeuq" class="tag"><strong><font color="#006699">></font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span id="wmqeeuq" class="tag"><</span><span id="wmqeeuq" class="tag-name">parameter</span></font></strong><span> </span><span id="wmqeeuq" class="attribute"><font color="#ff0000">name</font></span><span>=</span><span id="wmqeeuq" class="attribute-value"><font color="#0000ff">"className"</font></span><span> </span><span id="wmqeeuq" class="attribute"><font color="#ff0000">value</font></span><span>=</span><span id="wmqeeuq" class="attribute-value"><font color="#0000ff">"com.chnic.webservice.AnalyzeOrder"</font></span><span id="wmqeeuq" class="tag"><strong><font color="#006699">/></font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span id="wmqeeuq" class="tag"><</span><span id="wmqeeuq" class="tag-name">parameter</span></font></strong><span> </span><span id="wmqeeuq" class="attribute"><font color="#ff0000">name</font></span><span>=</span><span id="wmqeeuq" class="attribute-value"><font color="#0000ff">"allowedMethods"</font></span><span> </span><span id="wmqeeuq" class="attribute"><font color="#ff0000">value</font></span><span>=</span><span id="wmqeeuq" class="attribute-value"><font color="#0000ff">"process"</font></span><span id="wmqeeuq" class="tag"><strong><font color="#006699">/></font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span id="wmqeeuq" class="tag"><</span><span id="wmqeeuq" class="tag-name">beanMapping</span></font></strong><span> </span><span id="wmqeeuq" class="attribute"><font color="#ff0000">qname</font></span><span>=</span><span id="wmqeeuq" class="attribute-value"><font color="#0000ff">"myNS:Order"</font></span><span> </span><span id="wmqeeuq" class="attribute"><font color="#ff0000">xmlns:myNS</font></span><span>=</span><span id="wmqeeuq" class="attribute-value"><font color="#0000ff">"urn:AnalyzeOrder"</font></span><span> </span></span></li><li><span></span><span id="wmqeeuq" class="attribute"><font color="#ff0000">languageSpecificType</font></span><span>=</span><span id="wmqeeuq" class="attribute-value"><font color="#0000ff">"java:com.chnic.bean.OrderBean"</font></span><span id="wmqeeuq" class="tag"><strong><font color="#006699">/></font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span id="wmqeeuq" class="tag"></</span><span id="wmqeeuq" class="tag-name">service</span><span id="wmqeeuq" class="tag">></span></font></strong><span> </span></span></li><li><span></span><strong><font color="#006699"><span id="wmqeeuq" class="tag"></</span><span id="wmqeeuq" class="tag-name">deployment</span><span id="wmqeeuq" class="tag">></span></font></strong><span> </span></span></li></ol></div><pre style="display: none" class="xml" title="利用AXIS开发Webservice(ä¸? —— 如何传递JavaBean和你的对è±? pre_index="2" source_url="http://chnic.iteye.com/blog/170552" codeable_type="Blog" codeable_id="170552" name="code"><deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="CheckOrder" provider="java:RPC"> <parameter name="className" value="com.chnic.webservice.AnalyzeOrder"/> <parameter name="allowedMethods" value="process"/> <beanMapping qname="myNS:Order" xmlns:myNS="urn:AnalyzeOrder" languageSpecificType="java:com.chnic.bean.OrderBean"/> </service> </deployment> </pre> <p>唯一不同的就是多äº?lt;beabMapping>˜q™ä¸ªèŠ‚ç‚¹ã€‚qname 表示 XML 规范中定义的限定名称åQŒä»–由名¿U°ç©ºé—?URI、本地部分和前缀¾l„成。除了本地部分其他都不是必须的另外QName是不可变的。xmlns后面的myNS是必™åȝš„。具体根据前面所指定的qname来决定。之后可以随意命名一个namespace。最后的languageSpecificType指定的是你传递的对象¾cÕdž‹ã€?strong>½W¬ä¸€ä¸ªå±žæ€§çš„æœ¬åœ°éƒ¨åˆ†å’Œç¬¬äºŒä¸ªèŠ‚ç‚¹ä½ è‡ªå®šä¹‰çš„å‘½åç©ºé—´ä¼š¾l„成一个新的QNameåQŒåƈž®†ä½ è¦ä¼ è¾“的对象mapping是上厅R€?br /></strong></p> <p><strong></strong></p> <p>发布˜q™ä¸ªwebserviceåQŒç¼–写测试代ç ?/p> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Java代码 <a title="复制代码" ><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏˜q™æ®µä»£ç " href="javascript:void()"><img class="star" alt="收藏代码" src="http://chnic.iteye.com/images/icon_star.png" /><img style="display: none" class="spinner" src="http://chnic.iteye.com/images/spinner.gif" alt="" /></a></div></div> <ol class="dp-j"><li><span>String targetEendPoint = </span><span id="wmqeeuq" class="string">"http://localhost:8080/axis/services/CheckOrder"</span><span>; </span></li><li><span></span></li><li><span>OrderBean order = </span><span id="wmqeeuq" class="keyword">new</span><span> OrderBean(); </span></span></li><li><span>order.setName(</span><span id="wmqeeuq" class="string">"Beckham"</span><span>); </span></span></li><li><span>order.setAge(</span><span id="wmqeeuq" class="number"><font color="#c00000">32</font></span><span>); </span></span></li><li><span>String [] items = </span><span id="wmqeeuq" class="keyword">new</span><span> String[] { </span><span id="wmqeeuq" class="string">"Ipod"</span><span>, </span><span id="wmqeeuq" class="string">"ThinkPad"</span><span> }; </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">int</span><span> [] price = </span><span id="wmqeeuq" class="keyword">new</span><span> </span><span id="wmqeeuq" class="keyword">int</span><span> [] { </span><span id="wmqeeuq" class="number"><font color="#c00000">999</font></span><span>, </span><span id="wmqeeuq" class="number"><font color="#c00000">5000</font></span><span> }; </span></span></li><li><span>order.setItems(items); </span></li><li><span>order.setPrice(price); </span></li><li><span>order.setChecked(</span><span id="wmqeeuq" class="keyword">false</span><span>); </span></span></li><li><span></span></li><li><span>System.out.println(order.isChecked()); </span></li><li><span></span></li><li><span>Service service = </span><span id="wmqeeuq" class="keyword">new</span><span> Service(); </span></span></li><li><span>Call call = (Call) service.createCall(); </span></li><li><span>QName qn = </span><span id="wmqeeuq" class="keyword">new</span><span> QName(</span><span id="wmqeeuq" class="string">"urn:AnalyzeOrder"</span><span>, </span><span id="wmqeeuq" class="string">"Order"</span><span> ); </span></span></li><li><span>call.registerTypeMapping(OrderBean.</span><span id="wmqeeuq" class="keyword">class</span><span>, qn, </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">new</span><span> org.apache.axis.encoding.ser.BeanSerializerFactory(OrderBean.</span><span id="wmqeeuq" class="keyword">class</span><span>, qn), </span></span></li><li><span></span><span id="wmqeeuq" class="keyword">new</span><span> org.apache.axis.encoding.ser.BeanDeserializerFactory(OrderBean.</span><span id="wmqeeuq" class="keyword">class</span><span>, qn)); </span></span></li><li><span></span></li><li><span>call.setTargetEndpointAddress( </span><span id="wmqeeuq" class="keyword">new</span><span> java.net.URL(targetEendPoint) ); </span></span></li><li><span>call.setOperationName( </span><span id="wmqeeuq" class="keyword">new</span><span> QName(</span><span id="wmqeeuq" class="string">"CheckOrder"</span><span>, </span><span id="wmqeeuq" class="string">"process"</span><span>) ); </span></span></li><li><span>call.addParameter( </span><span id="wmqeeuq" class="string">"arg1"</span><span>, qn, ParameterMode.IN ); </span></span></li><li><span>call.setReturnClass(OrderBean.</span><span id="wmqeeuq" class="keyword">class</span><span>); </span></span></li><li><span></span></li><li><span>OrderBean result = (OrderBean) call.invoke( </span><span id="wmqeeuq" class="keyword">new</span><span> Object[] {order} ); </span></span></li><li><span></span></li><li><span>System.out.println(</span><span id="wmqeeuq" class="string">"Success..."</span><span>); </span></span></li><li><span>System.out.println(result.isChecked()) </span></li></ol></div><pre style="display: none" class="java" title="利用AXIS开发Webservice(ä¸? —— 如何传递JavaBean和你的对è±? pre_index="3" source_url="http://chnic.iteye.com/blog/170552" codeable_type="Blog" codeable_id="170552" name="code">String targetEendPoint = "http://localhost:8080/axis/services/CheckOrder"; OrderBean order = new OrderBean(); order.setName("Beckham"); order.setAge(32); String [] items = new String[] { "Ipod", "ThinkPad" }; int [] price = new int [] { 999, 5000 }; order.setItems(items); order.setPrice(price); order.setChecked(false); System.out.println(order.isChecked()); Service service = new Service(); Call call = (Call) service.createCall(); QName qn = new QName("urn:AnalyzeOrder", "Order" ); call.registerTypeMapping(OrderBean.class, qn, new org.apache.axis.encoding.ser.BeanSerializerFactory(OrderBean.class, qn), new org.apache.axis.encoding.ser.BeanDeserializerFactory(OrderBean.class, qn)); call.setTargetEndpointAddress( new java.net.URL(targetEendPoint) ); call.setOperationName( new QName("CheckOrder", "process") ); call.addParameter( "arg1", qn, ParameterMode.IN ); call.setReturnClass(OrderBean.class); OrderBean result = (OrderBean) call.invoke( new Object[] {order} ); System.out.println("Success..."); System.out.println(result.isChecked())</pre> <p>从控制台输出一些信息以便测试,里面大多代码都应该见˜q‡ã€‚new QName和之后的registerTypeMappingæ–ÒŽ(gu¨©)³•也是在实现我上面那段黑体字的内容。之后注册完参数和返回值类型运行ã€?/p> <p>会发现在tomcat控制台和本地控制台都会输出测试结果,值得注意的是checked˜q™ä¸ªå±žæ€§åœ¨ä¼ å…¥ä¹‹å‰æ˜¯false属性,传入之后我们改变了他的属性变为true。返回之后在本地控制台打印出来也为trueã€?/p> <p> </p> <p>事实上Axis除了可以传输JavaBean之外˜q˜å¯ä»¥ä¼ è¾“一些自定义的类型。比如List、Map和时间日期类型。Axisä¹ŸäØ“ä»–ä»¬æä¾›äº†ä¸“é—¨çš„SerializerFactoryå’ŒDeserializerFactory。这些工厂类会äñ”生串行化工具åŽÕdºåˆ—化相应的对象。更多的Factory Object可以在org.apache.axis.encoding.ser下面扑ֈ°ã€?/p> <p> </p> <p>对于自定义序列化åQŒAxis也提供了相对性的配置节点。具体配¾|®å¦‚下:</p> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Xml代码 <a title="复制代码" ><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏˜q™æ®µä»£ç " href="javascript:void()"><img class="star" alt="收藏代码" src="http://chnic.iteye.com/images/icon_star.png" /><img style="display: none" class="spinner" src="http://chnic.iteye.com/images/spinner.gif" alt="" /></a></div></div> <ol class="dp-xml"><li><span><strong><font color="#006699"><span id="wmqeeuq" class="tag"><</span><span id="wmqeeuq" class="tag-name">typeMapping</span></font></strong><span> </span><span id="wmqeeuq" class="attribute"><font color="#ff0000">qname</font></span><span>=</span><span id="wmqeeuq" class="attribute-value"><font color="#0000ff">"ns:local"</font></span><span> </span><span id="wmqeeuq" class="attribute"><font color="#ff0000">xmlns:ns</font></span><span>=</span><span id="wmqeeuq" class="attribute-value"><font color="#0000ff">"someNamespace"</font></span><span> </span></span></li><li><span></span><span id="wmqeeuq" class="attribute"><font color="#ff0000">languageSpecificType</font></span><span>=</span><span id="wmqeeuq" class="attribute-value"><font color="#0000ff">"java:my.java.thingy"</font></span><span> </span></span></li><li><span></span><span id="wmqeeuq" class="attribute"><font color="#ff0000">serializer</font></span><span>=</span><span id="wmqeeuq" class="attribute-value"><font color="#0000ff">"my.java.Serializer"</font></span><span> </span></span></li><li><span></span><span id="wmqeeuq" class="attribute"><font color="#ff0000">deserializer</font></span><span>=</span><span id="wmqeeuq" class="attribute-value"><font color="#0000ff">"my.java.DeserializerFactory"</font></span><span> </span></span></li><li><span></span><span id="wmqeeuq" class="attribute"><font color="#ff0000">encodingStyle</font></span><span>=</span><span id="wmqeeuq" class="attribute-value"><font color="#0000ff">"http://schemas.xmlsoap.org/soap/encoding/"</font></span><span id="wmqeeuq" class="tag"><strong><font color="#006699">/></font></strong></span><span> </span></span></li></ol></div><pre style="display: none" class="xml" title="利用AXIS开发Webservice(ä¸? —— 如何传递JavaBean和你的对è±? pre_index="4" source_url="http://chnic.iteye.com/blog/170552" codeable_type="Blog" codeable_id="170552" name="code"><typeMapping qname="ns:local" xmlns:ns="someNamespace" languageSpecificType="java:my.java.thingy" serializer="my.java.Serializer" deserializer="my.java.DeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></pre> <p>typeMapping的前三个属性和上面讲的beanMapping都一栗÷€‚不一æ ïLš„æ˜¯åŽä¸‰ä¸ªã€‚serializer指定的是串行化类åQŒdserializer指定的是反串行化¾c…R€‚最后一个指定的¾~–码方式。其实对于typeMapping来说beanMapping只不˜q‡æ˜¯ä»–的一个简化版而已。因为beanMapping的串行化和反串行化工厂类都是固定的,而编码方式也是固定的ã€?/p> <p> </p> <p>因䨓typemappingå’ŒbeanMapping很相ä¼û|¼Œåœ¨è¿™é‡Œå°±ä¸å†å†™demo了ã€?有些äºÞZ¹Ÿè®æ€¼šé—®ï¼Œæ—¢ç„¶èƒ½ä¸²è¡ŒåŒ–对象那能不能“串行åŒ?#8221;æ–‡äšg呢?˜q™ä¸ªé—®é¢˜ç•™ç€ä¸‹æ¬¡å†è¯´å§ã€‚今天米动力了ã€?img title="confused" alt="confused" src="http://chnic.iteye.com/images/smiles/icon_confused.gif" /> </p><img src ="http://www.aygfsteel.com/baizhihui19870626/aggbug/380258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/baizhihui19870626/" target="_blank">ž®ç™½19870626</a> 2012-06-07 17:05 <a href="http://www.aygfsteel.com/baizhihui19870626/articles/380258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>è½?--------利用AXIS开发Webservice(äº? —â€?WSDD的一些高¾U§ç‰¹æ€?åQˆå­¦ä¹ ï¼‰http://www.aygfsteel.com/baizhihui19870626/articles/380252.htmlž®ç™½19870626ž®ç™½19870626Thu, 07 Jun 2012 08:52:00 GMThttp://www.aygfsteel.com/baizhihui19870626/articles/380252.htmlhttp://www.aygfsteel.com/baizhihui19870626/comments/380252.htmlhttp://www.aygfsteel.com/baizhihui19870626/articles/380252.html#Feedback0http://www.aygfsteel.com/baizhihui19870626/comments/commentRss/380252.htmlhttp://www.aygfsteel.com/baizhihui19870626/services/trackbacks/380252.htmlæ—‰™—´˜q‡çš„真快åQŒä¸€ä¸å°å¿ƒè¿‡äº†åŠòq´äº†åQŒåŠòq´åŽæˆ‘来更新½W¬äºŒ½‹‡webservice的博文。春困秋乏夏打盹åQŒç¡ä¸é†’的冬三月。最˜q‘又懒了ã€?img title="confused" alt="confused" src="http://chnic.iteye.com/images/smiles/icon_confused.gif" />

 

½W¬ä¸€½‹‡ä»‹¾läº†AXIS的两¿Uå‘布方式,和一些基本的应用。这一½‹‡è¯´ä¸€ä¸‹ä¸€äº›é«˜¾U§åº”用ã€?å¼€½‹‡ä¹‹å‰å…ˆæŠŠä¸Š½‹‡çš„一个遗漏补充上åQŒä¸Š½‹‡åªè®²äº†æ€Žä¹ˆå‘布一个webserviceåQŒä½†æ˜¯å¦‚何取消没有却没有提。其实取消一个已¾lå‘布的webservce也是非常½Ž€å•çš„åQŒæˆ‘们就拿上½‹‡çš„HelloWorld来做例子吧ã€?

 

发布webservice的时候我们有一个deploy.wsddæ–‡äšgåQŒå½“然在取消发布的时候就会有一个undeploy.wsddæ–‡äšg。这个文件的内容也很½Ž€å•,xml的代码如下ã€?/p>

Xml代码 复制代码 收藏代码
  1. <undeployment xmlns="http://xml.apache.org/axis/wsdd/">
  2. <service name="HelloWorld"/>
  3. </undeployment>

¾~–写完这个xmlæ–‡äšg之后åQŒæŠŠå®ƒåŒæ ·copyåˆ?TOMCAT_HOM\webapps\axis\WEB-INF目录下,然后CMD打开控制収ͼŒåœ¨æŽ§åˆ¶å°è¾“入一个我们很熟æ?zh¨¨n)‰çš„命ä?/span>

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient undeploy.wsdd

 

˜qè¡Œä¹‹åŽå¾—到如下¾l“果说明取消发布成功

Processing file undeploy.wsdd
<Admin>Done processing</Admin>

 

说完取消发布之后ž®±æ¥è¯´ä¸€ä¸‹AXIS的一些高¾U§ç‰¹æ€§ï¼ŒAXIS在编写deploy.wsdd˜q™ä¸ªæ–‡äšgæ—Óž¼Œæ¯ä¸ª<service>节点下面会有˜q™æ ·ä¸€ä¸ªå­èŠ‚ç‚¹ã€?/p>

Xml代码 复制代码 收藏代码
  1. <parameter name="scope" value="value"/>

˜q™ä¸ªèŠ‚ç‚¹é…ç½®ç€ä½ çš„service object也就是你webservice服务的那个object的圣明周期,在后面的value里可以有三个选项request, session, or application。熟æ‚(zh¨¨n)‰Jsp、Servlet、或者EJB里的SessionBean的朋友应该能很快能明白这个三个配¾|®é€‰é¡¹çš„含义ã€?/p>

 

requst åQšè¿™ä¸ªé€‰é¡¹ä¼šè®©AXIS为每一个SOAP的请求äñ”生一个服务对象,可以惛_ƒå¦‚æžœ˜q™ä¸ªwebservice的对象èƒö够复杂,而且SOAP的请求过多,˜q™ä¸ªé€‰é¡¹æ˜¯éžå¸¸è€—费服务器性能的ã€?/p>

session åQšå¦‚果选择了sessionåQŒç¨‹åºå°±ä¼šç»™æ¯ä¸ªè°ƒç”¨˜q™ä¸ªwebservice的客æˆïL«¯åˆ›é€ ä¸€ä¸ªæœåŠ¡å¯¹è±¡ã€?/p>

application åQšè¿™ä¸ªé€‰é¡¹æœ€å½ªæ?zh¨¨n)åQŒç¨‹åºåªä¼šåœ¨å†…存里new出来一个服务对象,然后为所有webservice客户端服务。很昄¡„¶˜q™ä¸ªé€‰é¡¹ä¸èƒ½å‚¨å­˜å®¢æˆ·ç«¯çš„一些个性化数据。所以在功能性上很多时候不能满­‘Œ™¦æ±‚ã€?/p>

 

接下来说一下Axisçš„Handlerå’ŒChain机制åQŒHandlerå’ŒChain是Axis引擎提供的一个很强大的工兗÷€‚假如现在客æˆähœ‰˜q™æ ·ä¸€ä¸ªéœ€æ±‚,需要记录某一个webservice被调用的‹Æ¡æ•°åQŒè¿™ä¸ªæ—¶å€™å¦‚果在service object里去实现˜q™ä¸ªåŠŸèƒ½ä¸ä»…éºÈƒ¦åQŒè€Œä¸”侵入了原有的½E‹åºä¹Ÿä¼šå¯¹å¢žåŠ åŽŸæœ‰ç¨‹åºçš„ä¸ç¨³å®šæ€§ã€‚æœ‰äº†Handler我们ž®Þpƒ½è§easy的解册™¿™ä¸ªé—®é¢˜ã€‚我们先来编写handler的代码ã€?/p>

Java代码 复制代码 收藏代码
  1. package com.chnic.handler;
  2. import org.apache.axis.AxisFault;
  3. import org.apache.axis.MessageContext;
  4. import org.apache.axis.handlers.BasicHandler;
  5. public class HelloWorldHandler extends BasicHandler{
  6. private static final long serialVersionUID = 1L;
  7. public void invoke(MessageContext context) throws AxisFault {
  8. String status = (String) this.getOption("status");
  9. System.out.println("HelloWorldHandler's status is: " + status);
  10. }
  11. }

BasicHandler是一个抽象类åQŒAxis提供了很多Handler的具体实玎ͼŒBasicHandler只是其中最½Ž€å•的一个。要实现一个自å·Þqš„handler首先要从¾l§æ‰¿BasicHandler˜q™ä¸ª¾cÕd¼€å§‹åƈ实现其中的invoke(MessageContext arg)˜q™ä¸ªæ–ÒŽ(gu¨©)³•。MessageContext可以看成是一个Axis的上下文åQŒé‡Œé¢å­˜å‚¨çš„æ˜¯ä¸€äº›Axiså’Œwebservice的基本信息。想了解的朋友可以看一下Axisçš„API。编写完Handler代码之后我们˜qžç¼–写发布文件ã€?/p>

Xml代码 复制代码 收藏代码
  1. <deployment xmlns="http://xml.apache.org/axis/wsdd/"
  2. xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
  3. <handler name="Hello" type="java:com.chnic.handler.HelloWorldHandler">
  4. <parameter name="status" value="success"/>
  5. </handler>
  6. <service name="HelloWorld" provider="java:RPC">
  7. <requestFlow>
  8. <handler type="Hello"/>
  9. </requestFlow>
  10. <parameter name="className" value="com.chnic.webservice.HelloWorld"/>
  11. <parameter name="allowedMethods" value="*"/>
  12. <parameter name="scope" value="session"/>
  13. </service>
  14. </deployment>

发布代码中有˜q™æ ·çš„一句,¾l†å¿ƒçš„æœ‹å‹ä¸€å®šä¼šå‘现ã€?/p>

Xml代码 复制代码 收藏代码
  1. <parameter name="status" value="success"/>

看完˜q™å¥ä»£ç å†å¯¹æ¯”一下Handler的实çŽîC»£ç ä¸­çš„ä¸€å¥ï¼Œç›æ€¿¡å¤§å¤šæ•îCh都能明白了ã€?/p>

Java代码 复制代码 收藏代码
  1. String status = (String) this.getOption("status");

Handler通过getOption(String)˜q™ä¸ªæ–ÒŽ(gu¨©)³•拿到了配¾|®æ–‡ä»¶ä¸­æˆ‘配¾|®çš„属性倹{€‚而我们上˜q°æ‰€åšçš„æ‰€æœ‰å·¥ä½œå¯¹äºŽåŽŸæ¥çš„Webserivce来说都是透明的,不会对äçR入原有的½E‹åºå½“中ã€?一个Handler可以被多个service所使用通过<requestFlow>˜q™ä¸ªæ ‡ç­¾æ¥å¼•用到某一个service中,˜q™é‡Œ˜q˜è¦å¤šæä¸€å¥æ—¢ç„¶æ˜¯ä¸€ä¸ªrequestFlowåQŒè¿™ä¸ªå½“然可以加不只一个的Handler。接下来¾~–写‹¹‹è¯•代码˜qè¡Œã€‚在本地应用服务器上会打出如下语句:HelloWorldHandler's status is: success

说明‹¹‹è¯•成功åQŒè€Œä¸”handler是配¾|®åœ¨requestflow标签中所以这ŒDµä»£ç ä¼šåœ¨service代码之前先执行ã€?/p>

 

介绍完了Handler再来介绍Chain。从Chain的字面意思就能猜åˆîC»–实现的一˜qžä¸²Handler的功能。假如某个service需要不止一个HandleråQŒæˆ–者要æ ÒŽ(gu¨©)®Client的情冉|¥é€‰æ‹©éœ€è¦é‚£äº›Handler。特别是后一个需求,我们无法用一个或者几个Handler来解冻I¼Œ˜q™ä¸ªæ—¶å€™æˆ‘们就需è¦?lt;Chain>来实çŽîCº†ã€‚我们先再编写一个HandleråQŒåŠ ä¸Šä¹‹å‰çš„é‚£ä¸ªHandler我们来组成一条锁链ã€?/p>

Java代码 复制代码 收藏代码
  1. package com.chnic.handler;
  2. import org.apache.axis.AxisFault;
  3. import org.apache.axis.MessageContext;
  4. import org.apache.axis.handlers.BasicHandler;
  5. public class MyHandler extends BasicHandler {
  6. private static final long serialVersionUID = 1L;
  7. public void invoke(MessageContext context) throws AxisFault {
  8. System.out.println("This is MyHandler..");
  9. }
  10. }

之后我们¾~–写Chain的代ç ?/p>

Java代码 复制代码 收藏代码
  1. package com.chnic.chain;
  2. import org.apache.axis.SimpleChain;
  3. import com.chnic.handler.HelloWorldHandler;
  4. import com.chnic.handler.MyHandler;
  5. public class HelloWorldChain extends SimpleChain {
  6. private static final long serialVersionUID = 1L;
  7. public HelloWorldChain(){
  8. HelloWorldHandler hwh = new HelloWorldHandler();
  9. MyHandler mh = new MyHandler();
  10. this.addHandler(hwh);
  11. this.addHandler(mh);
  12. }
  13. }

在Chain的构造函æ•îC¸­åQŒæŠŠæˆ‘要的两个Handler用addHandler()æ–ÒŽ(gu¨©)³•加蝲˜q›åŽ»ã€‚ä¹‹åŽæˆ‘ä»¬æ¥¾~–写发布文äšgã€?lt;chain>å’?lt;handler>å…ƒç´ æœ‰äº›è®æ€¸åŒåœ¨˜q™é‡Œæœ‰å¿…要多句嘴ã€?/p>

<chain>元素中的子元素只允许æ˜?lt;handler>或è€?lt;chain>。后者也ž®±æ˜¯å…è®¸åœ?#8220;锁链”里再嵌套“锁链”åQŒåœ¨˜q™é‡Œž®±æ‹¿åµŒå¥—<handler>来ä‹D例,他同æ ähœ‰ä¸¤ç§æ–¹å¼æ¥å®žçŽ°ã€‚ç¬¬ä¸€¿Uæ˜¯ç›´æŽ¥åŒ…含<handler>:

 

Xml代码 复制代码 收藏代码
  1. <chain name="myChain">
  2. <handler type="java:com.chnic.handler.MyHandler"/>
  3. </chain>

½W¬äºŒ¿Uæ˜¯å¼•用别的<handler>

 

Xml代码 复制代码 收藏代码
  1. <handler name="myHandler" type="java:com.chnic.handler.MyHandler"/>
  2. <chain name="myChain"/>
  3. <handler type="myHandler"/>
  4. </chain>

å› äØ“æˆ‘ä»¬˜q™é‡Œçš„Handleròq¶æ²¡æœ‰ç”±BasicHandler来实玎ͼŒè€Œæ˜¯ç”Þq‘ô承SimpleChain˜q™ä¸ª¾cÀL¥å®žçްåQŒä¸¥æ ¼æ„ä¹‰ä¸Šè®ÔŒ¼ŒSimpleChain也可以算是一个HandleråQŒå› ä¸ºSimpleChain也是从BasicHandler¾l§æ‰¿è€Œæ¥åQŒä»–同样实现了invoke()˜q™ä¸ªæ–ÒŽ(gu¨©)³•。下面回归正题,来看我们的发布代码ã€?/p>

Xml代码 复制代码 收藏代码
  1. <deployment xmlns="http://xml.apache.org/axis/wsdd/"
  2. xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
  3. <chain name="myChain">
  4. <handler type="java:com.chnic.chain.HelloWorldChain"/>
  5. </chain>
  6. <service name="HelloWorld" provider="java:RPC">
  7. <requestFlow>
  8. <chain type="myChain"/>
  9. </requestFlow>
  10. <parameter name="className" value="com.chnic.webservice.HelloWorld"/>
  11. <parameter name="allowedMethods" value="*"/>
  12. <parameter name="scope" value="session"/>
  13. </service>
  14. </deployment>

从新发布webservice之后åQŒè¿è¡Œæˆ‘们的‹¹‹è¯•代码。会发现在应用服务器的本地控制台上打å‡ÞZ¸¤å¥Handler要输出的语句åQŒè¯´æ˜Žæµ‹è¯•æˆåŠŸã€‚è€Œä¸”æŽ§åˆ¶å°æ‰“å‡ø™¯­å¥çš„™åºåºæ˜¯å’Œæˆ‘们加蝲handler的顺序一æ ïLš„ã€?/p>

 

除了<requestFlow>之外åQŒAxis˜q˜æä¾›äº†ä¸Žä¹‹ç›¸åº”çš?lt;/responseFlow>åQŒç”¨æ³•和是requestflow一æ ïLš„åQŒæ‰€ä¸åŒçš„æ˜¯ä¸€ä¸ªåœ¨service执行之前一个是之后。可以加下面代码到发布文件中çš?lt;service>元素下就可以实现responseflow的功èƒ?/p>

Xml代码 复制代码 收藏代码
  1. <responseFlow>
  2. <handler type="HelloWorldHandler"/>
  3. </responseFlow>

 

最后简单提一下远½E‹ç®¡ç†ï¼Œä¹Ÿå°±æ˜¯Remote Administration。要实现˜qœç¨‹½Ž¡ç†åœ¨å‘布文件的<service>标签下加入下面一ŒDµè¯­å¥å°±å¯ä»¥äº†ã€?/p>

Xml代码 复制代码 收藏代码
  1. <parameter name="enableRemoteAdmin" value="true"/>

不过˜qœç¨‹½Ž¡ç†ä¼šæœ‰å®‰å…¨æ–šw¢çš„é—®é¢˜ï¼Œæ‰€ä»¥ä¸å»ø™®®ä½¿ç”¨ã€?/p>

 

一些高¾U§éƒ¨åˆ†å°±å…ˆè¯´åˆ°è¿™é‡Œï¼Œ˜q˜æœ‰ä¸€äº›æ¯”如RPC docuement Wrapped Message的区别和使,如何传递一个JavabeanåQŒè¿˜æœ‰ä¸€äº›é…¾|®æ–¹é¢çš„的问题就留到下节说吧ã€?/p>

]]>
è½?--------利用AXIS开发Webservice(一) —â€?如何发布自己的webservice åQˆç›®çš„:学习åQ?/title><link>http://www.aygfsteel.com/baizhihui19870626/articles/380247.html</link><dc:creator>ž®ç™½19870626</dc:creator><author>ž®ç™½19870626</author><pubDate>Thu, 07 Jun 2012 08:28:00 GMT</pubDate><guid>http://www.aygfsteel.com/baizhihui19870626/articles/380247.html</guid><wfw:comment>http://www.aygfsteel.com/baizhihui19870626/comments/380247.html</wfw:comment><comments>http://www.aygfsteel.com/baizhihui19870626/articles/380247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/baizhihui19870626/comments/commentRss/380247.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/baizhihui19870626/services/trackbacks/380247.html</trackback:ping><description><![CDATA[ å› äؓ工作关系需要从事Webservice的开发工作,公司的webserivce是由Apacheçš„AXIS来实现的åQŒä»¥å‰å¯¹˜q™ä¸ªäº†è§£ä¸ç®—多,不过¾lè¿‡å‡ å¤©çš„ç ”½IÓž¼Œç‰¹å¥‰ä¸Šå°ž®çš„心得一½‹‡ã€? <p>先介¾lä¸‹æœ¬äh开发环境吧ã€?JDK 1.4.2 + Myeclipse 6.0åQˆå®žåœ¨ç»ä¸è“v诱惑åQŒå°ž®é²œåQ?+ Tomcat 5.0.28 + AXIS 1.4ã€?AXIS 1.4包可以在<span style="color: #606420"><a >http://ws.apache.org/axis/</a> </span>扑ֈ°ã€?假设所有的环境你已¾læ­å¥½ï¼Œòq¶ä¸”AXIS包也已经下好了。OKåQ?Here we go~</p> <p>解压axis-bin-1_4.zip˜q™ä¸ªåŒ…可以看到webapps目录åQŒåŒå‡»è¿›å…¥æŠŠé‡Œé¢çš„AXISæ–‡äšgå¤ÒŽ(gu¨©)‹·åˆ?%TOMCAT_HOME%\webapps目录下,之后拯‚´activation.jar、mail.jar、tools.jaråˆ?TOMCAT_HOME%\webapps\axis\WEB-INF\lib目录下。启动tomcatåQŒè®¿é—?a href="http://localhost:8080/axis/happyaxis.jsp">http://localhost:8080/axis/happyaxis.jsp</a> 如果讉K—®æˆåŠŸåQŒæ­å–œä½ åQåŸºæœ¬çš„配置你已¾låšå®Œäº†ã€?</p> <p>PSåQšæ­¤å¤„çš„%TOMCAT_HOME%指的是Tomcat的安装目录,至于那另外的三个jar包,J2EE 1.4库里ž®Þpƒ½æ‰„¡š„到ã€?/p> <p>现在来说一下最关键的Webservice的发布。AXIS提供了两¿Uå‘布方式,一¿Uæ˜¯åÏx—¶å‘布åQˆInstant DeploymentåQ‰ï¼Œå¦å¤–一¿Uæ˜¯å®šåˆ¶å‘布åQˆCustom DeploymentåQ‰ã€‚即时发布提供了一¿Uéžå¸¸ç®€å•çš„webservice的发布方式,但是其中限制太多åQŒå› æ­¤åœ¨å®žé™…的开发中定制发布才是首选。这里也ž®†ä¼šä»¥å®šåˆ¶å‘å¸ƒäØ“é‡ç‚¹æ¥ä»‹¾lã€?</p> <p style="margin-right: 0px"><strong><span style="font-size: small"><font size="2">1.åÏx—¶å‘布 JWS (Java Web Service) Files - Instant Deployment</font></span> </strong></p> <p>åÏx—¶å‘布提供了一¿Uéžå¸¸ç®€å•发布方式,发布者只要有Java源代码(也就æ˜?javaæ–‡äšgåQ‰ï¼Œç„¶åŽæŠŠå…¶åŽç¼€åæ”¹æˆjwsåQˆä¹Ÿž®±æ˜¯ java web service的羃写)拯‚´åˆ?TOMCAT_HOME%\webapps\axis目录下即完成了所有的发布工作。AXIS的编译引擎会处理接下来的所有事情。下面是一ŒD늤ºä¾‹ä»£ç ï¼š</p> <div id="wmqeeuq" class="code_title">java 代码</div> <div id="wmqeeuq" class="dp-highlighter"> <ol class="dp-j"><li id="wmqeeuq" class="alt"><span id="wmqeeuq" class="keyword">public</span> <span></span><span id="wmqeeuq" class="keyword">class</span> <span>HelloAXIS { </span></li><li><span></span></li><li id="wmqeeuq" class="alt"><span></span><span id="wmqeeuq" class="keyword">public</span> <span>String Hello(String name){ </span></li><li><span></span><span id="wmqeeuq" class="keyword">return</span> <span></span><span id="wmqeeuq" class="string">"AXIS say hello to "</span> <span>+ name; </span></li><li id="wmqeeuq" class="alt"><span>} </span></li><li><span>} </span></li></ol></div> <p>æŠ?HelloAXIS.java æ–‡äšgæ”ÒŽ(gu¨©)ˆ HelloAXIS.jws 然后拯‚´åˆ?TOMCAT_HOME%\webapps\axis目录下,启动Tomcat之后讉K—® <a href="http://localhost:8080/axis/HelloAXIS.jws">http://localhost:8080/axis/HelloAXIS.jws</a> 如果能看åˆ?Click to see the WSDL˜q™ä¸ª­‘…链接就说明已经发布成功了,点击˜q›åŽ»ž®±å¯ä»¥çœ‹åˆ°è¿™ä¸ªWebserviceçš„WSDL描述文äšg。server端的发布已经完成了,接下来就是编写Client端测试代码了ã€?/p> <div id="wmqeeuq" class="code_title">java 代码</div> <div id="wmqeeuq" class="dp-highlighter"> <ol class="dp-j"><li id="wmqeeuq" class="alt"><span id="wmqeeuq" class="keyword">package</span> <span>com.chnic.test; </span></li><li><span></span></li><li id="wmqeeuq" class="alt"><span id="wmqeeuq" class="keyword">import</span> <span>java.net.URL; </span></li><li><span></span></li><li id="wmqeeuq" class="alt"><span id="wmqeeuq" class="keyword">import</span> <span>javax.xml.namespace.QName; </span></li><li><span></span></li><li id="wmqeeuq" class="alt"><span id="wmqeeuq" class="keyword">import</span> <span>org.apache.axis.client.Call; </span></li><li><span id="wmqeeuq" class="keyword">import</span> <span>org.apache.axis.client.Service; </span></li><li id="wmqeeuq" class="alt"><span></span></li><li><span id="wmqeeuq" class="keyword">public</span> <span></span><span id="wmqeeuq" class="keyword">class</span> <span>Test { </span></li><li id="wmqeeuq" class="alt"><span></span></li><li><span></span><span id="wmqeeuq" class="keyword">public</span> <span></span><span id="wmqeeuq" class="keyword">static</span> <span></span><span id="wmqeeuq" class="keyword">void</span> <span>main(String[] args) </span><span id="wmqeeuq" class="keyword">throws</span> <span>Exception{ </span></li><li id="wmqeeuq" class="alt"><span>String targetEendPoint = </span><span id="wmqeeuq" class="string">"http://localhost:8080/axis/HelloAXIS.jws"</span> <span>; </span></li><li><span>Service service = </span><span id="wmqeeuq" class="keyword">new</span> <span>Service(); </span></li><li id="wmqeeuq" class="alt"><span>Call call = (Call) service.createCall(); </span></li><li><span>call.setOperationName(</span> <span id="wmqeeuq" class="keyword">new</span> <span>QName(targetEendPoint, </span><span id="wmqeeuq" class="string">"Hello"</span> <span>)); </span></li><li id="wmqeeuq" class="alt"><span>call.setTargetEndpointAddress(</span> <span id="wmqeeuq" class="keyword">new</span> <span>URL(targetEendPoint)); </span></li><li><span>String result = (String) call.invoke(</span> <span id="wmqeeuq" class="keyword">new</span> <span>Object[]{</span> <span id="wmqeeuq" class="string">"Robert"</span> <span>}); </span></li><li id="wmqeeuq" class="alt"><span>System.out.println(result); </span></li><li><span>} </span></li><li id="wmqeeuq" class="alt"><span>} </span></li></ol></div> <p>‹¹‹è¯•代码很简单,如果熟æ?zh¨¨n)‰java反射机制的朋友不用两分钟ž®Þpƒ½çœ‹æ˜Žç™½ã€‚运行后客户端控制台出现 AXIS say hello Robert。测试成功。果然很½Ž€å•吧。不˜q‡åœ¨˜q™ç®€å•背后却是以牺牲灉|´»æ€§äؓ代ä­h(hu¨¢n)的。假如你现在手里只有.class 或者一个jar包,jwsž®×ƒ¸å†èƒ½æ»¡èƒö你的需求了åQŒæœ€è¦å‘½çš„就是即时发布不支持带包的类åQŒè¿™ç‚¹AXIS的用æˆäh‰‹å†Œä¸Šå†™çš„也很明白ã€?/p> <p><span style="text-decoration: underline"><em><strong>Important:</strong> </em>JWS web services are intended for simple web services. You cannot use packages in the pages, and as the code is compiled at run time you can not find out about errors until after deployment. Production quality web services should use Java classes with custom deployment.</span> </p> <p> </p> <p><span style="font-size: small"><font size="2"><strong>2.定制发布 Custom Deployment - Introducing WSDD</strong> </font></span></p> <p><span style="font-size: x-small"><font size="1"><span style="font-size: x-small">比è“våÏx—¶å‘布定制发布更加烦琐也更复杂åQŒä½†æ˜¯æ¢æ¥çš„却是更大的灵‹zÀL€§ï¼Œå› æ­¤åœ¨å®žé™…项目中定制发布˜q˜æ˜¯ä¸äºŒçš„选择。定制发布需要你自己¾~–写一个WSDDåQˆWeb Service Deployment DescriptoråQ‰æ–‡ä»Óž¼Œ˜q™ä¸ªä¸œä¸œ¾cÖM¼¼ä¸ŽXML½EåŽä¼šåšå‡ÞZ»‹¾lã€‚废话不多说åQŒæˆ‘们来看代码:</span> </font></span></p> <p><font size="1"></font></p> <div id="wmqeeuq" class="code_title">java 代码</div> <div style="width: 99%; height: 336px" class="dp-highlighter"> <ol class="dp-j"><li id="wmqeeuq" class="alt"><span id="wmqeeuq" class="keyword">package</span> <span>com.chnic.webservice; </span></li><li><span></span></li><li id="wmqeeuq" class="alt"><span id="wmqeeuq" class="keyword">public</span> <span></span><span id="wmqeeuq" class="keyword">class</span> <span>HelloWorld { </span></li><li><span></span></li><li id="wmqeeuq" class="alt"><span></span><span id="wmqeeuq" class="keyword">public</span> <span>HelloWorld(){ </span></li><li><span></span></li><li id="wmqeeuq" class="alt"><span>} </span></li><li><span></span></li><li id="wmqeeuq" class="alt"><span></span><span id="wmqeeuq" class="keyword">public</span> <span>String hello(String str){ </span></li><li><span></span><span id="wmqeeuq" class="keyword">return</span> <span></span><span id="wmqeeuq" class="string">"Hello "</span> <span>+ str; </span></li><li id="wmqeeuq" class="alt"><span>} </span></li><li><span></span></li><li id="wmqeeuq" class="alt"><span></span><span id="wmqeeuq" class="keyword">public</span> <span></span><span id="wmqeeuq" class="keyword">int</span> <span>add(</span> <span id="wmqeeuq" class="keyword">int</span> <span>a, </span><span id="wmqeeuq" class="keyword">int</span> <span>b){ </span></li><li><span></span><span id="wmqeeuq" class="keyword">return</span> <span>a + b; </span></li><li id="wmqeeuq" class="alt"><span>} </span></li><li><span></span></li><li id="wmqeeuq" class="alt"><span>} </span></li></ol></div> <p>一个带包的很简单的¾c»ï¼Œåœ¨eclipse下编译后按照包名拷到 %TOMCAT_HOME%<span>\webapps\axis\WEB-INF\classes 目录下。以˜q™ä¸ª¾cÖMؓ例,拯‚´å®Œä¹‹åŽè¿™ä¸ªHelloWorld.classçš„èµ\径就æ˜?<span>%TOMCAT_HOME%\webapps\axis\WEB-INF\classes\com\chnic\webservice。PSåQ?如果嫌这样太éºÈƒ¦åQŒå¯ä»¥å¦å¤–徏一个Java Web工程用myeclipse的发布工具发布到Tomcat之后åQŒæ•´ä½“一‹Æ¡æ€§æ‹·è´åˆ°websericve的工½E‹ä¸­ã€?/span> </span></p> <p>接下来就需要编写发布文件deploy.wsdd。到<span>%TOMCAT_HOME%\webapps\axis\WEB-INF ç›®å½•ä¸‹å¾ç«‹è¿™ä¸ªæ–‡ä»¶åÆˆåœ¨å…¶ä¸­æ·»åŠ å¦‚ä¸‹å†…å®¹ï¼š</span> </p> <div id="wmqeeuq" class="code_title">xml 代码</div> <div id="wmqeeuq" class="dp-highlighter"> <ol class="dp-xml"><li id="wmqeeuq" class="alt"><span id="wmqeeuq" class="tag"><</span> <span id="wmqeeuq" class="tag-name">deployment</span> <span></span><span id="wmqeeuq" class="attribute">xmlns</span> <span>=</span> <span id="wmqeeuq" class="attribute-value"><a >http://xml.apache.org/axis/wsdd/</a> </span><span></span></li><li id="wmqeeuq" class="alt"><span id="wmqeeuq" class="attribute"><span style="color: #000000"></span>xmlns:java</span> <span>=</span> <span id="wmqeeuq" class="attribute-value">"http://xml.apache.org/axis/wsdd/providers/java"</span> <span id="wmqeeuq" class="tag">></span> <span></span></li><li><span></span></li><li id="wmqeeuq" class="alt"><span></span><span id="wmqeeuq" class="tag"><</span> <span id="wmqeeuq" class="tag-name">service</span> <span></span><span id="wmqeeuq" class="attribute">name</span> <span>=</span> <span id="wmqeeuq" class="attribute-value">"HelloWorld"</span> <span></span><span id="wmqeeuq" class="attribute">provider</span> <span>=</span> <span id="wmqeeuq" class="attribute-value">"java:RPC"</span> <span id="wmqeeuq" class="tag">></span> <span></span></li><li><span></span><span id="wmqeeuq" class="tag"><</span> <span id="wmqeeuq" class="tag-name">parameter</span> <span></span><span id="wmqeeuq" class="attribute">name</span> <span>=</span> <span id="wmqeeuq" class="attribute-value">"className"</span> <span></span><span id="wmqeeuq" class="attribute">value</span> <span>=</span> <span id="wmqeeuq" class="attribute-value">"com.chnic.webservice.HelloWorld"</span> <span id="wmqeeuq" class="tag">/></span> <span></span></li><li id="wmqeeuq" class="alt"><span></span><span id="wmqeeuq" class="tag"><</span> <span id="wmqeeuq" class="tag-name">parameter</span> <span></span><span id="wmqeeuq" class="attribute">name</span> <span>=</span> <span id="wmqeeuq" class="attribute-value">"allowedMethods"</span> <span></span><span id="wmqeeuq" class="attribute">value</span> <span>=</span> <span id="wmqeeuq" class="attribute-value">"*"</span> <span id="wmqeeuq" class="tag">/></span> <span></span></li><li><span id="wmqeeuq" class="tag"><<span id="wmqeeuq" class="tag">/</span> </span><span id="wmqeeuq" class="tag"><span id="wmqeeuq" class="tag-name">service</span> <span id="wmqeeuq" class="tag">></span> <span></span></span></li><li id="wmqeeuq" class="alt"><span id="wmqeeuq" class="tag"><span id="wmqeeuq" class="tag-name"><span id="wmqeeuq" class="tag"><<span id="wmqeeuq" class="tag">/</span> </span>deployment</span> <span id="wmqeeuq" class="tag">></span> <span></span></span></li></ol></div> <p>½Ž€å•的介绍下各个节点的含义åQ?HelloWorld"当然是这个webservice的名字,后面紧跟的javaåQšRPC指的是服务类型。这里一共有æœ?¿Uç±»åž‹ï¼Œåˆ†åˆ«æ˜¯ï¼šRPC, Document, Wrapped å’?Message。有兴趣可以看下 <span>org.apache.axis.providers˜q™ä¸ªåŒ…和子包下面的类的API文档。之后的parameter节点½W¬ä¸€ä¸ªå½“然是指出具体的类åQŒç¬¬äºŒä¸ªä»Žå­—面上也很好理解:允许调用的方法。这里的配置告诉引擎可以调用所有的publicæ–ÒŽ(gu¨©)³•åQŒå½“然你也可以自己指定ã€?/span> </p> <p>¾~–写完配¾|®å‘布文件之后,cmd打开windows的控制台åQŒè¿›å…?TOMCAT_HOME%<span>\webapps\axis\WEB-INF目录下键入如下命ä»?</span></p> <div id="wmqeeuq" class="dp-highlighter"> <ol class="dp-j"><li id="wmqeeuq" class="alt"><span>java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd </span></li></ol></div> <p>之后控制台返å›?span>Processing file deploy.wsdd å’?<span>Done processing ˜q™ä¸¤ŒDµè¯åŒ™¯´æ˜Žå‘布成功。(此时会在同çñ”目录生成一ä¸?span>server-config.wsddæ–‡äšg</span> åQ‰åœ¨˜q™é‡Œçš„AdminClient是AXIS提供的一个客æˆïL«¯½Ž¡ç†å·¥å…·ã€‚至于java.ext.dirs的含义可以去了解一下classloaderå’ŒJVM¾c»è£…载机制方面的知识åQŒåœ¨˜q™é‡Œž®×ƒ¸å¤šè§£é‡Šã€?˜q˜æœ‰ä¸€ç‚¹è¦æ³¨æ„çš„æ˜¯åœ¨å‘布的时候Tomcat服务必须处于启动状态,否则ž®×ƒ¼šæŠ›å‡ºä¸€å †æ— æ³•连接的异常信息。发布成功之后你可以通过讉K—® <span><a href="http://localhost:8080/axis/servlet/AxisServlet">http://localhost:8080/axis/servlet/AxisServlet</a> 来查看你所有的定制发布的服务ã€?/span> </span></span></p> <div id="wmqeeuq" class="code_title">客户端测试代ç ?/div> <div id="wmqeeuq" class="dp-highlighter"> <ol class="dp-j"><li id="wmqeeuq" class="alt"><span>String targetEendPoint = </span><span id="wmqeeuq" class="string">"http://localhost:8080/axis/services/HelloWorld"</span> <span>; </span></li><li><span>Service service = </span><span id="wmqeeuq" class="keyword">new</span> <span>Service(); </span></li><li id="wmqeeuq" class="alt"><span>Call call = (Call) service.createCall(); </span></li><li><span>call.setTargetEndpointAddress(</span> <span id="wmqeeuq" class="keyword">new</span> <span>URL(targetEendPoint)); </span></li><li id="wmqeeuq" class="alt"><span></span></li><li><span>call.setOperationName(</span> <span id="wmqeeuq" class="keyword">new</span> <span>QName(targetEendPoint, </span><span id="wmqeeuq" class="string">"hello"</span> <span>)); </span></li><li id="wmqeeuq" class="alt"><span>String result = (String) call.invoke(</span> <span id="wmqeeuq" class="keyword">new</span> <span>Object[]{</span> <span id="wmqeeuq" class="string">"Robert"</span> <span>}); </span></li><li><span>System.out.println(result); </span></li><li id="wmqeeuq" class="alt"><span></span></li><li><span>call.setOperationName(</span> <span id="wmqeeuq" class="keyword">new</span> <span>QName(targetEendPoint, </span><span id="wmqeeuq" class="string">"add"</span> <span>)); </span></li><li id="wmqeeuq" class="alt"><span>Integer res = (Integer) call.invoke(</span> <span id="wmqeeuq" class="keyword">new</span> <span>Object[]{</span> <span id="wmqeeuq" class="keyword">new</span> <span>Integer(</span> <span id="wmqeeuq" class="number">1</span> <span>), </span><span id="wmqeeuq" class="keyword">new</span> <span>Integer(</span> <span id="wmqeeuq" class="number">2</span> <span>)}); </span></li><li><span>System.out.println(</span> <span id="wmqeeuq" class="string">"The result is: "</span> <span>+ res); </span></li></ol></div> <p>˜qè¡Œ‹¹‹è¯•代码åQŒæŽ§åˆ¶å°æ˜„¡¤º <span>Hello Robert å’?The result is: 3 ˜q™ä¸¤å¥è¯åQŒè¯´æ˜Žå‘布成功。仔¾l†è§‚察下发现其实除了那个targetEndpoint 之外åQŒå³æ—¶å‘布和定制发布的客æˆïL«¯è°ƒç”¨ä»£ç åŸºæœ¬ä¸Šéƒ½æ˜¯ä¸€æ ïLš„。定制发布的URL可以在WSDLæ–‡äšg里找到ã€?</span>其实定制发布˜q˜æœ‰ä¸€äº›é«˜¾U§ç‰¹æ€§ï¼Œ˜q™ä¸ªž®Þq•™åˆîC¸‹ä¸€½‹‡å†è¯´å§ã€?span><br /></span></p><img src ="http://www.aygfsteel.com/baizhihui19870626/aggbug/380247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/baizhihui19870626/" target="_blank">ž®ç™½19870626</a> 2012-06-07 16:28 <a href="http://www.aygfsteel.com/baizhihui19870626/articles/380247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.lang.LinkageError: JAXB 2.0 API is being loaded from the bootstrap classloader, but this RI(xxx) needs 2.1 API http://www.aygfsteel.com/baizhihui19870626/articles/375258.htmlž®ç™½19870626ž®ç™½19870626Thu, 19 Apr 2012 05:50:00 GMThttp://www.aygfsteel.com/baizhihui19870626/articles/375258.htmlhttp://www.aygfsteel.com/baizhihui19870626/comments/375258.htmlhttp://www.aygfsteel.com/baizhihui19870626/articles/375258.html#Feedback0http://www.aygfsteel.com/baizhihui19870626/comments/commentRss/375258.htmlhttp://www.aygfsteel.com/baizhihui19870626/services/trackbacks/375258.html在ä‹É用webservice,mule esb½{‰éœ€è¦jaxb的项目里¾lå¸¸ä¼šå‡ºçŽ?JAXB 2.0 API is being loaded from the bootstrap classloader˜q™ä¸ªé”™è¯¯åQŒæŒ‰ç…§æ‰“出的信息Use the endorsed directory mechanism to place jaxb-api.jar in the bootstrap classloader. (See http://java.sun.com/j2se/1.5.0/docs/guide/standards/)åŽÕdšåQŒé€šå¸¸æ˜¯è§£å†³ä¸äº†é—®é¢˜çš„åQŒè¯¥å»ø™®®ä¿¡æ¯æœ‰ä¸¤ä¸ªé—®é¢˜å¯¼è‡´ä¸å¯è¡ŒåQ?/p>

1. 不是下蝲jaxb-api.jar 而是下蝲jaxb-api-2.1.jaræ–‡äšg

2.不是把下载的˜q™ä¸ªjaræ–‡äšg攑֜¨sun¾|‘ç«™¾l™å‡ºçš?lt;java-home>/lib/endorsed 下,而是要自å·Þp¯•验确定应该放在哪个目录下åQ?/p>

¼‹®å®šæ”‘Öœ¨å“ªä¸ªç›®å½•下的æ–ÒŽ(gu¨©)³•如下åQ?/p>

首先要看你的™å¹ç›®æ˜¯java™å¹ç›®˜q˜æ˜¯java web™å¹ç›®åQ?/p>

A, java™å¹ç›®ç›´æŽ¥æ‰“印System.out.println(System.getProperty("java.endorsed.dirs"));åÏx˜¯jaxb-api-2.1.jar应该攄¡š„目录ã€?/p>

B, java web ™å¹ç›®è¦ç”¨ä¸€ä¸ªå¯ä»¥æ­£å¸¸å¯åŠ¨çš„web™å¹ç›®(当然没用到jaxbçš„web™å¹ç›®)åQŒæ‰“印System.out.println(System.getProperty("java.endorsed.dirs"));卛_¯åQŒæˆ‘的是java web™å¹ç›®åQŒæ‰“出的是E:/tomcat6/common/endorsed

 

我把jaxb-api-2.1.jar攑ֈ°E:/tomcat6/common/endorsed下后问题解决ã€?/p>

注:没有common/endorsed目录的,自己创徏�/p>

]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ¿Ëʲ¿ËÌÚÆì| ÈýÃ÷ÊÐ| ½ÒÎ÷ÏØ| Ö£ÖÝÊÐ| ¾®ÚêÏØ| ͨ»¯ÏØ| ÕýÀ¶Æì| ÖÛÇúÏØ| ¾äÈÝÊÐ| À¶É½ÏØ| ÑôÎ÷ÏØ| Ïâ»ÆÆì| ³¤ÁëÏØ| ÌÀÔ­ÏØ| »´ÑôÏØ| ÐûÍþÊÐ| ÂÛ̳| ·¨¿âÏØ| ºÚºÓÊÐ| Óª¿ÚÊÐ| ¶¨ÏåÏØ| ½ÌÓý| ÃÉ×ÔÏØ| ¶¨°²ÏØ| ÓíÖÝÊÐ| ÎäÏçÏØ| ±ß°ÓÏØ| ×ÓÖÞÏØ| ÉñÄ¾ÏØ| Ðí²ýÏØ| Ó¡½­| Ë«°ØÏØ| ¸£½¨Ê¡| ¿¦À®Ç߯ì| ÉÂÎ÷Ê¡| ³üÖÝÊÐ| °²ÔÀÏØ| ¼ªÄ¾Èø¶ûÏØ| ÈÕÕÕÊÐ| °¢¿ËËÕÊÐ| ²©°®ÏØ|