spring+JAX-RPC(Axis) 构建webservice。

介绍

关于用eclipse+wtp发布webservice是相当的简单。这里只简单介绍一下,wtp下发布webservice有以下几个步骤:

·创建Dynamic Web Project.(wtp自带项目)

·在soure folder 下面创建要发布的java bean。本例中发布了一个User.java

·在创建的工程上面新建Web Service. (wtp自带) 浏览中选择创建的User.java

·点击完成后,运行该工程,选择在服务器上运行,配置好服务器,本例发布用的Tomcat5.

发布完成,相当简单吧。

接下来讲webservice发布完成后,用springIOCwebservice进行管理。Spring使用JAX-RPC端口代理来暴露RMI或者非RMI的接口。

RMI接口:

好处:客户端不需要了解JAX-RPC

坏处:客户端需要对RMI对象有所了解。并且需要处理烦人的RemoteException.

RMI接口:

好处:客户端对RMIJAX-RPC都不需要了解,完全解耦。

坏处:水平有限,没有发现。

这里只讲解非RMI接口的实现情况:

『一』. 发布结果的回顾:

上面的webservice已经发布好了。这里列出被发布的User.java

User.java:

package org.upyaya.webservice;

public class User ... {

publicStringgetAddress()...{
return"JingkeRoad,Zhangjiang,Shanghai";
}


publicStringgetUserName()...{
return"Upyaya";
}

}

发布完成后我们可以得到一个wsdl的URL。本例中是:

http://localhost:8080/SpringWebService/wsdl/User.wsdl

『二』. 解析WSDL

在eclipse+wtp的环境中解析wsdl也是很容易的。

·新建工程:使用 Dynamic Web Project 取名:SpringWebServiceClient。
·在工程 SpringWebServiceClient右键选择新建Web Service Client。
·输入上面的 wsdl URL.
·解析出需要的 java文件。

如下图:

spring+JAX-RPC(Axis) 构建webservice。_第1张图片

『三』.创建DAO layer 和Service layer

DAO Layer:

IUserDAO.java

package org.upyaya.webservice.dao;

public interface IUserDAO ... {
publicStringgetAddress();

publicStringgetUserName();
}

UserDAOImpl.java

package org.upyaya.webservice.dao;

public class UserDAOImpl implements IUserDAO ... {
privateIUserDAOuserDAO;

publicIUserDAOgetUserDAO()...{
returnuserDAO;
}


publicvoidsetUserDAO(IUserDAOuserDAO)...{
this.userDAO=userDAO;
}


publicStringgetAddress()...{
returnuserDAO.getAddress();
}


publicStringgetUserName()...{
returnuserDAO.getUserName();
}


}

Service Layer:

IUserService.java

package org.upyaya.webservice.service;

public interface IUserService ... {
publicStringgetAddress();

publicStringgetUserName();

publicStringgetUserInfo();
}

UserServiceImpl.java

package org.upyaya.webservice.service;

import org.upyaya.webservice.dao.IUserDAO;

public class UserServiceImpl implements IUserService ... {

privateIUserDAOuserDAO;

publicIUserDAOgetUserDAO()...{
returnuserDAO;
}


publicvoidsetUserDAO(IUserDAOuserDAO)...{
this.userDAO=userDAO;
}


publicStringgetAddress()...{
returnuserDAO.getAddress();
}


publicStringgetUserInfo()...{
returngetUserName()+"@"+getAddress();
}


publicStringgetUserName()...{
returnuserDAO.getUserName();
}


}

注意:看上面的几个累,有没有涉及到RMI和JAX-RPC?没有吧。完全的解耦,dao 和service完全不知到他们的存在

『四』. Spring AOP&IOC,解决webservice和DAO Layer之间的连接.

先看配置文件(Spring的家常便饭):

webservice.xml

<? xmlversion="1.0"encoding="UTF-8" ?>
<! DOCTYPEbeansPUBLIC"-//SPRING/DTDBEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd"
>

< beans >

< bean id ="userDAO" class ="org.upyaya.webservice.dao.UserDAOImpl" >
< property name ="userDAO" >
< ref local ="userServiceProxy" />
</ property >
</ bean >

< bean id ="userService" class ="org.upyaya.webservice.service.UserServiceImpl" >
< property name ="userDAO" ref ="userDAO" />
</ bean >

<!-- Configure WebServicebean -->

< bean id ="userServiceProxy" class ="org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean" >
<!-- ConfigureWebServicewsdlurl -->
< property name ="wsdlDocumentUrl" >
< value > http://localhost:8080/SpringWebService/wsdl/User.wsdl </ value >
</ property >
<!-- ConfigureWebServicenamespaceuri -->
< property name ="namespaceUri" >
< value > http://webservice.upyaya.org </ value >
</ property >
<!-- ConfigureWebServiceservicename -->
< property name ="serviceName" >
< value > UserService </ value >
</ property >
<!-- ConfigureWebServiceportName -->
< property name ="portName" >
< value > User </ value >
</ property >
<!-- ConfigureWebServiceimplementsinterface -->
< property name ="serviceInterface" >
< value > org.upyaya.webservice.dao.IUserDAO </ value >
</ property >
< property name ="portInterface" >
< value > org.upyaya.webservice.User </ value >
</ property >
</ bean >

</ beans >
· wsdlDocumentUrl,这个不用解释了吧。
· namepaceUrl,wsdl服务的命名空间URL。
· servicename,wsdl的服务名称。
· portName,服务端口。
· serviceInterface,webservice实现的接口。是我们指定的业务接口
· portInterface,RMI服务接口。

『四』. 测试

Client.java

package org.upyaya.webservice.client;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.upyaya.webservice.service.IUserService;

public class UserClient ... {

publicstaticvoidmain(String[]args)...{
ApplicationContextcontext
=
newFileSystemXmlApplicationContext(
"webservice.xml");
IUserServiceservice
=(IUserService)context.getBean("userService");
System.out.println(service.getUserInfo());
}


}

这里为了方便没有在web里面展现。但是展现机制不是这里的重点。所以选择控制台打印,结果如下:

Output:

log4j:WARN No appenders could be found for logger (org.springframework.core.CollectionFactory).
log4j:WARN Please initialize the log4j system properly.
Upyaya@Jingke Road,Zhangjiang,Shanghai

附:Wsdl文件

<? xmlversion="1.0"encoding="UTF-8" ?>
< wsdl:definitions targetNamespace ="http://webservice.upyaya.org" xmlns:impl ="http://webservice.upyaya.org" xmlns:intf ="http://webservice.upyaya.org" xmlns:apachesoap ="http://xml.apache.org/xml-soap" xmlns:wsdlsoap ="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd ="http://www.w3.org/2001/XMLSchema" xmlns:wsdl ="http://schemas.xmlsoap.org/wsdl/" >
<!-- WSDLcreatedbyApacheAxisversion:1.3
BuiltonOct05,2005(05:23:37EDT)
-->
< wsdl:types >
< schema xmlns ="http://www.w3.org/2001/XMLSchema" targetNamespace ="http://webservice.upyaya.org" elementFormDefault ="qualified" >
< element name ="getAddress" >
< complexType />
</ element >
< element name ="getAddressResponse" >
< complexType >
< sequence >
< element name ="getAddressReturn" type ="xsd:string" />
</ sequence >
</ complexType >
</ element >
< element name ="getUserName" >
< complexType />
</ element >
< element name ="getUserNameResponse" >
< complexType >
< sequence >
< element name ="getUserNameReturn" type ="xsd:string" />
</ sequence >
</ complexType >
</ element >
</ schema >
</ wsdl:types >

< wsdl:message name ="getUserNameResponse" >

< wsdl:part name ="parameters" element ="impl:getUserNameResponse" />

</ wsdl:message >

< wsdl:message name ="getUserNameRequest" >

< wsdl:part name ="parameters" element ="impl:getUserName" />

</ wsdl:message >

< wsdl:message name ="getAddressRequest" >

< wsdl:part name ="parameters" element ="impl:getAddress" />

</ wsdl:message >

< wsdl:message name ="getAddressResponse" >

< wsdl:part name ="parameters" element ="impl:getAddressResponse" />

</ wsdl:message >

< wsdl:portType name ="User" >

< wsdl:operation name ="getAddress" >

< wsdl:input name ="getAddressRequest" message ="impl:getAddressRequest" />

< wsdl:output name ="getAddressResponse" message ="impl:getAddressResponse" />

</ wsdl:operation >

< wsdl:operation name ="getUserName" >

< wsdl:input name ="getUserNameRequest" message ="impl:getUserNameRequest" />

< wsdl:output name ="getUserNameResponse" message ="impl:getUserNameResponse" />

</ wsdl:operation >

</ wsdl:portType >

< wsdl:binding name ="UserSoapBinding" type ="impl:User" >

< wsdlsoap:binding style ="document" transport ="http://schemas.xmlsoap.org/soap/http" />

< wsdl:operation name ="getAddress" >

< wsdlsoap:operation soapAction ="" />

< wsdl:input name ="getAddressRequest" >

< wsdlsoap:body use ="literal" />

</ wsdl:input >

< wsdl:output name ="getAddressResponse" >

< wsdlsoap:body use ="literal" />

</ wsdl:output >

</ wsdl:operation >

< wsdl:operation name ="getUserName" >

< wsdlsoap:operation soapAction ="" />

< wsdl:input name ="getUserNameRequest" >

< wsdlsoap:body use ="literal" />

</ wsdl:input >

< wsdl:output name ="getUserNameResponse" >

< wsdlsoap:body use ="literal" />

</ wsdl:output >

</ wsdl:operation >

</ wsdl:binding >

< wsdl:service name ="UserService" >

< wsdl:port name ="User" binding ="impl:UserSoapBinding" >

< wsdlsoap:address location ="http://localhost:8080/SpringWebService/services/User" />

</ wsdl:port >

</ wsdl:service >

</ wsdl:definitions >

《完》

你可能感兴趣的:(webservice)