zoukankan      html  css  js  c++  java
  • eclipse中搭建webservice的客户端和服务端

    由于在工作中需求要用到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 + "]";
    }

    }

    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
    }

    }

    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;

    }
    }

    注:关键在@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>

    这样写完,启动服务器,就可以自动运行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命令参数熟知:

    二.配置客户端和编写客户端程序。
    1.服务端已经配置好,服务已经发布,接下来客户端要调用发布的服务。
    解析地址生成源码到本地磁盘。打开命令行窗口:

    这里我先定位到D盘,然后输入wsimport -s . http://localhost:8083/JavaWebService/Student?wsdl
    //这个端口号8083按自己tomcat的实际端口来设置,默认的是8080
    回车,如果出现的和图上一样,说明解析成功,如果报错:有几点可能忽略
    1)-s左右都有空格
    2)-s后面有个".",点左右都有空格。
    3)?注意中英文。这里用的是英文"?","?"

    解析成功以后打开E盘,

    注意文件夹名字,这里文件夹名字是和服务器端的包名对应的,文件夹下面有些文件,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());
    }
    }

    直接运行这个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。

    下面的是正确的,是实际使用成功的:

    注:这个问题网上很多人遇到的,但是我按照他们的方法都没解决成功,现在发出来做个参考。


    ---------------------
    原文:https://blog.csdn.net/qq_37698433/article/details/70631988

  • 相关阅读:
    Pixar 故事公式
    你想住在中国哪里
    tar.gz方式安装nacos设置使用systemct进行service方式的管理并设置开机自启动
    记一个nginx server_name配置多个时的坑
    linux软链接的创建、修改和删除
    阿里云SLB的健康检查配置
    (转载)bullet安装之——windows下的安装与VS开发
    [译] 找到ndarray中的重复行
    [译] 对dataframe数据按照某列值进行分组,分组后连接字符串
    [译] 如何将列表嵌套列表的情况转化成一维列表
  • 原文地址:https://www.cnblogs.com/Bkxk/p/10656003.html
Copyright © 2011-2022 走看看