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

posted @ 2014-01-07 09:51  唐凯  阅读(510)  评论(0编辑  收藏  举报