webservice HelloWorld示例 初步学习一

学习了一段时间webservice了,感受颇深,用处很大啊,贴出来helloworld刚开始学习这块技术时的学习讨论下

服务端:

接口类:

package com.hoo.service;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
/***
* 客户端调用WebService所需要的接口
* @author huawei
* 备注:
* 1、接口在webservice的访问中,具有相当重要的作用,客户端的访问就是通过访问服务端的接口,调用起方法。
* 2、webservice的注释,用于在wsdl中显示,作用是便于访问者阅读理解和调用接口内的方法。
* 3、实体类应该继承WebService的接口,但是实体类中的注解不起作用。
* 3、WebService常用的元注释:
* @WebService:将接口发布成为服务,暴露方法,在实现类中使用endpointInterface会起作用
* @SOAPBinding:服务端接受和发送消息的编码样式,在实现类中无效果
* @WebMethod:对接口中方法是否需要暴露和暴露后的一些参数指定,在实现类中无效果
* @WebResult:对调用该暴露方法的返回类型进行注释,在实现类中无效果
* @WebParam:对暴露方法的参数进行注释,在实现类中无效果
*/
import javax.jws.soap.SOAPBinding.Use;
@WebService
@SOAPBinding(style = Style.DOCUMENT,use=Use.LITERAL)//定义发送到 Web Service 的消息和从 Web Service 发送的消息的编码样式
public interface IHelloWorldService {
@WebMethod(operationName="sayHello",exclude=false)
@WebResult(name="String")//指定调用该方法返回的名字
public String sayHello(@WebParam(name = "用户名") String name);
}

 

接口的实现类:

package com.hoo.service.impl;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;

import com.hoo.service.IHelloWorldService;
/***
* 服务端发布的实体类
* @author huawei
*
*/
@WebService
@SOAPBinding(style = Style.RPC)
public class HelloWorldService implements IHelloWorldService{
public String sayHello(@WebParam(name = "name") String name){//不起作用的@WebParam
return name + " say: Hello World";
}
//非接口的方法
public String testHayHello(@WebParam(name="用dddddd名") String name) {//不会被发布
return name + " sayHello;";
}
}

 

服务端服务启动:

package com.hoo.service.deploy;
/*import javax.xml.ws.Endpoint; */

import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

import com.hoo.service.IHelloWorldService;
import com.hoo.service.impl.HelloWorldService;
/**
* <b>function:</b> 发布CXF WebService
* 总结:
* 发布方式:JaxWsServerFactoryBean.create()方法 或 Endpoint.publish(address, service);
* 发布类:发布的类是实体类
* 注意:通过这种方式发布的WebService不符合wsdl规范,留此作为参考,具体参见类DeployInterceptorService
**/
public class DeployHelloWorldService {
public static void deployService(){
//发布方式一
/*System.out.println("Server start ......");
HelloWorldService service = new HelloWorldService();
String address = "http://localhost:8080/webservice?wsdl";
//发布
Endpoint.publish(address, service);*/

//发布方式二(推荐)
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
String address = "http://localhost:8080/webservice?wsdl";
factory.setServiceClass(IHelloWorldService.class);//serviceClass:必须是一个接口
factory.setServiceBean(new HelloWorldService());//serviceBean:是一个实现接口的实现类
factory.setAddress(address);
factory.create();
}

public static void main(String[] args) throws InterruptedException{
//发布Webservice
deployService();
System.out.println("server ready ......");
Thread.sleep(1000*60);
System.out.println("server exiting");
//休眠60秒后退出
System.exit(0);
}
}

 

客户端调用测试(这个示例是写在同一项目内的,也可以自己分开来做,原理一样):

package com.hoo.client;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.hoo.service.IHelloWorldService;
/***
* 客户端调用代码
* 总结:
* 调用方式:IHelloWorldService service = (IHelloWorldService)factory.create();
* 调用类:通过调用服务端接口类型,factory.create()返回该接口类
* @author huawei
*
*/
public class HelloWorldServiceClient {
public static void main(String[] args) {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
//必须是一个接口
factory.setServiceClass(IHelloWorldService.class);
factory.setAddress("http://localhost:8080/webservice?wsdl");
//创建接口对象
IHelloWorldService service = (IHelloWorldService)factory.create();
System.out.println("[result]" + service.sayHello("hoojo"));
}
}

 

OK,上述代码考到java IDE中即可,测试通过。

有疑问期待与我留言。

 

你可能感兴趣的:(webservice)