JAX-WS开发WebService程序
近来公司里要用的到WebService做开发,所以就自己学习了一下,刚开始感觉挺难的,但是真正学会以后,原来这么简单。
今天把这些东西哦记下来,以便日后的复习。
我来介绍一下我的开发环境:Eclipse + Tomcat 7.0 + jaxws-ri-2.2.8 + soapui-4.5.1
首先创建Dynamic web project
然后我们在 WEB-INF 目录下创建wsdl文件夹在这个文件夹下创建user.wsdl文件:
如上图所示。
下面我们开始编写wsdl文件的内容
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://wsdl.tangkai.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="UserServiceImpl" targetNamespace="http://wsdl.tangkai.com/"> <wsdl:types> <xsd:schema targetNamespace="http://wsdl.tangkai.com/"> <xsd:element name="add" type="tns:add"></xsd:element> <xsd:element name="addResponse" type="tns:addResponse"></xsd:element> <xsd:element name="delete" type="tns:delete"></xsd:element> <xsd:element name="deleteResponse" type="tns:deleteResponse"></xsd:element> <xsd:element name="login" type="tns:login"></xsd:element> <xsd:element name="loginResponse" type="tns:loginResponse"></xsd:element> <xsd:element name="list" type="tns:list"></xsd:element> <xsd:element name="listResponse" type="tns:listResponse"></xsd:element> <xsd:complexType name="add" > <xsd:sequence> <xsd:element name="user" type="tns:user"></xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="addResponse"> <xsd:sequence/> </xsd:complexType> <xsd:complexType name="delete"> <xsd:sequence> <xsd:element name="username" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="deleteResponse"> <xsd:sequence/> </xsd:complexType> <xsd:complexType name="login"> <xsd:sequence> <xsd:element name="username" type="xsd:string"></xsd:element> <xsd:element name="userpassword" type="xsd:string"></xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="loginResponse"> <xsd:sequence> <xsd:element name="user" type="tns:user"></xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="list"> <xsd:sequence /> </xsd:complexType> <xsd:complexType name="listResponse"> <xsd:sequence minOccurs="1" maxOccurs="unbounded"> <xsd:element name="user" type="tns:user"></xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="user"> <xsd:sequence> <xsd:element name="username" type="xsd:string"/> <xsd:element name="nickname" type="xsd:string"/> <xsd:element name="userpassword" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <!-- xsd:schema 标签中的内容可以单独的写在一个user.xsd文件中这样当你的类多的时候就不会显的特别的乱 --> </xsd:schema> </wsdl:types> <wsdl:message name="add"> <wsdl:part element="tns:add" name="parameters" /> </wsdl:message> <wsdl:message name="addResponse"> <wsdl:part element="tns:addResponse" name="parameters" /> </wsdl:message> <wsdl:message name="delete"> <wsdl:part element="tns:delete" name="parameters" /> </wsdl:message> <wsdl:message name="deleteResponse"> <wsdl:part element="tns:deleteResponse" name="parameters" /> </wsdl:message> <wsdl:message name="login"> <wsdl:part element="tns:login" name="parameters" /> </wsdl:message> <wsdl:message name="loginResponse"> <wsdl:part element="tns:loginResponse" name="parameters" /> </wsdl:message> <wsdl:message name="list"> <wsdl:part element="tns:list" name="parameters" /> </wsdl:message> <wsdl:message name="listResponse"> <wsdl:part element="tns:listResponse" name="parameters" /> </wsdl:message> <wsdl:portType name="IUserService"> <wsdl:operation name="add"> <wsdl:input message="tns:add" /> <wsdl:output message="tns:addResponse" /> </wsdl:operation> <wsdl:operation name="delete"> <wsdl:input message="tns:delete" /> <wsdl:output message="tns:deleteResponse" /> </wsdl:operation> <wsdl:operation name="login"> <wsdl:input message="tns:login" /> <wsdl:output message="tns:loginResponse" /> </wsdl:operation> <wsdl:operation name="list"> <wsdl:input message="tns:list" /> <wsdl:output message="tns:listResponse" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="UserServiceSOAP" type="tns:IUserService"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="add"> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="delete"> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="login"> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="list"> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="UserServiceImpl"> <wsdl:port binding="tns:UserServiceSOAP" name="UserServicePort"> <soap:address location="http://localhost:8989/us" /> </wsdl:port> </wsdl:service> </wsdl:definitions>
编写完成user.wsdl文件之后我们来生成客户端的代码
在cmd下运行:wsimport -d d:/webservice -verbose -keep user.wsdl来生成代码
-d : 生成代码的存放位置
-verbose : 生成代码的详细信息
-keep : 保存生成代码的源文件和class文件
这里注意我们要到我们的工作空间去找到我们的user.wsdl文件
然后我们到生成代码的目录下将生成的代码拷贝到我们的src目录下,我们只用到了IUserService接口和User 其他的类都可以删除,IUserService如果报错的话将保存的地方:@XmlSeeAlso({ObjectFactory.class})删除就行了。
接下来我们来编写实现类:
package com.tangkai.wsdl; import java.util.ArrayList; import java.util.List; import javax.jws.WebService; @WebService(endpointInterface = "com.tangkai.wsdl.IUserService", //实现的接口 serviceName = "UserServiceImpl", //服务名称与wsdl文件中的service 的名称相同 portName = "UserServicePort", //与wsdl文件中的 service 中的prot的名称相同 targetNamespace = "http://wsdl.tangkai.com/", //命名空间的名称与接口中的命名空间保持一致即可 wsdlLocation = "WEB-INF/wsdl/user.wsdl" //wsdl文件的存放位置,若不填写会自动生成wsdl文件但是不是很规范 ) public class UserServiceImpl implements IUserService{ /** * 用来存放用户的信息,这里没有使用到数据库,所以就先存放到list集合当中 */ private List<User> userList = new ArrayList<User>(); /** * 添加用户的信息 */ @Override public void add(User user) { System.out.println("====>添加了一个用户:"+user); userList.add(user); } /** * 删除用户的信息 */ @Override public void delete(String username) { System.out.println("删除用户"+username); for(User user : userList){ if( user.getUsername().equals(username)){ System.out.println("删除用户"+username); userList.remove(user); } } } /** * 用户的登录信息 */ @Override public User login(String username, String userpassword) { for(User user : userList){ if( user.getUsername().equals(username) && user.getUserpassword().equals(userpassword)){ System.out.println(username+"用户登录成功!"); return user; } } return null; } /** * 查询出所有的用户信息 */ @Override public List<User> list() { return userList; } }
然后我们来编写:sun-jaxws.xml文件
<?xml version="1.0" encoding="UTF-8"?> <endpoints version = "2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"> <endpoint name="UserServiceImpl" implementation="com.tangkai.wsdl.UserServiceImpl" url-pattern="/us"></endpoint> </endpoints>
name 与service中的名称保持一致,implementation为实现类的全路径。
接下来我们来配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>mywsdl</display-name> <servlet> <servlet-name>UserServiceImpl</servlet-name> <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UserServiceImpl</servlet-name> <url-pattern>/us</url-pattern> </servlet-mapping> <listener> <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class> </listener> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
注意这里的service-name的名称与service的名称保持一致
最后我们将jaxws-ri-2.2.8 中\jaxws-ri-2.2.8\jaxws-ri\lib下的jar包拷贝到项目的lib目录下就可以了最后我们来配置一下Tomcat,具体的配置信息查看这里:http://m635674608.iteye.com/blog/1563504
最后我们将项目部署到Tomcat上面,启动Tomcat,打开浏览器在地址栏中输入:http://localhost:8080/mywsdl/us?wsdl
看到与图片相同,即表示发布成功!
最后我们来做一个完整的测试:
这里我所使用的工具是SOAP-UI
这里简单介绍一下SOAP-UI的使用:
1.到soapui的bin目录下找到soapui.bat文件点击运行
2.新建项目:
3.打开我们的项目:我们首先测试一下delete方法:
4.点击绿色的运行按钮运行之后会在Eclipse的控制台输出结果删除、添加、登录的控制台输出结果如下:
这样已经说明我们的程序已经没有问题了,当然你也可以自己编写一个客户端进行测试,
网上建立客户端的程序有很多我这里就不做详细的介绍了。
最后附上源码:http://download.csdn.net/detail/tangkai007/6817847