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。
下面的是正確的,是實際使用成功的:
注:這個問題網上很多人遇到的,但是我按照他們的方法都沒解決成功,現在發出來做個參考。