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包的地方,一般我们就放置在工程下

测试