技术开发 频道

WebService架构和应用

  WebService应用

  1. JDK6增加了对WS的支持

  下面是WebService的一个简单的服务应用:

  Java代码

import javax.xml.ws.*;
import javax.jws.
*;
import javax.jws.soap.
*;
@WebService(targetNamespace
="http://localhost:7070/Ebay")
@SOAPBinding(style
= SOAPBinding.Style.RPC)
public class HelloService
{
public static void main(String [] args)
{
Endpoint.publish(
"http://localhost:7070/Ebay",new HelloService());
}
@WebMethod
public void sayHello()
{
System.out.println(
"hello");
}
}

   2. Axis安装配置

<1> 安装JDK;
<2> 安装并配置Tomcat;
<3> 从官方网站http://ws.apache.org/axis下载最新的Axis项目打包文件,并将webapps下axis目录拷贝到Tomcat的webapps目录下;
<4> 验证Axis的安装;
<5> 浏览所发布的服务。

   3. 服务器端开发

  <1> 即时发布

  使用即时发布首先需要一个实现服务功能的Java源文件,将其扩展名改为.jws(Java Web Service的缩写),然后将该文件放到Tomcat下面的webapps\axis目录下即可。但是JWS的web服务发布是一个很简单的Web服务发布方式,在页面中你不能使用包,而且由于代码是在运行期被编译的,所以在部署之后,你也很难找到错误所在。

  <2> 定制发布

① 编写要发布为服务的java类
② 编译生成的class文件应该放在Tomcat下的webapps
\axis\WEB-INF\classes\下面
③ 编写deploy.wsdd 文件描述服务的名称,入口等信息
④ 切换到命令航下,执行
  java org.apache.axis.client.AdminClient –p
8085 deploy.wsdd

   4. 调用web服务

  <1> DLL动态接口调用方式(Dynamic Invocation Interface)

public static void main(String [] args) {
try {
String endpoint =
"http://localhost:8080/axis/services/test1";
//实例化一个服务对象service
Service  service
= new Service();
//创建一个空的调用对象Call,设置Call的操作名称,目标地址,传入参数等等
//执行调用后即可得到返回的结果
Call
call    = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName(new QName("http://soapinterop.org/", "add3") );
// Call to addParameter/setReturnType as described in user-guide.html
//call.addParameter("testParam",
//                  org.apache.axis.Constants.XSD_STRING,
//                  javax.xml.rpc.ParameterMode.IN);
//call.setReturnType(org.apache.axis.Constants.XSD_STRING);
Integer ret = (Integer) call.invoke( new Object[] { 1,3 } );
System.out.println( ret);
} catch (Exception e) {
System.err.println(e.toString());
}
}

    <2> 动态代理方式(Dynamic Proxy)

  动态代理需要一个本地的接口作为代理

  Java代码

public interface ITestDynameicProxy extends Remote {
public String getMessage() throws RemoteException;
}
public static void main(String[] args) throws Exception {
String wsdlUrl = "http://localhost:8080/axis/test/Test.jws?wsdl";
String nameSpaceUri = "http://soapinterop.org/";
String serviceName = "Test1Service";
String portName = "Test1";
ServiceFactory serviceFactory
= ServiceFactory.newInstance();
Service service
= serviceFactory.createService(
new URL(wsdlUrl), new QName(nameSpaceUri,serviceName));
ITestDynameicProxy proxy
= (ITestDynameicProxy)service.getPort(
new QName(nameSpaceUri,portName),ITestDynameicProxy.class);
System.out.println(proxy.getMessage());
}

   通过输入wsdl地址,命名空间地址和服务名,用服务工厂创建出一个服务实例,再通过设置端口名得到一个服务类型的服务代理对象,通过该代理,就可以直接访问web服务了。

  <3> 静态方式(Stubs)

  ① 按常规方式发布一个WebService

  ② 得到wsdl文件

  * 通过web页面直接另存为

  * 通过Java2WSDL工具类生成

  (java org.apache.axis.wsdl.Java2WSDL -o demo1.wsdl

         -l http://localhost:8080/axis/services/demo

         -n http://www.itcast.cn/test.Demo

  ③ 利用WSDL2Java工具类生成客户端调用代码

  (java org.apache.axis.wsdl.WSDL2Java demo.wsdl -p client)

  ④ 在生成的代码基础上,进行客户端的调用

  Java代码

public static void main(String[] args) throws ServiceException, RemoteException {
DemoServiceLocator demoService
= new DemoServiceLocator();
Demo demo
= demoService.getdemo();
System.out.println(demo.getMessage());
}

 

 

     

 

0
相关文章