This is the Java Project
首先是SEI,即服务端接口类HelloService.java
package com.jadyer.service; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; /** * SEI(Service Endpoint Interface) * @see ------------------------------------------------------------------------------------------- * @see 这里使用类级别注解@WebService是为了标注该接口的方法将公开为Web服务 * @see 它默认会公开所有方法,若想屏蔽某个方法,可以使用@Method的exclude=true属性 * @see ------------------------------------------------------------------------------------------- * @see 默认的生成的wsdl中方法参数名是arg0,arg1,返回值是return * @see 这样很不便于观察,所以我们可以使用@WebResult和@WebParam注解 * @see @WebResult和@WebParam可以指定生成的wsdl文件中的方法参数名和返回值 * @see ------------------------------------------------------------------------------------------- * @see 这里要注意:如果一个WebServices服务已经发布,再来修改服务细节,如方法参数名和返回值 * @see 尽管没有修改方法内部逻辑,但再重新发布完服务后,相应的客户端也要做修改,如重新wsimport本地类 * @see 这是因为wsdl文件已被修改(尽管改的只是参数名字),而客户端所请求的wsdl与新wsdl在内容上是不同的 * @see 若客户端未重新wsimport,会导致请求服务成功(实际是假象的成功)但得不到正确的结果 * @see 所以服务一旦发布就不要轻易修改 * @see ------------------------------------------------------------------------------------------- * @create Mar 17, 2013 12:11:24 AM * @author 玄玉<http://blog.csdn/net/jadyer> */ @WebService public interface HelloService { @WebResult(name="addResult") public int add(@WebParam(name="a")int a, @WebParam(name="b")int b); @WebResult(name="sayHelloResult") public String sayHello(@WebParam(name="name")String name); }
package com.jadyer.service; import javax.jws.WebService; /** * SIB(Service Implemention Bean) * @see ----------------------------------------------------------------------------------------------- * @see 如果该实现类还实现了其它接口,那么就需要在@WebService上使用endpointInterface指定SEI * @see 如@WebService(endpointInterface="com.jadyer.service.HelloService") * @see 有一个比较奇怪的现象是,本例中如果没有加endpointInterface属性,那么SEI中的@WebParam会失效 * @see 这是因为endpointInterface属性的作用之一是让SEI中配置的注解生效,不过我们也可以在SIB中直接注解 * @see ----------------------------------------------------------------------------------------------- * @create Mar 17, 2013 12:11:24 AM * @author 玄玉<http://blog.csdn/net/jadyer> */ @WebService(endpointInterface="com.jadyer.service.HelloService") public class HelloServiceImpl implements HelloService { @Override public int add(int a, int b) { System.out.println(a + "+" + b + "=" + (a+b)); return a+b; } @Override public String sayHello(String name) { System.out.println("Receive the name=[" + name + "]"); if(null==name){ return "Hello,World"; }else{ return "Hello," + name; } } }
package com.jadyer.server; import javax.xml.ws.Endpoint; import com.jadyer.service.HelloServiceImpl; /** * 基于JAX-WS的WebServices入门 * @see JAX-WS(Java API for XML Webservices) * @see ------------------------------------------------------------------------------------------------- * @see 两个常见的名词SEI和SIB * @see SEI(Service Endpoint Interface)--服务提供的接口,本例中指的就是HelloService.java * @see SIB(Service Implemention Bean)---服务实现的Bean,本例中指的就是HelloServiceImpl.java * @see ------------------------------------------------------------------------------------------------- * @create Mar 16, 2013 10:04:52 PM * @author 玄玉<http://blog.csdn/net/jadyer> */ public class MainApp { public static void main(String[] args) { //发布服务,需指定发布的服务地址和实现类 //运行该类后,服务就发布出去了,然后浏览器访问http://127.0.0.1:8888/myHelloService?wsdl即可 Endpoint.publish("http://127.0.0.1:8888/myHelloService", new HelloServiceImpl()); } }
我们在该Java Project上写一个Client测试一下
注意:这里ClientApp只是用于测试,实际用处不怎么大
更加好用的客户端处理方式,详见http://blog.csdn.net/jadyer/article/details/8692108
package com.jadyer.client; import java.net.MalformedURLException; import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Service; import com.jadyer.service.HelloService; public class ClientApp { public static void main(String[] args) throws MalformedURLException { //创建访问WSDL服务地址的URL URL url = new URL("http://127.0.0.1:8888/myHelloService?wsdl"); //通过QName指明服务的具体信息 //两个参数分别为WSDL文件顶部的<definitions targetNamespace="" name="">的值 QName qname = new QName("http://service.jadyer.com/", "HelloServiceImplService"); //创建服务 Service service = Service.create(url, qname); //实现接口 HelloService hello = service.getPort(HelloService.class); //美中不足的是,这里客户端要依赖于服务端的接口类 //更加好用的客户端处理方式,详见http://blog.csdn.net/jadyer/article/details/8692108 System.out.println(hello.add(2, 6)); System.out.println(hello.sayHello("Jadyer")); } }