Web Service實戰
- 2019 年 10 月 4 日
- 筆記
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/qq_37933685/article/details/80204964
個人博客:https://suveng.github.io/blog/
Web Service實戰
什麼是webservice?
webservice 有的人一看到這個,估計會認為這個是一種新技術,一種新框架。
其實不是,嚴格的說,webservice是一種跨平台,跨語言的規範,用於不同平台,不同語言開發的應用之間的交互。
這裡具體舉個例子,比如在Windows Server服務器上有個C#.Net開發的應用A,在Linux上有個Java語言開發的應用B,
B應用要調用A應用,或者是互相調用。用於查看對方的業務數據。
再舉個例子,天氣預報接口。無數的應用需要獲取天氣預報信息;這些應用可能是各種平台,各種技術實現;而氣象局的項目,估計也就一兩種,要對外提供天氣預報信息,這個時候,如何解決呢?
webservice就是出於以上類似需求而定義出來的規範;
開發人員一般就是在具體平台開發webservice接口,以及調用webservice接口;每種開發語言都有自己的webservice實現框架。比如Java 就有 Apache Axis1、Apache Axis2、Codehaus XFire、Apache CXF、Apache Wink、Jboss RESTEasyd等等…

AXIS2 也是Webservice服務開發的一個優良框架。
————–以下AXIS2 特性說明 摘自百度百科———————–
Axis2是下一代 Apache Axis。Axis2 雖然由 Axis 1.x 處理程序模型提供支持,但它具有更強的靈活性並可擴展到新的體系結構。Axis2 基於新的體系結構進行了全新編寫,而且沒有採用 Axis 1.x 的常用代碼。支持開發 Axis2 的動力是探尋模塊化更強、靈活性更高和更有效的體系結構,這種體系結構可以很容易地插入到其他相關 Web 服務標準和協議(如 WS-Security、WS-ReliableMessaging 等)的實現中。
————–以上AXIS2 特性說明 摘自百度百科———————–
下面就AXIS2的webService服務如何發佈和開發進行實踐
一、目標:
1)axis2 環境準備
2)服務端開發和發佈
- 客戶端的開發
二、axis2環境準備
整個開發環境如下:
主機:
- windows10
- eclipse:jee-oxygen
- tomcat 8.5
- axis2 1.7.4
- java1.8
1、axis2的框架軟件的獲取
axis2 可以從 http://ws.apache.org/axis2/ 這個網址獲取。我們一般獲取的war包(部署到tomcat下)和bin 二進制包(用到一些裏面的工具)
2、下載後部署到發佈服務器上
將war.zip解壓後,部署到本地的tomcat 環境中webapps目錄 …/apache-tomcat-6.0.48/webapps。啟動tomcat後,會自動將war包解壓成目錄,我們只要看一下下面url是否能順利打開,就可以知道axis2是否部署成功。
三、服務端的開發與部署
服務端一般有兩種部署方式:
1) POJO 簡單java 對象方式,這種方式要求部署的java對象,不帶包名
- 利用axis2管理平台發佈,編輯service.xml進行發佈(更常用,靈活度高)
1. POJO方式部署和開發
由於不帶包名,因為相關的類就放在一個地方。我們在myeclipse裏面,建立一個web project工程StudyWsAxis2Student。(不選web service project 是因為默認用的是jax-ws 作為webService 框架)。工程裏面,我們建幾個類。 實體類:student, 實體DAO接口和實現, 實體操作類(這個作為要暴露的service服務)。
工程目錄如下圖所示:

StudentOpt.java 是pojo 類,需要開放的服務方法要設置為 public ,其他的為private屬性。
StudentOpt
import java.util.ArrayList; import java.util.List; import com.study.dao.StudentDAO; import com.study.dao.impl.StudentDAOImpl; import com.study.entity.Student; public class StudentOpt { private List<String> listStudentInfo = new ArrayList<String>(); private StudentDAO studentDAO; public StudentOpt() { System.out.println("studentDAO is init"); studentDAO = new StudentDAOImpl(); } private StudentDAO getStudentDAO() { return studentDAO; } private void setStudentDAO(StudentDAO studentDAO) { this.studentDAO = studentDAO; } public boolean addStudent(String name, String sex, String birthday) { // 調用studentDAO.addStudent 方法入庫 System.out.println("Now put student into DB!"); studentDAO.addStudent(name, sex, birthday); return true; } public String queryStudent(String studentName) { System.out.println("queryStudent->"+studentName); if (studentDAO.queryStudent(studentName) == null) { return "null"; } else { return studentDAO.queryStudent(studentName).to_string(); } } }
其他的文件, Student.java 是 實體類,StudentDao是實體操作接口,StudentDaoImpl 是實體操作實現類。 StudentSimlationDB是一個模擬數據庫類,就是記錄一下addStudent操作的結果用的。這些代碼如下:
StudentDAO.java
package com.study.dao; import com.study.entity.Student; public interface StudentDAO { //學生操作,新增學生 boolean addStudent(String name, String sex, String birthday); //學生操作,刪除學生 boolean delStudent(Student student); //學生操作,修改學生信息 boolean modifyStudent(Student student); //學生操作,查詢學生信息,查詢到返回學生對象,否則返回null Student queryStudent( String StudentName); }
StudentDAOImpl.java
package com.study.dao.impl; import com.study.dao.StudentDAO; import com.study.entity.Student; public class StudentDAOImpl implements StudentDAO { @Override public boolean addStudent(String name, String sex, String birthday) { // TODO Auto-generated method stub System.out.println("addStudent begin!"); Student tmpStudent = new Student(); tmpStudent.setName(name); tmpStudent.setSex(sex); tmpStudent.setBirthday(birthday); StudentSimlationDB.getInstance().listStudent.add( tmpStudent); for(Student stu:StudentSimlationDB.getInstance().listStudent){ System.out.println(stu.to_string()); } return false; } @Override public boolean delStudent(Student student) { // TODO Auto-generated method stub return false; } @Override public boolean modifyStudent(Student student) { // TODO Auto-generated method stub return false; } @Override public Student queryStudent(String StudentName) { // TODO Auto-generated method stub //模擬從數據庫中查詢學生名 System.out.println("queryStudent begin!"); for(Student aStudent : StudentSimlationDB.getInstance().listStudent ) { if(aStudent.getName().equals(StudentName) ){ System.out.println("queryStudent Infomation successfully !"); return aStudent; } else{ System.out.println("queryStudent Infomation failture !"); } } return null; } }
StudentSimlationDB.java
package com.study.dao.impl; import java.util.ArrayList; import java.util.List; import com.study.entity.Student; //模擬數據庫,目的是對student操作的時候,可以記錄操作的內容 public class StudentSimlationDB { public List<Student > listStudent=new ArrayList<Student>(); private static StudentSimlationDB instance = null; private StudentSimlationDB(){} public static StudentSimlationDB getInstance() {// 實例化引用 if (instance == null) { instance = new StudentSimlationDB(); } return instance; } }
Student.java
package com.study.entity; import java.util.List; public class Student { String Name; String Sex; String Birthday; 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 String getBirthday() { return Birthday; } public void setBirthday(String birthday) { Birthday = birthday; } public String to_string(){ String str ="Name="+this.getName()+";Sex="+this.getSex()+";Birthday="+this.getBirthday(); return str; } }
將編譯後StudentOpt.class 複製到 tomcat目錄下的webappsaxis2WEB-INFpojo,一般情況下pojo目錄是不存在的,需要自己手工建立。然後將其他類,上傳到tomcat的lib 目錄

因為POJO是需要調用 這些沒有暴露的對象,因此需要找到這些依賴的對象。部署好了後,可以啟動tomcat。(注意POJO類是熱部署但是不是熱更新)啟動完成後,可以看到暴露的webservice接口服務了。URL如下:localhost:8080/axis2

不編寫客戶端,我們可以通過 url方式來操作或者soapui工具來驗證服務端是否正確,這裡不細說了。
1)URL操作
增加學生:localhost:8080/axis2/services/StudentOpt/addStudent?name=Tom&sex=male&birthday=20010512
查詢學生:localhost:8080/axis2/services/StudentOpt/queryStudent?studentName=Tom
2. web serverice打包成war發佈到Tomcat
可以在webapps目錄下以war方式部署服務,相關的內容部署在一個目錄下,更加便於管理
首先我們看一下開發環境如何調試:
1)建立工程,編寫業務邏輯代碼
我們新建一個web project工程StudyWSAxis2Student2,在這個工程裏面,Student,StudentDAO,StudentDAOImpl,StudentSimlationDB 這些類不變,我們將StudentWs 移到com.study.axis2ws 包下,確保工程都能編譯無錯誤。

StudentWs.java
package com.study.axis2ws; import java.util.ArrayList; import java.util.List; import com.study.dao.StudentDAO; import com.study.dao.impl.StudentDAOImpl; import com.study.entity.Student; public class StudentWs { private List<String> listStudentInfo = new ArrayList<String>(); private StudentDAO studentDAO; public StudentWs() { System.out.println("studentDAO is init"); studentDAO = new StudentDAOImpl(); } private StudentDAO getStudentDAO() { return studentDAO; } private void setStudentDAO(StudentDAO studentDAO) { this.studentDAO = studentDAO; } public boolean addStudent(String name, String sex, String birthday) { // 調用studentDAO.addStudent 方法入庫 System.out.println("Now put student into DB!"); studentDAO.addStudent(name, sex, birthday); return true; } public String queryStudent(String studentName) { System.out.println("queryStudent->"+studentName); if (studentDAO.queryStudent(studentName) == null) { return "null"; } else { return studentDAO.queryStudent(studentName).to_string(); } } public static void main(String[] args) { StudentWs studentWs = new StudentWs(); studentWs.addStudent("Tom", "male", "20110314"); System.out.println(studentWs.queryStudent("Tom")); } }
2)axis2 環境嵌入到myeclipse裏面
在myeclipse的WebRoot下,從之前安裝axis的tomcat裏面,webapps/axis2/WEB-INF 目錄下,拷貝 conf、 modules、services、lib 目錄都拷貝到工程的WebRoot/WEB-INF目錄下,如下圖所示:
D:. │ .classpath │ .project │ ├─.settings │ .jsdtscope │ org.eclipse.jdt.core.prefs │ org.eclipse.wst.common.component │ org.eclipse.wst.common.project.facet.core.xml │ org.eclipse.wst.jsdt.ui.superType.container │ org.eclipse.wst.jsdt.ui.superType.name │ ├─build │ └─classes │ └─com │ └─study │ ├─axis2ws │ │ StudentWs.class │ │ │ ├─dao │ │ │ StudentDAO.class │ │ │ │ │ └─impl │ │ StudentDAOImpl.class │ │ StudentSimlationDB.class │ │ │ └─entity │ Student.class │ ├─src │ └─com │ └─study │ ├─axis2ws │ │ StudentWs.java │ │ │ ├─dao │ │ │ StudentDAO.java │ │ │ │ │ └─impl │ │ StudentDAOImpl.java │ │ StudentSimlationDB.java │ │ │ └─entity │ Student.java │ └─WebContent ├─META-INF │ MANIFEST.MF │ └─WEB-INF │ web.xml │ ├─conf │ axis2.xml │ ├─lib │ activation-1.1.jar │ activation-LICENSE.txt │ antlr-2-LICENSE.txt │ antlr-2.7.7.jar │ apache-mime4j-core-0.7.2.jar │ apache-mime4j-core-LICENSE.txt │ axiom-api-1.2.20.jar │ axiom-dom-1.2.20.jar │ axiom-impl-1.2.20.jar │ axiom-jaxb-1.2.20.jar │ axiom-LICENSE.txt │ axis2-adb-1.7.4.jar │ axis2-adb-codegen-1.7.4.jar │ axis2-clustering-1.7.4.jar │ axis2-codegen-1.7.4.jar │ axis2-corba-1.7.4.jar │ axis2-fastinfoset-1.7.4.jar │ axis2-java2wsdl-1.7.4.jar │ axis2-jaxbri-1.7.4.jar │ axis2-jaxws-1.7.4.jar │ axis2-jibx-1.7.4.jar │ axis2-json-1.7.4.jar │ axis2-kernel-1.7.4.jar │ axis2-LICENSE.txt │ axis2-metadata-1.7.4.jar │ axis2-mtompolicy-1.7.4.jar │ axis2-saaj-1.7.4.jar │ axis2-soapmonitor-servlet-1.7.4.jar │ axis2-spring-1.7.4.jar │ axis2-transport-http-1.7.4.jar │ axis2-transport-local-1.7.4.jar │ axis2-xmlbeans-1.7.4.jar │ bcel-findbugs-6.0.jar │ bcel-LICENSE.txt │ commons-cli-1.2.jar │ commons-cli-LICENSE.txt │ commons-codec-1.3.jar │ commons-codec-LICENSE.txt │ commons-fileupload-1.3.1.jar │ commons-fileupload-LICENSE.txt │ commons-httpclient-3.1.jar │ commons-httpclient-LICENSE.txt │ commons-io-2.1.jar │ commons-io-LICENSE.txt │ commons-logging-1.1.1.jar │ commons-logging-LICENSE.txt │ geronimo-annotation-LICENSE.txt │ geronimo-annotation_1.0_spec-1.1.jar │ geronimo-jaxws-LICENSE.txt │ geronimo-jaxws_2.2_spec-1.0.jar │ geronimo-jta-LICENSE.txt │ geronimo-jta_1.1_spec-1.1.jar │ geronimo-saaj-LICENSE.txt │ geronimo-saaj_1.3_spec-1.0.1.jar │ geronimo-stax-api-LICENSE.txt │ geronimo-stax-api_1.0_spec-1.0.1.jar │ geronimo-ws-metadata-LICENSE.txt │ geronimo-ws-metadata_2.0_spec-1.1.2.jar │ gson-2.1.jar │ gson-LICENSE.txt │ httpclient-4.5.2.jar │ httpclient-LICENSE.txt │ httpcore-4.4.4.jar │ httpcore-LICENSE.txt │ jalopy-LICENSE.txt │ jaxb-api-2.2.6.jar │ jaxb-api-LICENSE.txt │ jaxb-impl-2.2.6.jar │ jaxb-impl-LICENSE.txt │ jaxb-xjc-2.2.6.jar │ jaxb-xjc-LICENSE.txt │ jaxen-1.1.6.jar │ jaxen-LICENSE.txt │ jaxws-tools-2.2.6.jar │ jaxws-tools-LICENSE.txt │ jettison-1.3.jar │ jettison-LICENSE.txt │ jibx-bind-1.2.jar │ jibx-bind-LICENSE.txt │ jibx-run-1.2.jar │ jibx-run-LICENSE.txt │ jsr311-api-1.1.1.jar │ jsr311-api-LICENSE.txt │ juli-6.0.16.jar │ juli-LICENSE.txt │ log4j-1.2.15.jar │ log4j-LICENSE.txt │ mail-1.4.jar │ mail-LICENSE.txt │ mex-1.7.4-impl.jar │ neethi-3.0.3.jar │ neethi-LICENSE.txt │ stax2-api-3.1.1.jar │ stax2-api.LICENSE.txt │ tribes-6.0.16.jar │ tribes-LICENSE.txt │ woden-core-1.0M10.jar │ woden-core-LICENSE.txt │ woodstox-core-asl-4.2.0.jar │ woodstox-core-asl-LICENSE.txt │ wsdl4j-1.6.2.jar │ wsdl4j-LICENSE.txt │ xalan-2.7.0.jar │ xalan-LICENSE.txt │ xml-resolver-1.2.jar │ xml-resolver-LICENSE.txt │ xmlbeans-2.5.0.jar │ xmlbeans-LICENSE.txt │ xmlschema-core-2.2.1.jar │ xmlschema-core-LICENSE.txt │ ├─modules │ addressing-1.7.4.mar │ axis2-jaxws-mar-1.7.4.mar │ mex-1.7.4.mar │ modules.list │ mtompolicy-1.7.4.mar │ ping-1.7.4.mar │ scripting-1.7.4.mar │ soapmonitor-1.7.4.mar │ └─services │ services.list │ version-1.7.4.aar │ └─StudentWs └─META-INF services.xml
3) 修改配置文件web.xml (WebRoot/WEB-INF )

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>StudyWSAxis2Student2</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 加載Axis --> <servlet> <servlet-name>AxisServlet</servlet-name> <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> </web-app>
- 修改 WebRoot/WEB-INF/services/StudentWs/META-INF/ 下的services.xml
-
<service name="StudentWs"> <description> Student Web Service </description> <parameter name="ServiceClass"> com.study.axis2ws.StudentWs </parameter> <operation name="addStudent"> <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </operation> <operation name="queryStudent"> <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </operation> </service>
在項目上,右鍵,選運行 server Application

首先打war包:在工程右鍵菜單裏面旋轉 export
選擇保存war包的地方,一般我們就放置在工程下

測試
