1. 程式人生 > >eclipse中配置webservice的客戶端和服務端

eclipse中配置webservice的客戶端和服務端

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