版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37933685/article/details/80204964
个人博客:https://suveng.github.io/blog/
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 可以从 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对象,不带包名
由于不带包名,因为相关的类就放在一个地方。我们在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目录下的\webapps\axis2\WEB-INF\pojo,一般情况下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
可以在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>
<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包的地方,一般我们就放置在工程下
测试