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