CXF安装及webservice的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hc_ttxs/article/details/82842036

下载地址

CXF官方下载地址:http://mirrors.hust.edu.cn/apache/cxf/

安装

在Windows环境变量配置:

CXF_HOME=D:\IDE\CXF\apache-cxf-3.2.4
Path=D:\IDE\CXF\apache-cxf-3.2.4\bin
##CLASSPATH可以不用
CLASSPATH=.;%CXF_HOME%\lib\cxf-manifest.jar
  
  
  • 1
  • 2
  • 3
  • 4

验证:

这里写图片描述

由于在工作中需求要用到webservice技术,进行数据交换。研究了一下webservice,网上资料很多,看的一头雾水,找到几篇能做出来的博客,而且还比较简单,加上个人在使用过程中遇到的一些问题和想法在此分享一下。
环境:win10 64位,eclipse,jdk1.7,tomcat v7.0
参考博客:
http://blog.csdn.net/qq_18860653/article/details/53758555
http://blog.csdn.net/hanxuemin12345/article/details/40163757
http://blog.csdn.net/greatfeather/article/details/46010277
说明:博客①中的方法能实现,但是我感觉有点复杂。
博客②中的方法使用注解方式发布,较简单。
博客③中的方法和spring结合在一起,我用的是②和③结合的。


一.在Java项目中发布一个WebService服务:

这里写图片描述
建立一个JavaWebService的web项目,建立相对应的com.test.javabean,com.test.servlet,com.test.webservice包

1.*类Student,这个是实体

    package com.test.javabean;  

import java.io.Serializable;  

public class Student implements Serializable{  

    private String ID;  
    private String Name;  
    private String Sex;  
    private int age;  
    public String getID() {  
        return ID;  
    }  
    public void setID(String iD) {  
        ID = iD;  
    }  
    public String getName() {  
        return Name;  
    }  
    public void setName(String name) {  
        Name = name;  
    }  
    public String getSex() {  
        return Sex;  
    }  
    public void setSex(String sex) {  
        Sex = sex;  
    }  
    public int getAge() {  
        return age;  
    }  
    public void setAge(int age) {  
        this.age = age;  
    }
    @Override
    public String toString() {
        return "Student [ID=" + ID + ", Name=" + Name + ", Sex=" + Sex + ", age=" + age + "]";
    }     

}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

2.*类CStudentServlet,这个类是将发布服务的代码放到servlet里面了,然后写入配置文件,可以自己启动,自己发布。

package com.test.servlet;  

import java.io.IOException;  
import java.net.InetAddress;  
import java.net.UnknownHostException;  
import java.util.Properties;  

import javax.jws.WebService;  
import javax.servlet.*;  
import javax.servlet.annotation.WebServlet;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import javax.xml.ws.Endpoint;  

import com.test.webservice.CStudent;  

public class CStudentServlet extends HttpServlet{  
    /** 
     * @see Servlet#init(ServletConfig) 
     */  
    public void init(ServletConfig config) throws ServletException {  
        // TODO Auto-generated method stub  
        super.init(config);  
        System.out.println("正在启动WebService服务:http://192.168.56.1:8082/JavaWebService/Student");  
        Endpoint.publish("http://localhost:8083/JavaWebService/Student", new CStudent());//这个端口号8083按自己tomcat的实际端口来设置,默认的是8080
    }  

    /** 
     * @see Servlet#getServletConfig() 
     */  
    public ServletConfig getServletConfig() {  
        // TODO Auto-generated method stub  
        return null;  
    }  

    /** 
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
     */  
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        // TODO Auto-generated method stub  
    }  

    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {   
        System.out.println("进入WSServlet的service()方法");  
    }  
    /** 
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
     */  
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        // TODO Auto-generated method stub  
    }  

} 
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

3.**类CStudent,这个类里面的方法是服务真正发布出去的。
package com.test.webservice;

import javax.jws.WebService;  

import com.test.javabean.Student;  

@WebService  
public class CStudent {  
    public Student getStudent(String name) throws java.rmi.RemoteException{  
        Student student = new Student();  
        student.setName(name);  
        student.setAge(14);  
        student.setID("25");  
        student.setSex("Male");  
        return student;  

    }  
}  

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

注:关键在@webservice的注解。类上面加@webservice注解,就代表这个类里面的方法都对外发布,详细解释参考百度。

4.下一步需要将servlet配置为自启动,您只要在web.xml中增加如下内容就可以了:
这里写图片描述

<servlet>
        <servlet-name>CStudentServlet</servlet-name>
        <servlet-class>com.test.servlet.CStudentServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>CStudentServlet</servlet-name>
        <url-pattern>/servlet/CStudentServlet</url-pattern>
    </servlet-mapping>
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这里写图片描述
这样写完,启动服务器,就可以自动运行servlet,发布服务了。

5.在tomcat中发布JavaWebService.不知道如何发布的看上面③中的链接。
这里写图片描述

6.tomcat启动成功以后,打开浏览器,输入http://localhost:8083/JavaWebService/Student?wsdl
//这个端口号8083按自己tomcat的实际端口来设置,默认的是8080
(就是服务器端的按个链接加上?wsdl),回车,如果看到下面图说明服务已经发布成功。
这里写图片描述
根据WSDL文档来在客户端编写代码,访问发布的服务;

但是,WSDL文档看不懂怎么办?代码该如何编写?

——你看不懂,JDK看得懂,wsimport是JDK自带的,可以根据WSDL文档生成客户端调用代码的工具。无论服务器端WebService使用什么语言编写的,豆浆在客户端生成Java代码。所以服务器用什么语言编写的并不重要。

wsimport.exe命令参数熟知:

-d:生成class文件。默认参数。

-s:生成Java文件

  
  
  • 1
  • 2
  • 3

-p:自定义包结构
二.配置客户端和编写客户端程序。
1.服务端已经配置好,服务已经发布,接下来客户端要调用发布的服务。
解析地址生成源码到本地磁盘。打开命令行窗口:
这里写图片描述
这里我先定位到D盘,然后输入wsimport -s . http://localhost:8083/JavaWebService/Student?wsdl
//这个端口号8083按自己tomcat的实际端口来设置,默认的是8080
回车,如果出现的和图上一样,说明解析成功,如果报错:有几点可能忽略
1)-s左右都有空格
2)-s后面有个”.”,点左右都有空格。
3)?注意中英文。这里用的是英文”?”,”?”

解析成功以后打开D盘,
这里写图片描述
注意文件夹名字,这里文件夹名字是和服务器端的包名对应的,文件夹下面有些文件,class,和java文件,我们需要的是java文件。

2.新建一个java项目(客户端)
这里写图片描述
如图所示建个包:com.test.webservice,将步骤1中文件夹里面的java文件复制进来。这些类都是写客户端程序依赖的。
在建立一个包,里面存放测试类ClientDemo
这里写图片描述

*类ClientDemo

package com.test.client;

import com.test.webservice.CStudent;
import com.test.webservice.CStudentService;
import com.test.webservice.Student;

public class ClientDemo {
    public static void main(String[] args) {
        CStudentService cstudentservice=new CStudentService();
        CStudent cstudent=cstudentservice.getCStudentPort();

        //下面是具体方法调用。
        Student student=cstudent.getStudent("同学一号");//调用了服务端getStudent方法将名字传了进去。
        //输出看一下结果。
        System.out.println("姓名:"+student.getName()+"年龄:"+student.getAge());
    }
}

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

直接运行这个main方法,会输出结果。
这里写图片描述
其中第9行代码就是创建了个服务对象,相当于创建了个和服务端的链接

第10行是获取端口,这个都是固定写的。自己服务端发布服务的那个类,解析完成以后都会生成“类名+Service”的类。例:CStudent和CstudentService.

到此就实现了websrvice在eclipse上部署客户端和服务端。

三.遇到的问题。
1.一般用这个都是要和现有项目结合。上面只是个例子,在实际用的时候,我的是把服务端部分加到了现有的spring项目中,servlet那个可以很好地和现有项目结合,直接打开tomcat就可以自动发布服务。
2.如果服务端不需要用到web项目可以直接把servlet中发布服务的那俩句话写到main方法中手动发布。
3.在和现有项目结合时候服务器端写的方法要用到原先的接口的方法,如图,我要用到PersonServiceInter中的方法,如果使用了@Resource,会报错,空指针异常,原因是webservice没有和spring结合起来,不能使用spring中的注入。所有后来使用了,BeanFactory.getBean的方式获取到personServiceImpl。
加@Resource是错误的,会报空指针异常
下面的是正确的,是实际使用成功的:
这里写图片描述
注:这个问题网上很多人遇到的,但是我按照他们的方法都没解决成功,现在发出来做个参考。

猜你喜欢

转载自blog.csdn.net/hc_ttxs/article/details/82842036