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命令參數熟知:

-d:生成class文件。默認參數。

-s:生成Java文件

-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());
    }
}

直接運行這個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是錯誤的,會報空指針異常
下面的是正確的,是實際使用成功的:
這裏寫圖片描述
注:這個問題網上很多人遇到的,但是我按照他們的方法都沒解決成功,現在發出來做個參考。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章