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)服務端開發和發佈

  1. 客戶端的開發

二、axis2環境準備

整個開發環境如下:

主機:

  1. windows10
  2. eclipse:jee-oxygen
  3. tomcat 8.5
  4. axis2 1.7.4
  5. 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對象,不帶包名

  1. 利用axis2管理平台發佈,編輯service.xml進行發佈(更常用,靈活度高)

1. POJO方式部署和開發

由於不帶包名,因為相關的類就放在一個地方。我們在myeclipse裏面,建立一個web project工程StudyWsAxis2Student。(不選web service project 是因為默認用的是jax-ws 作為webService 框架)。工程裏面,我們建幾個類。 實體類:student, 實體DAO接口和實現, 實體操作類(這個作為要暴露的service服務)。

工程目錄如下圖所示:

![img](C:Users13441DesktopmdWebServiceWeb Service實戰.assets20170120165748997.png)

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 目錄

![img](C:Users13441DesktopmdWebServiceWeb Service實戰.assets20170120171148473.png)

因為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>
  1. 修改 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包的地方,一般我們就放置在工程下

測試