介绍
关于用eclipse+wtp发布webservice是相当的简单。这里只简单介绍一下,wtp下发布webservice有以下几个步骤:
·创建Dynamic Web Project.(wtp自带项目)
·在soure folder 下面创建要发布的java bean。本例中发布了一个User.java
·在创建的工程上面新建Web Service. (wtp自带) 浏览中选择创建的User.java
·点击完成后,运行该工程,选择在服务器上运行,配置好服务器,本例发布用的Tomcat5.
发布完成,相当简单吧。
接下来讲webservice发布完成后,用spring的IOC对webservice进行管理。Spring使用JAX-RPC端口代理来暴露RMI或者非RMI的接口。
RMI接口:
好处:客户端不需要了解JAX-RPC。
坏处:客户端需要对RMI对象有所了解。并且需要处理烦人的RemoteException.
非RMI接口:
好处:客户端对RMI和JAX-RPC都不需要了解,完全解耦。
坏处:水平有限,没有发现。
这里只讲解非RMI接口的实现情况:
『一』. 发布结果的回顾:
上面的webservice已经发布好了。这里列出被发布的User.java
User.java:
package
org.upyaya.webservice;


public
class
User
...
{


public String getAddress() ...{
return "Jingke Road,Zhangjiang,Shanghai";
}


public String getUserName() ...{
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文件。
如下图:

『三』. 创建DAO layer 和 Service layer
DAO Layer:
IUserDAO.java
package
org.upyaya.webservice.dao;


public interface IUserDAO ...
{
public String getAddress();

public String getUserName();
}
UserDAOImpl.java
package
org.upyaya.webservice.dao;


public class UserDAOImpl implements IUserDAO ...
{
private IUserDAO userDAO;


public IUserDAO getUserDAO() ...{
return userDAO;
}


public void setUserDAO(IUserDAO userDAO) ...{
this.userDAO = userDAO;
}


public String getAddress() ...{
return userDAO.getAddress();
}


public String getUserName() ...{
return userDAO.getUserName();
}

}
Service Layer:
IUserService.java
package
org.upyaya.webservice.service;


public interface IUserService ...
{
public String getAddress();

public String getUserName();
public String getUserInfo();
}
UserServiceImpl.java
package
org.upyaya.webservice.service;

import
org.upyaya.webservice.dao.IUserDAO;


public class UserServiceImpl implements IUserService ...
{

private IUserDAO userDAO;


public IUserDAO getUserDAO() ...{
return userDAO;
}


public void setUserDAO(IUserDAO userDAO) ...{
this.userDAO = userDAO;
}


public String getAddress() ...{
return userDAO.getAddress();
}


public String getUserInfo() ...{
return getUserName() + "@" + getAddress();
}


public String getUserName() ...{
return userDAO.getUserName();
}

}
注意:看上面的几个累,有没有涉及到RMI和JAX-RPC?没有吧。完全的解耦,dao 和service完全不知到他们的存在
『四』. Spring AOP&IOC,解决webservice和DAO Layer之间的连接.
先看配置文件(Spring的家常便饭):
webservice.xml
<?
xml version="1.0" encoding="UTF-8"
?>
<!
DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/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 WebService bean
-->

<
bean
id
="userServiceProxy"
class
="org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean"
>
<!--
Configure WebService wsdl url
-->
<
property
name
="wsdlDocumentUrl"
>
<
value
>
http://localhost:8080/SpringWebService/wsdl/User.wsdl
</
value
>
</
property
>
<!--
Configure WebService namespace uri
-->
<
property
name
="namespaceUri"
>
<
value
>
http://webservice.upyaya.org
</
value
>
</
property
>
<!--
Configure WebService service name
-->
<
property
name
="serviceName"
>
<
value
>
UserService
</
value
>
</
property
>
<!--
Configure WebService portName
-->
<
property
name
="portName"
>
<
value
>
User
</
value
>
</
property
>
<!--
Configure WebService implements interface
-->
<
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
...
{


public static void main(String[] args) ...{
ApplicationContext context =
new FileSystemXmlApplicationContext(
"webservice.xml");
IUserService service = (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文件
<?
xml version="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/"
>
<!--
WSDL created by Apache Axis version: 1.3
Built on Oct 05, 2005 (05:23:37 EDT)
-->
<
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
>
《完》