Web Services是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务。
Web Service的关键技术和规则:
1.XML:描述数据的标准方法.
2.SOAP:表示信息交换的协议(简单对象访问协议).
3.WSDL:Web服务描述语言.
4.UDDI:通用描述、发现与集成,他是一种独立于平台,基于XML语言的用于在互联网上描述商务的协议。
一、利用JDK web服务api实现,这里使用基于SOAP message的Web Service:
1.首先创建一个Web Services项目,作为Web services Endpoint.
2.创建一个HelloService.java类
[c-sharp] view plain copy
- packagecom.yjpeng.hello;
-
- importjavax.jws.WebService;
- importjavax.jws.WebMethod;
- importjavax.xml.ws.Endpoint;
-
- @WebService
- publicclassHelloService{
-
- @WebMethod
- publicStringsayHello(Stringmessage){
- return"Hello,"+message;
- }
-
- publicstaticvoidmain(String[]args){
- //createandpublishanendPoint
- HelloServicehello=newHelloService();
- EndpointendPoint=Endpoint.publish("http://localhost:8080/helloService",hello);
- }
- }
3.使用apt编译HelloService.java(例如: apt -d bin(bin存放编译后的文件目录) scr/com/yjpeng/hello/HelloService.java)后,会生成jaxws目录。
4.使用java com.yjpeng.hello.HelloService执行HelloService.java文件,在浏览器中输入http://localhost:8080/helloService?wsdl出现如下图
5.使用wsimport命令生成客户端:wsimport -p com.yjpeng.webservice -keephttp://localhost:8080/helloService?wsdl这时会在当前目录中生成如下文件:
6.编写好客户端文件HelloClient.java
[c-sharp] view plain copy
- packagecom.yjpeng.hello;
-
- importcom.yjpeng.webservice.HelloServiceService;
-
- publicclassHelloClient{
- publicstaticvoidmain(String[]args){
- HelloServiceServicehelloServiceService=newHelloServiceService();
- com.yjpeng.webservice.HelloServicehelloService=helloServiceService.getHelloServicePort();
- System.out.println(helloService.sayHello("你好"));
- }
-
- }
运行结果在控制台输出 hello,你好 证明利用JDK web服务API实现web service成功!
二、使用xfire框架,我这里使用的是MyEclipse集成的xfire进行测试,利用xfire开发WebService可以有三种方法:
a.一种是从JavaBean中生成。
b.一种是从wsdl文件中生成。
c.一种是自己建立webservice。
具体实现步骤如下:
1.用Myeclipse建立webService工程(注意:Web Service&J2EE Details中的Framework选XFire),目录结构如下:
2.创建IHello.java接口
[c-sharp] view plain copy
- packagecom.yjpeng.hello;
-
- publicinterfaceIHello{
- publicStringsayHello(Stringmessage);
- }
3.创建IHelloImpl.java实现IHello.java接口
[c-sharp] view plain copy
- packagecom.yjpeng.hello;
-
- publicclassIHelloImplimplementsIHello{
-
- publicStringsayHello(Stringmessage){
- returnmessage;
- }
- }
4.修改Service.xml文件,加入以下代码
<service>
<!-- 为该Service起一个名字 -->
<name>HelloService</name>
<!-- service的接口类 -->
<serviceClass>
com.yjpeng.hello.IHello
</serviceClass>
<!-- service的接口实现类-->
<implementationClass>
com.yjpeng.hello.IHelloImpl
</implementationClass>
<!-- wsdl的样式-->
<style>wrapped</style>
<use>literal</use>
<scope>application</scope>
</service>
5.把该Web Service项目部署到tomcat里面启动tomcat在浏览器地址栏输入http://localhost:8080/TestWebServices/services/Hello?wsdl出现如下图
6.然后在展开HelloService后面的wsdl可以看到
7.创建一个客户端HelloClient.java类
[c-sharp] view plain copy
- importjava.net.MalformedURLException;
- importjava.net.URL;
-
- importorg.codehaus.xfire.XFireFactory;
- importorg.codehaus.xfire.client.Client;
- importorg.codehaus.xfire.client.XFireProxyFactory;
- importorg.codehaus.xfire.service.Service;
- importorg.codehaus.xfire.service.binding.ObjectServiceFactory;
-
- importcom.yjpeng.hello.IHello;
-
- publicclassHelloClient{
- publicstaticvoidmain(String[]args){
- Services=newObjectServiceFactory().create(IHello.class);
- XFireProxyFactoryxf=newXFireProxyFactory(XFireFactory.newInstance().getXFire());
- Stringurl="http://192.168.122.128:8080/TestWebServices/services/HelloService";
- IHellohello;
- try{
- hello=(IHello)xf.create(s,url);
- System.out.println(hello.sayHello("你好"));
- }catch(MalformedURLExceptione){
- e.printStackTrace();
- }
- try{
- //这个是在java端调用.net写的远程WebService如果调用本机写的只需要把URL中的地址换成本机能访问的地址即可
- Clientc=newClient(newURL("http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl"));
- Object[]o=c.invoke("qqCheckOnline",newString[]{"271751507"});
- System.out.println(o.length);
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- }
运行HelloClient.java类可以输出 你好 1.
三、使用axis1.4开发webservice方法
首先下载axis1.4包和tomcat服务器,并将解压后的axis1.4包下面的webapps下的axis目录复制到tomcat服务器的webapps文件夹中。axis支持三种Web Service的部署和开发,分别为:
a.Dynamic Invocation Interface(DII)
b.Stubs 方式
c.Dynamic Proxy方式
1.编写DII(Dynamic Invocation Interface)方式Web Service
a.编写服务程序HelloClient.java
[c-sharp] view plain copy
- publicclassHelloClient
- {
- publicStringgetName(Stringname){
- return"hello,"+name;
- }
- }
b.将HelloClient.java文件拷贝到axis_home下,重命名为HelloClient.jws.
c.访问链接http://localhost:8080/axis/HelloClient.jws?wsdl页面显示axis自动生成的wsdl文件
d.编写访问服务的客户端TestHelloClient.java需要导入相应的axis.jar包,在下载的axis的WEB-INF/lib/目录下。
[c-sharp] view plain copy
- packagecom.yjpeng.webservice;
-
- importjava.net.URL;
- importjavax.xml.namespace.QName;
- importorg.apache.axis.client.Call;
- importorg.apache.axis.client.Service;
-
- publicclassTestHelloClient{
- publicstaticvoidmain(String[]args){
- try{
- Stringendpoint="http://localhost:8080/axis/HelloClient.jws";
- Serviceservice=newService();
- Callcall=(Call)service.createCall();
- call.setOperationName(newQName(endpoint,"getName"));
- call.setTargetEndpointAddress(newURL(endpoint));
- Stringresult=(String)call.invoke(newObject[]{"张三"});
- System.out.println(result);
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- }
运行TestHelloClient.java在控制台输出hell,张三,测试成功.
2.编写Dynamci Proxy方式访问服务
a.编写部署服务端程序,用上边DII方式使用的HelloClient.java
[c-sharp] view plain copy
- publicclassHelloClient
- {
- publicStringgetName(Stringname){
- return"hello,"+name;
- }
- }
b.编写代理接口HelloClientInterface.java需要扩展java.rmi.Remote类
[c-sharp] view plain copy
- packagecom.yjpeng.dynamic.proxy;
-
- importjava.rmi.Remote;
- importjava.rmi.RemoteException;
-
- publicinterfaceHelloClientInterfaceextendsRemote{
- publicStringgetName(Stringname)throwsRemoteException;
- }
c.编写访问服务的客户端TestHelloClient.java
[c-sharp] view plain copy
- packagecom.yjpeng.dynamic.proxy;
-
- importjava.net.URL;
-
- importjavax.xml.namespace.QName;
- importjavax.xml.rpc.Service;
- importjavax.xml.rpc.ServiceFactory;
-
- publicclassTestHelloClient{
- publicstaticvoidmain(String[]args){
- try{
- StringwsdlUrl="http://localhost:8080/axis/HelloClient.jws?wsdl";
- StringnameSpaceUrl="http://localhost:8080/axis/HelloClient.jws";
- StringserviceName="HelloClientService";
- StringportName="HelloClient";
- ServiceFactoryserviceFactory=ServiceFactory.newInstance();
- ServiceafService=serviceFactory.createService(newURL(wsdlUrl),newQName(nameSpaceUrl,serviceName));
- HelloClientInterfaceproxy=(HelloClientInterface)afService.getPort(newQName(nameSpaceUrl,portName),
- HelloClientInterface.class);
- System.out.println(proxy.getName("张三"));
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- }
运行TestHelloClient.java在控制台输出hell,张三,测试成功.
四、使用axis2开发webservice
研究中....
五、在java web项目中开放一个webservice接口实例
1.引入需要的jar包
2.创建一个接口类IAddNumbers.java
[c-sharp] view plain copy
- packagecom.yjpeng.webservice;
-
- publicinterfaceIAddNumbers{
- publicintaddNumbers(inta,intb);
- }
3.创建一个AddNumberImpl.java实现IAddnumbers.java接口类
[c-sharp] view plain copy
- packagecom.yjpeng.webservice;
-
- importjavax.jws.WebService;
-
- importcom.sun.xml.ws.transport.http.servlet.WSServlet;
-
- @WebService(targetNamespace="http://webservice.yjpeng.com",serviceName="AddNumberImplService",
- portName="AddNumberImpl")
- publicclassAddNumberImplimplementsIAddNumbers{
- publicintaddNumbers(inta,intb){
- returna+b;
- }
- }
4.在WEN-INF目录下创建一个sun-jaxws.xml文件
[c-sharp] view plain copy
- <?xmlversion="1.0"?>
- <endpointsversion="2.0"
- xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
- <endpointname="AddNumberImpl"
- implementation="com.yjpeng.webservice.AddNumberImpl"
- url-pattern="/addNumberImpl"/>
- </endpoints>
-
5.在web.xml文件中增加
[c-sharp] view plain copy
- <servlet>
- <servlet-name>AddNumberService</servlet-name>
- <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>AddNumberService</servlet-name>
- <url-pattern>/addNumberImpl</url-pattern>
- </servlet-mapping>
- <listener>
- <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
- </listener>
6.部署web项目 启动相应部署服务器。访问http://localhost:8080/TestJaxWebService/addNumberImpl?wsdl这样每次启动web服务器就开放了一个web service的接口。