﻿<?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-I love java-文章分类-webservice</title><link>http://www.blogjava.net/baizhihui19870626/category/51441.html</link><description>记录本</description><language>zh-cn</language><lastBuildDate>Tue, 19 Jun 2012 16:03:08 GMT</lastBuildDate><pubDate>Tue, 19 Jun 2012 16:03:08 GMT</pubDate><ttl>60</ttl><item><title>转-------------利用AXIS开发Webservice(三) —— 如何传递JavaBean和你的对象 （目的：学习）</title><link>http://www.blogjava.net/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.blogjava.net/baizhihui19870626/articles/380258.html</guid><wfw:comment>http://www.blogjava.net/baizhihui19870626/comments/380258.html</wfw:comment><comments>http://www.blogjava.net/baizhihui19870626/articles/380258.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baizhihui19870626/comments/commentRss/380258.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baizhihui19870626/services/trackbacks/380258.html</trackback:ping><description><![CDATA[<p>这几天貌似战斗力无穷，趁着有精力就多更新两篇。随着对Axis的研究加深，越感觉webservice是个很好玩的东西。这篇说一下如何传递一个JavaBean和你自己的一个special Object。</p>
<p>&nbsp;</p>
<p>在第一篇介绍Axis的文章里，我们做了一个简单的webservice，我们client side传递了String和int类型的数据给service object。Service处理之后返回处理结果给Client。对于大多数需求，那个demo显然已经足够应付了。但是如果client端需要传输一个对象给server，那么那个demo就显得力不从心了。Axis中提供了远程传输对象的方法，通过那些方法我们同样可以随心的传递自己的对象。</p>
<p>&nbsp;</p>
<p>我们先从传递一个JavaBean开始，首先编写一个JavaBean。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://chnic.iteye.com/blog/170552#"><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" 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 class="keyword">package</span><span> com.chnic.bean; </span></li><li><span></span></li><li><span></span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> OrderBean { </span></span></li><li><span></span><span class="keyword">private</span><span> String name; </span></span></li><li><span></span><span class="keyword">private</span><span> </span><span class="keyword">int</span><span> age; </span></span></li><li><span></span><span class="keyword">private</span><span> String[] items; </span></span></li><li><span></span><span class="keyword">private</span><span> </span><span class="keyword">int</span><span>[] price; </span></span></li><li><span></span><span class="keyword">private</span><span> </span><span class="keyword">boolean</span><span> checked; </span></span></li><li><span></span></li><li><span></span><span class="keyword">public</span><span> OrderBean() { </span></span></li><li><span>} </span></li><li><span></span><span class="keyword">public</span><span> </span><span class="keyword">int</span><span> getAge() { </span></span></li><li><span></span><span class="keyword">return</span><span> age; </span></span></li><li><span>} </span></li><li><span></span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setAge(</span><span class="keyword">int</span><span> age) { </span></span></li><li><span></span><span class="keyword">this</span><span>.age = age; </span></span></li><li><span>} </span></li><li><span></span><span class="keyword">public</span><span> </span><span class="keyword">boolean</span><span> isChecked() { </span></span></li><li><span></span><span class="keyword">return</span><span> checked; </span></span></li><li><span>} </span></li><li><span></span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setChecked(</span><span class="keyword">boolean</span><span> checked) { </span></span></li><li><span></span><span class="keyword">this</span><span>.checked = checked; </span></span></li><li><span>} </span></li><li><span></span><span class="keyword">public</span><span> String[] getItems() { </span></span></li><li><span></span><span class="keyword">return</span><span> items; </span></span></li><li><span>} </span></li><li><span></span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setItems(String[] items) { </span></span></li><li><span></span><span class="keyword">this</span><span>.items = items; </span></span></li><li><span>} </span></li><li><span></span><span class="keyword">public</span><span> String getName() { </span></span></li><li><span></span><span class="keyword">return</span><span> name; </span></span></li><li><span>} </span></li><li><span></span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setName(String name) { </span></span></li><li><span></span><span class="keyword">this</span><span>.name = name; </span></span></li><li><span>} </span></li><li><span></span><span class="keyword">public</span><span> </span><span class="keyword">int</span><span>[] getPrice() { </span></span></li><li><span></span><span class="keyword">return</span><span> price; </span></span></li><li><span>} </span></li><li><span></span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setPrice(</span><span class="keyword">int</span><span>[] price) { </span></span></li><li><span></span><span 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(三) &#8212;&#8212; 如何传递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>这个JavaBean的前4个属性都很清楚，要解释一下最后一个。因为这个JavaBean被传递到Service端处理之后要接着被传回，用来示例webservce传进和传出。这个变量用来区别传进和传出的差别。解释完我们来看下service</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://chnic.iteye.com/blog/170552#"><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" 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 class="keyword">package</span><span> com.chnic.webservice; </span></li><li><span></span></li><li><span></span><span class="keyword">import</span><span> com.chnic.bean.OrderBean; </span></span></li><li><span></span></li><li><span></span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> AnalyzeOrder { </span></span></li><li><span></span></li><li><span></span><span class="keyword">public</span><span> AnalyzeOrder(){ </span></span></li><li><span>} </span></li><li><span></span></li><li><span></span><span class="keyword">public</span><span> OrderBean process(OrderBean order){ </span></span></li><li><span>order.setChecked(</span><span class="keyword">true</span><span>); </span></span></li><li><span>System.out.println(</span><span class="string">"name: "</span><span> + order.getName() + </span><span class="string">" age: "</span><span> + order.getAge()); </span></span></li><li><span></span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span> i=</span><span class="number"><font color="#c00000">0</font></span><span>; i&lt;order.getItems().length; i++) </span></span></li><li><span>System.out.println(</span><span class="string">"Item "</span><span> + (i+</span><span class="number"><font color="#c00000">1</font></span><span>) + order.getItems()[i] + </span></span></li><li><span></span><span class="string">" and price is "</span><span> + order.getPrice()[i]); </span></span></li><li><span></span><span 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(三) &#8212;&#8212; 如何传递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&lt;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 class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" href="http://chnic.iteye.com/blog/170552#"><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" 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 class="tag">&lt;</span><span class="tag-name">deployment</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">xmlns</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"http://xml.apache.org/axis/wsdd/"</font></span><span> </span></span></li><li><span></span><span class="attribute"><font color="#ff0000">xmlns:java</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"http://xml.apache.org/axis/wsdd/providers/java"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span> </span></span></li><li><span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">service</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"CheckOrder"</font></span><span> </span><span class="attribute"><font color="#ff0000">provider</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"java:RPC"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">parameter</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"className"</font></span><span> </span><span class="attribute"><font color="#ff0000">value</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"com.chnic.webservice.AnalyzeOrder"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">parameter</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"allowedMethods"</font></span><span> </span><span class="attribute"><font color="#ff0000">value</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"process"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">beanMapping</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">qname</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"myNS:Order"</font></span><span> </span><span class="attribute"><font color="#ff0000">xmlns:myNS</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"urn:AnalyzeOrder"</font></span><span> </span></span></li><li><span></span><span class="attribute"><font color="#ff0000">languageSpecificType</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"java:com.chnic.bean.OrderBean"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">service</span><span class="tag">&gt;</span></font></strong><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">deployment</span><span class="tag">&gt;</span></font></strong><span> </span></span></li></ol></div><pre style="display: none" class="xml" title="利用AXIS开发Webservice(三) &#8212;&#8212; 如何传递JavaBean和你的对象" pre_index="2" source_url="http://chnic.iteye.com/blog/170552" codeable_type="Blog" codeable_id="170552" name="code">&lt;deployment xmlns="http://xml.apache.org/axis/wsdd/" 
	xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&gt;
	
    &lt;service name="CheckOrder" provider="java:RPC"&gt;
        &lt;parameter name="className" value="com.chnic.webservice.AnalyzeOrder"/&gt;
        &lt;parameter name="allowedMethods" value="process"/&gt;
        &lt;beanMapping qname="myNS:Order" xmlns:myNS="urn:AnalyzeOrder" 
        	languageSpecificType="java:com.chnic.bean.OrderBean"/&gt;
    &lt;/service&gt;
&lt;/deployment&gt;
</pre>
<p>唯一不同的就是多了&lt;beabMapping&gt;这个节点。qname 表示 XML 规范中定义的限定名称，他由名称空间 URI、本地部分和前缀组成。除了本地部分其他都不是必须的另外QName是不可变的。xmlns后面的myNS是必须的。具体根据前面所指定的qname来决定。之后可以随意命名一个namespace。最后的languageSpecificType指定的是你传递的对象类型。<strong>第一个属性的本地部分和第二个节点你自定义的命名空间会组成一个新的QName，并将你要传输的对象mapping是上去。<br /></strong></p>
<p><strong></strong></p>
<p>发布这个webservice，编写测试代码</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://chnic.iteye.com/blog/170552#"><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" 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 class="string">"http://localhost:8080/axis/services/CheckOrder"</span><span>; </span></li><li><span></span></li><li><span>OrderBean order = </span><span class="keyword">new</span><span> OrderBean(); </span></span></li><li><span>order.setName(</span><span class="string">"Beckham"</span><span>); </span></span></li><li><span>order.setAge(</span><span class="number"><font color="#c00000">32</font></span><span>); </span></span></li><li><span>String [] items = </span><span class="keyword">new</span><span> String[] { </span><span class="string">"Ipod"</span><span>, </span><span class="string">"ThinkPad"</span><span> }; </span></span></li><li><span></span><span class="keyword">int</span><span> [] price = </span><span class="keyword">new</span><span> </span><span class="keyword">int</span><span> [] { </span><span class="number"><font color="#c00000">999</font></span><span>, </span><span 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 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 class="keyword">new</span><span> Service(); </span></span></li><li><span>Call call = (Call) service.createCall(); </span></li><li><span>QName qn = </span><span class="keyword">new</span><span> QName(</span><span class="string">"urn:AnalyzeOrder"</span><span>, </span><span class="string">"Order"</span><span> ); </span></span></li><li><span>call.registerTypeMapping(OrderBean.</span><span class="keyword">class</span><span>, qn, </span></span></li><li><span></span><span class="keyword">new</span><span> org.apache.axis.encoding.ser.BeanSerializerFactory(OrderBean.</span><span class="keyword">class</span><span>, qn), </span></span></li><li><span></span><span class="keyword">new</span><span> org.apache.axis.encoding.ser.BeanDeserializerFactory(OrderBean.</span><span class="keyword">class</span><span>, qn)); </span></span></li><li><span></span></li><li><span>call.setTargetEndpointAddress( </span><span class="keyword">new</span><span> java.net.URL(targetEendPoint) ); </span></span></li><li><span>call.setOperationName( </span><span class="keyword">new</span><span> QName(</span><span class="string">"CheckOrder"</span><span>, </span><span class="string">"process"</span><span>) ); </span></span></li><li><span>call.addParameter( </span><span class="string">"arg1"</span><span>, qn, ParameterMode.IN ); </span></span></li><li><span>call.setReturnClass(OrderBean.</span><span class="keyword">class</span><span>); </span></span></li><li><span></span></li><li><span>OrderBean result = (OrderBean) call.invoke( </span><span class="keyword">new</span><span> Object[] {order} ); </span></span></li><li><span></span></li><li><span>System.out.println(</span><span 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(三) &#8212;&#8212; 如何传递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>从控制台输出一些信息以便测试，里面大多代码都应该见过。new QName和之后的registerTypeMapping方法也是在实现我上面那段黑体字的内容。之后注册完参数和返回值类型运行。</p>
<p>会发现在tomcat控制台和本地控制台都会输出测试结果，值得注意的是checked这个属性在传入之前是false属性，传入之后我们改变了他的属性变为true。返回之后在本地控制台打印出来也为true。</p>
<p>&nbsp;</p>
<p>事实上Axis除了可以传输JavaBean之外还可以传输一些自定义的类型。比如List、Map和时间日期类型。Axis也为他们提供了专门的SerializerFactory和DeserializerFactory。这些工厂类会产生串行化工具去序列化相应的对象。更多的Factory Object可以在org.apache.axis.encoding.ser下面找到。</p>
<p>&nbsp;</p>
<p>对于自定义序列化，Axis也提供了相对性的配置节点。具体配置如下：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" href="http://chnic.iteye.com/blog/170552#"><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" 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 class="tag">&lt;</span><span class="tag-name">typeMapping</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">qname</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"ns:local"</font></span><span> </span><span class="attribute"><font color="#ff0000">xmlns:ns</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"someNamespace"</font></span><span> </span></span></li><li><span></span><span class="attribute"><font color="#ff0000">languageSpecificType</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"java:my.java.thingy"</font></span><span> </span></span></li><li><span></span><span class="attribute"><font color="#ff0000">serializer</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"my.java.Serializer"</font></span><span> </span></span></li><li><span></span><span class="attribute"><font color="#ff0000">deserializer</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"my.java.DeserializerFactory"</font></span><span> </span></span></li><li><span></span><span class="attribute"><font color="#ff0000">encodingStyle</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"http://schemas.xmlsoap.org/soap/encoding/"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li></ol></div><pre style="display: none" class="xml" title="利用AXIS开发Webservice(三) &#8212;&#8212; 如何传递JavaBean和你的对象" pre_index="4" source_url="http://chnic.iteye.com/blog/170552" codeable_type="Blog" codeable_id="170552" name="code">&lt;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/"/&gt;</pre>
<p>typeMapping的前三个属性和上面讲的beanMapping都一样。不一样的是后三个。serializer指定的是串行化类，dserializer指定的是反串行化类。最后一个指定的编码方式。其实对于typeMapping来说beanMapping只不过是他的一个简化版而已。因为beanMapping的串行化和反串行化工厂类都是固定的，而编码方式也是固定的。</p>
<p>&nbsp;</p>
<p>因为typemapping和beanMapping很相似，在这里就不再写demo了。 有些人也许会问，既然能串行化对象那能不能&#8220;串行化&#8221;文件呢？这个问题留着下次再说吧。今天米动力了。<img title="confused" alt="confused" src="http://chnic.iteye.com/images/smiles/icon_confused.gif" /> </p><img src ="http://www.blogjava.net/baizhihui19870626/aggbug/380258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baizhihui19870626/" target="_blank">小白19870626</a> 2012-06-07 17:05 <a href="http://www.blogjava.net/baizhihui19870626/articles/380258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转---------利用AXIS开发Webservice(二) —— WSDD的一些高级特性 （学习）</title><link>http://www.blogjava.net/baizhihui19870626/articles/380252.html</link><dc:creator>小白19870626</dc:creator><author>小白19870626</author><pubDate>Thu, 07 Jun 2012 08:52:00 GMT</pubDate><guid>http://www.blogjava.net/baizhihui19870626/articles/380252.html</guid><wfw:comment>http://www.blogjava.net/baizhihui19870626/comments/380252.html</wfw:comment><comments>http://www.blogjava.net/baizhihui19870626/articles/380252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baizhihui19870626/comments/commentRss/380252.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baizhihui19870626/services/trackbacks/380252.html</trackback:ping><description><![CDATA[<p>时间过的真快，一不小心过了半年了，半年后我来更新第二篇webservice的博文。春困秋乏夏打盹，睡不醒的冬三月。最近又懒了。<img title="confused" alt="confused" src="http://chnic.iteye.com/images/smiles/icon_confused.gif" /> </p>
<p>&nbsp;</p>
<p>第一篇介绍了AXIS的两种发布方式，和一些基本的应用。这一篇说一下一些高级应用。 开篇之前先把上篇的一个遗漏补充上，上篇只讲了怎么发布一个webservice，但是如何取消没有却没有提。其实取消一个已经发布的webservce也是非常简单的，我们就拿上篇的HelloWorld来做例子吧。 </p>
<p>&nbsp;</p>
<p>发布webservice的时候我们有一个deploy.wsdd文件，当然在取消发布的时候就会有一个undeploy.wsdd文件。这个文件的内容也很简单，xml的代码如下。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" href="http://chnic.iteye.com/blog/169181#"><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" 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 class="tag">&lt;</span><span class="tag-name">undeployment</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">xmlns</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"http://xml.apache.org/axis/wsdd/"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">service</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"HelloWorld"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">undeployment</span><span class="tag">&gt;</span></font></strong><span> </span></span></li></ol></div><pre style="display: none" class="xml" title="利用AXIS开发Webservice(二) &#8212;&#8212; WSDD的一些高级特性 " pre_index="0" source_url="http://chnic.iteye.com/blog/169181" codeable_type="Blog" codeable_id="169181" name="code">&lt;undeployment xmlns="http://xml.apache.org/axis/wsdd/"&gt;
 &lt;service name="HelloWorld"/&gt;
&lt;/undeployment&gt;
</pre>
<p>编写完这个xml文件之后，把它同样copy到%TOMCAT_HOM<span>\webapps\axis\WEB-INF目录下，然后CMD打开控制台，在控制台输入一个我们很熟悉的命令</span> </p>
<p>java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient undeploy.wsdd</p>
<p>&nbsp;</p>
<p>运行之后得到如下结果说明取消发布成功 </p>
<p>Processing file undeploy.wsdd <br />&lt;Admin&gt;Done processing&lt;/Admin&gt;</p>
<p>&nbsp;</p>
<p>说完取消发布之后就来说一下AXIS的一些高级特性，AXIS在编写deploy.wsdd这个文件时，每个&lt;service&gt;节点下面会有这样一个子节点。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" href="http://chnic.iteye.com/blog/169181#"><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" 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 class="tag">&lt;</span><span class="tag-name">parameter</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"scope"</font></span><span> </span><span class="attribute"><font color="#ff0000">value</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"value"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li></ol></div><pre style="display: none" class="xml" title="利用AXIS开发Webservice(二) &#8212;&#8212; WSDD的一些高级特性 " pre_index="1" source_url="http://chnic.iteye.com/blog/169181" codeable_type="Blog" codeable_id="169181" name="code"> &lt;parameter name="scope" value="value"/&gt;</pre>
<p>这个节点配置着你的service object也就是你webservice服务的那个object的圣明周期，在后面的value里可以有三个选项request, session, or application。熟悉Jsp、Servlet、或者EJB里的SessionBean的朋友应该能很快能明白这个三个配置选项的含义。</p>
<p>&nbsp;</p>
<p><strong>requst</strong> ：这个选项会让AXIS为每一个SOAP的请求产生一个服务对象，可以想像如果这个webservice的对象足够复杂，而且SOAP的请求过多，这个选项是非常耗费服务器性能的。</p>
<p><strong>session</strong> ：如果选择了session，程序就会给每个调用这个webservice的客户端创造一个服务对象。</p>
<p><strong>application</strong> ：这个选项最彪悍，程序只会在内存里new出来一个服务对象，然后为所有webservice客户端服务。很显然这个选项不能储存客户端的一些个性化数据。所以在功能性上很多时候不能满足要求。</p>
<p>&nbsp;</p>
<p>接下来说一下Axis的Handler和Chain机制，Handler和Chain是Axis引擎提供的一个很强大的工具。假如现在客户有这样一个需求，需要记录某一个webservice被调用的次数，这个时候如果在service object里去实现这个功能不仅麻烦，而且侵入了原有的程序也会对增加原有程序的不稳定性。有了Handler我们就能见easy的解决这个问题。我们先来编写handler的代码。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://chnic.iteye.com/blog/169181#"><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" 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 class="keyword">package</span><span> com.chnic.handler; </span></li><li><span></span></li><li><span></span><span class="keyword">import</span><span> org.apache.axis.AxisFault; </span></span></li><li><span></span><span class="keyword">import</span><span> org.apache.axis.MessageContext; </span></span></li><li><span></span><span class="keyword">import</span><span> org.apache.axis.handlers.BasicHandler; </span></span></li><li><span></span></li><li><span></span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> HelloWorldHandler </span><span class="keyword">extends</span><span> BasicHandler{ </span></span></li><li><span></span></li><li><span></span><span class="keyword">private</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> </span><span class="keyword">long</span><span> serialVersionUID = 1L; </span></span></li><li><span></span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> invoke(MessageContext context) </span><span class="keyword">throws</span><span> AxisFault { </span></span></li><li><span>String status = (String) </span><span class="keyword">this</span><span>.getOption(</span><span class="string">"status"</span><span>); </span></span></li><li><span>System.out.println(</span><span class="string">"HelloWorldHandler's status is: "</span><span> + status); </span></span></li><li><span>} </span></li><li><span>} </span></li></ol></div><pre style="display: none" class="java" title="利用AXIS开发Webservice(二) &#8212;&#8212; WSDD的一些高级特性 " pre_index="2" source_url="http://chnic.iteye.com/blog/169181" codeable_type="Blog" codeable_id="169181" name="code">package com.chnic.handler;

import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;

public class HelloWorldHandler extends BasicHandler{

	private static final long serialVersionUID = 1L;
	public void invoke(MessageContext context) throws AxisFault {
		String status = (String) this.getOption("status");
		System.out.println("HelloWorldHandler's status is: " + status);
	}
} </pre>
<p>BasicHandler是一个抽象类，Axis提供了很多Handler的具体实现，BasicHandler只是其中最简单的一个。要实现一个自己的handler首先要从继承BasicHandler这个类开始并实现其中的invoke(MessageContext arg)这个方法。MessageContext可以看成是一个Axis的上下文，里面存储的是一些Axis和webservice的基本信息。想了解的朋友可以看一下Axis的API。编写完Handler代码之后我们连编写发布文件。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" href="http://chnic.iteye.com/blog/169181#"><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" 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 class="tag">&lt;</span><span class="tag-name">deployment</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">xmlns</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"http://xml.apache.org/axis/wsdd/"</font></span><span> </span></span></li><li><span></span><span class="attribute"><font color="#ff0000">xmlns:java</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"http://xml.apache.org/axis/wsdd/providers/java"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">handler</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"Hello"</font></span><span> </span><span class="attribute"><font color="#ff0000">type</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"java:com.chnic.handler.HelloWorldHandler"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">parameter</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"status"</font></span><span> </span><span class="attribute"><font color="#ff0000">value</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"success"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">handler</span><span class="tag">&gt;</span></font></strong><span> </span></span></li><li><span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">service</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"HelloWorld"</font></span><span> </span><span class="attribute"><font color="#ff0000">provider</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"java:RPC"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">requestFlow</span><span class="tag">&gt;</span></font></strong><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">handler</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">type</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"Hello"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">requestFlow</span><span class="tag">&gt;</span></font></strong><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">parameter</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"className"</font></span><span> </span><span class="attribute"><font color="#ff0000">value</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"com.chnic.webservice.HelloWorld"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">parameter</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"allowedMethods"</font></span><span> </span><span class="attribute"><font color="#ff0000">value</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"*"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">parameter</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"scope"</font></span><span> </span><span class="attribute"><font color="#ff0000">value</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"session"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">service</span><span class="tag">&gt;</span></font></strong><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">deployment</span><span class="tag">&gt;</span></font></strong><span> </span></span></li></ol></div><pre style="display: none" class="xml" title="利用AXIS开发Webservice(二) &#8212;&#8212; WSDD的一些高级特性 " pre_index="3" source_url="http://chnic.iteye.com/blog/169181" codeable_type="Blog" codeable_id="169181" name="code">&lt;deployment xmlns="http://xml.apache.org/axis/wsdd/" 
	xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&gt;
	&lt;handler name="Hello" type="java:com.chnic.handler.HelloWorldHandler"&gt;
  	   &lt;parameter name="status" value="success"/&gt;
	&lt;/handler&gt;

 	&lt;service name="HelloWorld" provider="java:RPC"&gt;
	 &lt;requestFlow&gt;
	   &lt;handler type="Hello"/&gt;
	 &lt;/requestFlow&gt;
 		&lt;parameter name="className" value="com.chnic.webservice.HelloWorld"/&gt;
 		&lt;parameter name="allowedMethods" value="*"/&gt;
 		&lt;parameter name="scope" value="session"/&gt;
 	&lt;/service&gt;
&lt;/deployment&gt;
</pre>
<p>发布代码中有这样的一句，细心的朋友一定会发现。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" href="http://chnic.iteye.com/blog/169181#"><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" 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 class="tag">&lt;</span><span class="tag-name">parameter</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"status"</font></span><span> </span><span class="attribute"><font color="#ff0000">value</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"success"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li></ol></div><pre style="display: none" class="xml" title="利用AXIS开发Webservice(二) &#8212;&#8212; WSDD的一些高级特性 " pre_index="4" source_url="http://chnic.iteye.com/blog/169181" codeable_type="Blog" codeable_id="169181" name="code">&lt;parameter name="status" value="success"/&gt;</pre>
<p>看完这句代码再对比一下Handler的实现代码中的一句，相信大多数人都能明白了。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://chnic.iteye.com/blog/169181#"><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" 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 status = (String) </span><span class="keyword">this</span><span>.getOption(</span><span class="string">"status"</span><span>); </span></li></ol></div><pre style="display: none" class="java" title="利用AXIS开发Webservice(二) &#8212;&#8212; WSDD的一些高级特性 " pre_index="5" source_url="http://chnic.iteye.com/blog/169181" codeable_type="Blog" codeable_id="169181" name="code">String status = (String) this.getOption("status");</pre>
<p>Handler通过getOption(String)这个方法拿到了配置文件中我配置的属性值。而我们上述所做的所有工作对于原来的Webserivce来说都是透明的，不会对侵入原有的程序当中。 一个Handler可以被多个service所使用通过&lt;requestFlow&gt;这个标签来引用到某一个service中，这里还要多提一句既然是一个requestFlow，这个当然可以加不只一个的Handler。接下来编写测试代码运行。在本地应用服务器上会打出如下语句：HelloWorldHandler's status is: success </p>
<p>说明测试成功，而且handler是配置在requestflow标签中所以这段代码会在service代码之前先执行。</p>
<p>&nbsp;</p>
<p>介绍完了Handler再来介绍Chain。从Chain的字面意思就能猜到他实现的一连串Handler的功能。假如某个service需要不止一个Handler，或者要根据Client的情况来选择需要那些Handler。特别是后一个需求，我们无法用一个或者几个Handler来解决，这个时候我们就需要&lt;Chain&gt;来实现了。我们先再编写一个Handler，加上之前的那个Handler我们来组成一条锁链。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://chnic.iteye.com/blog/169181#"><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" 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 class="keyword">package</span><span> com.chnic.handler; </span></li><li><span></span></li><li><span></span><span class="keyword">import</span><span> org.apache.axis.AxisFault; </span></span></li><li><span></span><span class="keyword">import</span><span> org.apache.axis.MessageContext; </span></span></li><li><span></span><span class="keyword">import</span><span> org.apache.axis.handlers.BasicHandler; </span></span></li><li><span></span></li><li><span></span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> MyHandler </span><span class="keyword">extends</span><span> BasicHandler { </span></span></li><li><span></span></li><li><span></span><span class="keyword">private</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> </span><span class="keyword">long</span><span> serialVersionUID = 1L; </span></span></li><li><span></span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> invoke(MessageContext context) </span><span class="keyword">throws</span><span> AxisFault { </span></span></li><li><span>System.out.println(</span><span class="string">"This is MyHandler.."</span><span>); </span></span></li><li><span>} </span></li><li><span>} </span></li></ol></div><pre style="display: none" class="java" title="利用AXIS开发Webservice(二) &#8212;&#8212; WSDD的一些高级特性 " pre_index="6" source_url="http://chnic.iteye.com/blog/169181" codeable_type="Blog" codeable_id="169181" name="code">package com.chnic.handler;

import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;

public class MyHandler extends BasicHandler {

	private static final long serialVersionUID = 1L;
	public void invoke(MessageContext context) throws AxisFault {
		System.out.println("This is MyHandler..");
	}
}
</pre>
<p>之后我们编写Chain的代码</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://chnic.iteye.com/blog/169181#"><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" 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 class="keyword">package</span><span> com.chnic.chain; </span></li><li><span></span></li><li><span></span><span class="keyword">import</span><span> org.apache.axis.SimpleChain; </span></span></li><li><span></span><span class="keyword">import</span><span> com.chnic.handler.HelloWorldHandler; </span></span></li><li><span></span><span class="keyword">import</span><span> com.chnic.handler.MyHandler; </span></span></li><li><span></span></li><li><span></span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> HelloWorldChain </span><span class="keyword">extends</span><span> SimpleChain { </span></span></li><li><span></span></li><li><span></span><span class="keyword">private</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> </span><span class="keyword">long</span><span> serialVersionUID = 1L; </span></span></li><li><span></span><span class="keyword">public</span><span> HelloWorldChain(){ </span></span></li><li><span>HelloWorldHandler hwh = </span><span class="keyword">new</span><span> HelloWorldHandler(); </span></span></li><li><span>MyHandler mh = </span><span class="keyword">new</span><span> MyHandler(); </span></span></li><li><span></span><span class="keyword">this</span><span>.addHandler(hwh); </span></span></li><li><span></span><span class="keyword">this</span><span>.addHandler(mh); </span></span></li><li><span>} </span></li><li><span>} </span></li></ol></div><pre style="display: none" class="java" title="利用AXIS开发Webservice(二) &#8212;&#8212; WSDD的一些高级特性 " pre_index="7" source_url="http://chnic.iteye.com/blog/169181" codeable_type="Blog" codeable_id="169181" name="code">package com.chnic.chain;

import org.apache.axis.SimpleChain;
import com.chnic.handler.HelloWorldHandler;
import com.chnic.handler.MyHandler;

public class HelloWorldChain extends SimpleChain {

	private static final long serialVersionUID = 1L;
	public HelloWorldChain(){
		HelloWorldHandler hwh = new HelloWorldHandler();
		MyHandler mh = new MyHandler();
		this.addHandler(hwh);
		this.addHandler(mh);
	}
}</pre>
<p>在Chain的构造函数中，把我要的两个Handler用addHandler()方法加载进去。之后我们来编写发布文件。&lt;chain&gt;和&lt;handler&gt;元素有些许不同在这里有必要多句嘴。</p>
<p>&lt;chain&gt;元素中的子元素只允许是&lt;handler&gt;或者&lt;chain&gt;。后者也就是允许在&#8220;锁链&#8221;里再嵌套&#8220;锁链&#8221;，在这里就拿嵌套&lt;handler&gt;来举例，他同样有两种方式来实现。第一种是直接包含&lt;handler&gt;:</p>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" href="http://chnic.iteye.com/blog/169181#"><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" 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 class="tag">&lt;</span><span class="tag-name">chain</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"myChain"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">handler</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">type</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"java:com.chnic.handler.MyHandler"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">chain</span><span class="tag">&gt;</span></font></strong><span> </span></span></li></ol></div><pre style="display: none" class="xml" title="利用AXIS开发Webservice(二) &#8212;&#8212; WSDD的一些高级特性 " pre_index="8" source_url="http://chnic.iteye.com/blog/169181" codeable_type="Blog" codeable_id="169181" name="code">&lt;chain name="myChain"&gt;
  	&lt;handler type="java:com.chnic.handler.MyHandler"/&gt;
&lt;/chain&gt;</pre>
<p>第二种是引用别的&lt;handler&gt;</p>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" href="http://chnic.iteye.com/blog/169181#"><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" 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 class="tag">&lt;</span><span class="tag-name">handler</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"myHandler"</font></span><span> </span><span class="attribute"><font color="#ff0000">type</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"java:com.chnic.handler.MyHandler"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">chain</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"myChain"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">handler</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">type</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"myHandler"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">chain</span><span class="tag">&gt;</span></font></strong><span> </span></span></li></ol></div><pre style="display: none" class="xml" title="利用AXIS开发Webservice(二) &#8212;&#8212; WSDD的一些高级特性 " pre_index="9" source_url="http://chnic.iteye.com/blog/169181" codeable_type="Blog" codeable_id="169181" name="code">&lt;handler name="myHandler" type="java:com.chnic.handler.MyHandler"/&gt;
&lt;chain name="myChain"/&gt;
   &lt;handler type="myHandler"/&gt;
&lt;/chain&gt;</pre>
<p>因为我们这里的Handler并没有由BasicHandler来实现，而是由继承SimpleChain这个类来实现，严格意义上讲，SimpleChain也可以算是一个Handler，因为SimpleChain也是从BasicHandler继承而来，他同样实现了invoke()这个方法。下面回归正题，来看我们的发布代码。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" href="http://chnic.iteye.com/blog/169181#"><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" 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 class="tag">&lt;</span><span class="tag-name">deployment</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">xmlns</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"http://xml.apache.org/axis/wsdd/"</font></span><span> </span></span></li><li><span></span><span class="attribute"><font color="#ff0000">xmlns:java</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"http://xml.apache.org/axis/wsdd/providers/java"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span> </span></span></li><li><span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">chain</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"myChain"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">handler</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">type</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"java:com.chnic.chain.HelloWorldChain"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">chain</span><span class="tag">&gt;</span></font></strong><span> </span></span></li><li><span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">service</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"HelloWorld"</font></span><span> </span><span class="attribute"><font color="#ff0000">provider</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"java:RPC"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">requestFlow</span><span class="tag">&gt;</span></font></strong><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">chain</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">type</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"myChain"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">requestFlow</span><span class="tag">&gt;</span></font></strong><span> </span></span></li><li><span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">parameter</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"className"</font></span><span> </span><span class="attribute"><font color="#ff0000">value</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"com.chnic.webservice.HelloWorld"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">parameter</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"allowedMethods"</font></span><span> </span><span class="attribute"><font color="#ff0000">value</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"*"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">parameter</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"scope"</font></span><span> </span><span class="attribute"><font color="#ff0000">value</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"session"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">service</span><span class="tag">&gt;</span></font></strong><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">deployment</span><span class="tag">&gt;</span></font></strong><span> </span></span></li></ol></div><pre style="display: none" class="xml" title="利用AXIS开发Webservice(二) &#8212;&#8212; WSDD的一些高级特性 " pre_index="10" source_url="http://chnic.iteye.com/blog/169181" codeable_type="Blog" codeable_id="169181" name="code">&lt;deployment xmlns="http://xml.apache.org/axis/wsdd/" 
	xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&gt;
 	
	&lt;chain name="myChain"&gt;
  		&lt;handler type="java:com.chnic.chain.HelloWorldChain"/&gt;
	&lt;/chain&gt;
	
 	&lt;service name="HelloWorld" provider="java:RPC"&gt;
	 &lt;requestFlow&gt;
	   &lt;chain type="myChain"/&gt;
	 &lt;/requestFlow&gt;

 		&lt;parameter name="className" value="com.chnic.webservice.HelloWorld"/&gt;
 		&lt;parameter name="allowedMethods" value="*"/&gt;
 		&lt;parameter name="scope" value="session"/&gt;
 	&lt;/service&gt;	
&lt;/deployment&gt;</pre>
<p>从新发布webservice之后，运行我们的测试代码。会发现在应用服务器的本地控制台上打出两句Handler要输出的语句，说明测试成功。而且控制台打出语句的顺序是和我们加载handler的顺序一样的。</p>
<p>&nbsp;</p>
<p>除了&lt;requestFlow&gt;之外，Axis还提供了与之相应的&lt;/responseFlow&gt;，用法和是requestflow一样的，所不同的是一个在service执行之前一个是之后。可以加下面代码到发布文件中的&lt;service&gt;元素下就可以实现responseflow的功能</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" href="http://chnic.iteye.com/blog/169181#"><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" 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 class="tag">&lt;</span><span class="tag-name">responseFlow</span><span class="tag">&gt;</span></font></strong><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">handler</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">type</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"HelloWorldHandler"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">responseFlow</span><span class="tag">&gt;</span></font></strong><span> </span></span></li></ol></div><pre style="display: none" class="xml" title="利用AXIS开发Webservice(二) &#8212;&#8212; WSDD的一些高级特性 " pre_index="11" source_url="http://chnic.iteye.com/blog/169181" codeable_type="Blog" codeable_id="169181" name="code">&lt;responseFlow&gt;
 	&lt;handler type="HelloWorldHandler"/&gt;
 &lt;/responseFlow&gt;</pre>
<p>&nbsp;</p>
<p>最后简单提一下远程管理，也就是Remote Administration。要实现远程管理在发布文件的&lt;service&gt;标签下加入下面一段语句就可以了。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" href="http://chnic.iteye.com/blog/169181#"><img alt="复制代码" src="http://chnic.iteye.com/images/icon_copy.gif" /></a> <a title="收藏这段代码" 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 class="tag">&lt;</span><span class="tag-name">parameter</span></font></strong><span> </span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"enableRemoteAdmin"</font></span><span> </span><span class="attribute"><font color="#ff0000">value</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"true"</font></span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span> </span></span></li></ol></div><pre style="display: none" class="xml" title="利用AXIS开发Webservice(二) &#8212;&#8212; WSDD的一些高级特性 " pre_index="12" source_url="http://chnic.iteye.com/blog/169181" codeable_type="Blog" codeable_id="169181" name="code">&lt;parameter name="enableRemoteAdmin" value="true"/&gt;</pre>
<p>不过远程管理会有安全方面的问题，所以不建议使用。</p>
<p>&nbsp;</p>
<p>一些高级部分就先说到这里，还有一些比如RPC docuement Wrapped Message的区别和使，如何传递一个Javabean，还有一些配置方面的的问题就留到下节说吧。</p><img src ="http://www.blogjava.net/baizhihui19870626/aggbug/380252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baizhihui19870626/" target="_blank">小白19870626</a> 2012-06-07 16:52 <a href="http://www.blogjava.net/baizhihui19870626/articles/380252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转---------利用AXIS开发Webservice(一) —— 如何发布自己的webservice  （目的：学习）</title><link>http://www.blogjava.net/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.blogjava.net/baizhihui19870626/articles/380247.html</guid><wfw:comment>http://www.blogjava.net/baizhihui19870626/comments/380247.html</wfw:comment><comments>http://www.blogjava.net/baizhihui19870626/articles/380247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baizhihui19870626/comments/commentRss/380247.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baizhihui19870626/services/trackbacks/380247.html</trackback:ping><description><![CDATA[&nbsp;因为工作关系需要从事Webservice的开发工作，公司的webserivce是由Apache的AXIS来实现的，以前对这个了解不算多，不过经过几天的研究，特奉上小小的心得一篇。 
<p>先介绍下本人开发环境吧。 JDK 1.4.2 + Myeclipse 6.0（实在经不起诱惑，尝尝鲜） + Tomcat 5.0.28 + AXIS 1.4。 AXIS 1.4包可以在<span style="color: #606420"><a href="http://ws.apache.org/axis/">http://ws.apache.org/axis/</a> </span>找到。 假设所有的环境你已经搭好，并且AXIS包也已经下好了。OK， Here we go~</p>
<p>解压axis-bin-1_4.zip这个包可以看到webapps目录，双击进入把里面的AXIS文件夹拷到 %TOMCAT_HOME%\webapps目录下，之后拷贝activation.jar、mail.jar、tools.jar到%TOMCAT_HOME%\webapps\axis\WEB-INF\lib目录下。启动tomcat，访问<a href="http://localhost:8080/axis/happyaxis.jsp">http://localhost:8080/axis/happyaxis.jsp</a> 如果访问成功，恭喜你！基本的配置你已经做完了。 </p>
<p>PS：此处的%TOMCAT_HOME%指的是Tomcat的安装目录，至于那另外的三个jar包，J2EE 1.4库里就能找的到。</p>
<p>现在来说一下最关键的Webservice的发布。AXIS提供了两种发布方式，一种是即时发布（Instant Deployment），另外一种是定制发布（Custom Deployment）。即时发布提供了一种非常简单的webservice的发布方式，但是其中限制太多，因此在实际的开发中定制发布才是首选。这里也将会以定制发布为重点来介绍。 </p>
<p style="margin-right: 0px"><strong><span style="font-size: small"><font size="2">1.即时发布 JWS (Java Web Service) Files - Instant Deployment</font></span> </strong></p>
<p>即时发布提供了一种非常简单发布方式，发布者只要有Java源代码（也就是.java文件），然后把其后缀名改成jws（也就是 java web service的缩写）拷贝到%TOMCAT_HOME%\webapps\axis目录下即完成了所有的发布工作。AXIS的编译引擎会处理接下来的所有事情。下面是一段示例代码：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<ol class="dp-j"><li class="alt"><span class="keyword">public</span> <span></span><span class="keyword">class</span> <span>HelloAXIS { </span></li><li><span></span></li><li class="alt"><span></span><span class="keyword">public</span> <span>String Hello(String name){ </span></li><li><span></span><span class="keyword">return</span> <span></span><span class="string">"AXIS say hello to "</span> <span>+ name; </span></li><li class="alt"><span>} </span></li><li><span>} </span></li></ol></div>
<p>把 HelloAXIS.java 文件改成 HelloAXIS.jws 然后拷贝到%TOMCAT_HOME%\webapps\axis目录下，启动Tomcat之后访问 <a href="http://localhost:8080/axis/HelloAXIS.jws">http://localhost:8080/axis/HelloAXIS.jws</a> 如果能看到 Click to see the WSDL这个超链接就说明已经发布成功了，点击进去就可以看到这个Webservice的WSDL描述文件。server端的发布已经完成了，接下来就是编写Client端测试代码了。</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<ol class="dp-j"><li class="alt"><span class="keyword">package</span> <span>com.chnic.test; </span></li><li><span></span></li><li class="alt"><span class="keyword">import</span> <span>java.net.URL; </span></li><li><span></span></li><li class="alt"><span class="keyword">import</span> <span>javax.xml.namespace.QName; </span></li><li><span></span></li><li class="alt"><span class="keyword">import</span> <span>org.apache.axis.client.Call; </span></li><li><span class="keyword">import</span> <span>org.apache.axis.client.Service; </span></li><li class="alt"><span></span></li><li><span class="keyword">public</span> <span></span><span class="keyword">class</span> <span>Test { </span></li><li class="alt"><span></span></li><li><span></span><span class="keyword">public</span> <span></span><span class="keyword">static</span> <span></span><span class="keyword">void</span> <span>main(String[] args) </span><span class="keyword">throws</span> <span>Exception{ </span></li><li class="alt"><span>String targetEendPoint = </span><span class="string">"http://localhost:8080/axis/HelloAXIS.jws"</span> <span>; </span></li><li><span>Service service = </span><span class="keyword">new</span> <span>Service(); </span></li><li class="alt"><span>Call call = (Call) service.createCall(); </span></li><li><span>call.setOperationName(</span> <span class="keyword">new</span> <span>QName(targetEendPoint, </span><span class="string">"Hello"</span> <span>)); </span></li><li class="alt"><span>call.setTargetEndpointAddress(</span> <span class="keyword">new</span> <span>URL(targetEendPoint)); </span></li><li><span>String result = (String) call.invoke(</span> <span class="keyword">new</span> <span>Object[]{</span> <span class="string">"Robert"</span> <span>}); </span></li><li class="alt"><span>System.out.println(result); </span></li><li><span>} </span></li><li class="alt"><span>} </span></li></ol></div>
<p>测试代码很简单，如果熟悉java反射机制的朋友不用两分钟就能看明白。运行后客户端控制台出现 AXIS say hello Robert。测试成功。果然很简单吧。不过在这简单背后却是以牺牲灵活性为代价的。假如你现在手里只有.class 或者一个jar包，jws就不再能满足你的需求了，最要命的就是即时发布不支持带包的类，这点AXIS的用户手册上写的也很明白。</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>&nbsp;</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">比起即时发布定制发布更加烦琐也更复杂，但是换来的却是更大的灵活性，因此在实际项目中定制发布还是不二的选择。定制发布需要你自己编写一个WSDD（Web Service Deployment Descriptor）文件，这个东东类似与XML稍后会做出介绍。废话不多说，我们来看代码：</span> </font></span></p>
<p><font size="1"></font></p>
<div class="code_title">java 代码</div>
<div style="width: 99%; height: 336px" class="dp-highlighter">
<ol class="dp-j"><li class="alt"><span class="keyword">package</span> <span>com.chnic.webservice; </span></li><li><span></span></li><li class="alt"><span class="keyword">public</span> <span></span><span class="keyword">class</span> <span>HelloWorld { </span></li><li><span></span></li><li class="alt"><span></span><span class="keyword">public</span> <span>HelloWorld(){ </span></li><li><span></span></li><li class="alt"><span>} </span></li><li><span></span></li><li class="alt"><span></span><span class="keyword">public</span> <span>String hello(String str){ </span></li><li><span></span><span class="keyword">return</span> <span></span><span class="string">"Hello "</span> <span>+ str; </span></li><li class="alt"><span>} </span></li><li><span></span></li><li class="alt"><span></span><span class="keyword">public</span> <span></span><span class="keyword">int</span> <span>add(</span> <span class="keyword">int</span> <span>a, </span><span class="keyword">int</span> <span>b){ </span></li><li><span></span><span class="keyword">return</span> <span>a + b; </span></li><li class="alt"><span>} </span></li><li><span></span></li><li class="alt"><span>} </span></li></ol></div>
<p>一个带包的很简单的类，在eclipse下编译后按照包名拷到 %TOMCAT_HOME%<span>\webapps\axis\WEB-INF\classes 目录下。以这个类为例，拷贝完之后这个HelloWorld.class的路径就是 <span>%TOMCAT_HOME%\webapps\axis\WEB-INF\classes\com\chnic\webservice。PS： 如果嫌这样太麻烦，可以另外建一个Java Web工程用myeclipse的发布工具发布到Tomcat之后，整体一次性拷贝到websericve的工程中。</span> </span></p>
<p>接下来就需要编写发布文件deploy.wsdd。到<span>%TOMCAT_HOME%\webapps\axis\WEB-INF 目录下建立这个文件并在其中添加如下内容：</span> </p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<ol class="dp-xml"><li class="alt"><span class="tag">&lt;</span> <span class="tag-name">deployment</span> <span></span><span class="attribute">xmlns</span> <span>=</span> <span class="attribute-value"><a href="http://xml.apache.org/axis/wsdd/">http://xml.apache.org/axis/wsdd/</a> </span><span></span></li><li class="alt"><span class="attribute"><span style="color: #000000"></span>xmlns:java</span> <span>=</span> <span class="attribute-value">"http://xml.apache.org/axis/wsdd/providers/java"</span> <span class="tag">&gt;</span> <span></span></li><li><span></span></li><li class="alt"><span></span><span class="tag">&lt;</span> <span class="tag-name">service</span> <span></span><span class="attribute">name</span> <span>=</span> <span class="attribute-value">"HelloWorld"</span> <span></span><span class="attribute">provider</span> <span>=</span> <span class="attribute-value">"java:RPC"</span> <span class="tag">&gt;</span> <span></span></li><li><span></span><span class="tag">&lt;</span> <span class="tag-name">parameter</span> <span></span><span class="attribute">name</span> <span>=</span> <span class="attribute-value">"className"</span> <span></span><span class="attribute">value</span> <span>=</span> <span class="attribute-value">"com.chnic.webservice.HelloWorld"</span> <span class="tag">/&gt;</span> <span></span></li><li class="alt"><span></span><span class="tag">&lt;</span> <span class="tag-name">parameter</span> <span></span><span class="attribute">name</span> <span>=</span> <span class="attribute-value">"allowedMethods"</span> <span></span><span class="attribute">value</span> <span>=</span> <span class="attribute-value">"*"</span> <span class="tag">/&gt;</span> <span></span></li><li><span class="tag">&lt;<span class="tag">/</span> </span><span class="tag"><span class="tag-name">service</span> <span class="tag">&gt;</span> <span></span></span></li><li class="alt"><span class="tag"><span class="tag-name"><span class="tag">&lt;<span class="tag">/</span> </span>deployment</span> <span class="tag">&gt;</span> <span></span></span></li></ol></div>
<p>简单的介绍下各个节点的含义，"HelloWorld"当然是这个webservice的名字，后面紧跟的java：RPC指的是服务类型。这里一共有有4种类型，分别是：RPC, Document, Wrapped 和 Message。有兴趣可以看下 <span>org.apache.axis.providers这个包和子包下面的类的API文档。之后的parameter节点第一个当然是指出具体的类，第二个从字面上也很好理解：允许调用的方法。这里的配置告诉引擎可以调用所有的public方法，当然你也可以自己指定。</span> </p>
<p>编写完配置发布文件之后，cmd打开windows的控制台，进入%TOMCAT_HOME%<span>\webapps\axis\WEB-INF目录下键入如下命令 </span></p>
<div class="dp-highlighter">
<ol class="dp-j"><li 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 这两段话即说明发布成功。（此时会在同级目录生成一个<span>server-config.wsdd文件</span> ）在这里的AdminClient是AXIS提供的一个客户端管理工具。至于java.ext.dirs的含义可以去了解一下classloader和JVM类装载机制方面的知识，在这里就不多解释。 还有一点要注意的是在发布的时候Tomcat服务必须处于启动状态，否则就会抛出一堆无法连接的异常信息。发布成功之后你可以通过访问 <span><a href="http://localhost:8080/axis/servlet/AxisServlet">http://localhost:8080/axis/servlet/AxisServlet</a> 来查看你所有的定制发布的服务。</span> </span></span></p>
<div class="code_title">客户端测试代码</div>
<div class="dp-highlighter">
<ol class="dp-j"><li class="alt"><span>String targetEendPoint = </span><span class="string">"http://localhost:8080/axis/services/HelloWorld"</span> <span>; </span></li><li><span>Service service = </span><span class="keyword">new</span> <span>Service(); </span></li><li class="alt"><span>Call call = (Call) service.createCall(); </span></li><li><span>call.setTargetEndpointAddress(</span> <span class="keyword">new</span> <span>URL(targetEendPoint)); </span></li><li class="alt"><span></span></li><li><span>call.setOperationName(</span> <span class="keyword">new</span> <span>QName(targetEendPoint, </span><span class="string">"hello"</span> <span>)); </span></li><li class="alt"><span>String result = (String) call.invoke(</span> <span class="keyword">new</span> <span>Object[]{</span> <span class="string">"Robert"</span> <span>}); </span></li><li><span>System.out.println(result); </span></li><li class="alt"><span></span></li><li><span>call.setOperationName(</span> <span class="keyword">new</span> <span>QName(targetEendPoint, </span><span class="string">"add"</span> <span>)); </span></li><li class="alt"><span>Integer res = (Integer) call.invoke(</span> <span class="keyword">new</span> <span>Object[]{</span> <span class="keyword">new</span> <span>Integer(</span> <span class="number">1</span> <span>), </span><span class="keyword">new</span> <span>Integer(</span> <span class="number">2</span> <span>)}); </span></li><li><span>System.out.println(</span> <span class="string">"The result is: "</span> <span>+ res); </span></li></ol></div>
<p>运行测试代码，控制台显示 <span>Hello Robert 和 The result is: 3 这两句话，说明发布成功。仔细观察下发现其实除了那个targetEndpoint 之外，即时发布和定制发布的客户端调用代码基本上都是一样的。定制发布的URL可以在WSDL文件里找到。 </span>其实定制发布还有一些高级特性，这个就留到下一篇再说吧。<span><br /></span></p><img src ="http://www.blogjava.net/baizhihui19870626/aggbug/380247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baizhihui19870626/" target="_blank">小白19870626</a> 2012-06-07 16:28 <a href="http://www.blogjava.net/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 </title><link>http://www.blogjava.net/baizhihui19870626/articles/375258.html</link><dc:creator>小白19870626</dc:creator><author>小白19870626</author><pubDate>Thu, 19 Apr 2012 05:50:00 GMT</pubDate><guid>http://www.blogjava.net/baizhihui19870626/articles/375258.html</guid><wfw:comment>http://www.blogjava.net/baizhihui19870626/comments/375258.html</wfw:comment><comments>http://www.blogjava.net/baizhihui19870626/articles/375258.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baizhihui19870626/comments/commentRss/375258.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baizhihui19870626/services/trackbacks/375258.html</trackback:ping><description><![CDATA[<p sizset="38" sizcache="1">在使用webservice,mule esb等需要jaxb的项目里经常会出现 JAXB 2.0 API is being loaded from the bootstrap classloader这个错误，按照打出的信息Use the endorsed directory mechanism to place jaxb-api.jar in the bootstrap classloader. (See <a href="http://java.sun.com/j2se/1.5.0/docs/guide/standards/">http://java.sun.com/j2se/1.5.0/docs/guide/standards/</a>)去做，通常是解决不了问题的，该建议信息有两个问题导致不可行：</p>
<p>1. 不是下载jaxb-api.jar 而是下载jaxb-api-2.1.jar文件</p>
<p>2.不是把下载的这个jar文件放在sun网站给出的&lt;java-home&gt;/lib/endorsed 下，而是要自己试验确定应该放在哪个目录下：</p>
<p>确定放在哪个目录下的方法如下：</p>
<p>首先要看你的项目是java项目还是java web项目：</p>
<p>A, java项目直接打印System.out.println(System.getProperty("java.endorsed.dirs"));即是jaxb-api-2.1.jar应该放的目录。</p>
<p>B, java web 项目要用一个可以正常启动的web项目(当然没用到jaxb的web项目)，打印System.out.println(System.getProperty("java.endorsed.dirs"));即可，我的是java web项目，打出的是E:/tomcat6/common/endorsed</p>
<p>&nbsp;</p>
<p>我把jaxb-api-2.1.jar放到E:/tomcat6/common/endorsed下后问题解决。</p>
<p>注：没有common/endorsed目录的，自己创建。</p> <img src ="http://www.blogjava.net/baizhihui19870626/aggbug/375258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baizhihui19870626/" target="_blank">小白19870626</a> 2012-04-19 13:50 <a href="http://www.blogjava.net/baizhihui19870626/articles/375258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>