刚开始接触axis1.4,参考了一下网站上的例子,也是云里雾里,所以系统的记录下自己搭建axis项目及应用的全过程。
1.准备环境
1)官网上下载axis-bin-1_4.zip,官网地址http://www.eu.apache.org/dist/axis/axis/java/1.4/
2)下载完成后,解压,将解压文件放到磁盘目录中,我这里放置的目录为D:\software\
3)配置环境变量
AXIS_HOME=D:\software\axis-1_4
AXIS_LIB=%AXIS_HOME%\lib
AXISCLASSPATH=%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons- discovery.jar;%AXIS_LIB%\commons-logging.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;
注意检查AXISCLASSPATH中jar包的名字,看是否带有版本,名字一定要lib中的jar包名字对应上
2.构建web工程
新建web工程,将%AXIS_HOME%\lib下的jar包引入到工程中,在web.xml中添加
<listener>
<listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
</listener>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<display-name>Apache-Axis Servlet</display-name>
<servlet-class>
org.apache.axis.transport.http.AxisServlet
</servlet-class>
</servlet>
<servlet>
<servlet-name>AdminServlet</servlet-name>
<display-name>Axis Admin Servlet</display-name>
<servlet-class>
org.apache.axis.transport.http.AdminServlet
</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet>
<servlet-name>SOAPMonitorService</servlet-name>
<display-name>SOAPMonitorService</display-name>
<servlet-class>
org.apache.axis.monitor.SOAPMonitorService
</servlet-class>
<init-param>
<param-name>SOAPMonitorPort</param-name>
<param-value>5001</param-value>
</init-param>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SOAPMonitorService</servlet-name>
<url-pattern>/SOAPMonitor</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>5</session-timeout>
</session-config>
<mime-mapping>
<extension>wsdl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xsd</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
3.编写服务端代码,这里贴上我写的代码
两个实体类
Book.java:
package com.axis.serviceside.entity;
import java.io.Serializable;
public class Book implements Serializable{
private String bookName;
private float price;
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
*************************************************************************************************
Person.java:
package com.axis.serviceside.entity;
import java.io.Serializable;
public class Person implements Serializable{
private String name;
private Book book;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
}
****************************************************************************************************************
一个服务类:
PersonInfoService.java:
package com.axis.serviceside.service;
import com.axis.serviceside.entity.Book;
import com.axis.serviceside.entity.Person;
public class PersonInfoService {
public String getPersonInfo(){
Person p = new Person();
p.setName("jiangxl");
Book b = new Book();
b.setBookName("jiangcheng");
b.setPrice(3.2f);
p.setBook(b);
return p.getName()+":"+p.getBook().getBookName();
}
public String getPersonInfo(String name){
Person p = new Person();
p.setName(name);
Book b = new Book();
b.setBookName("jiangcheng");
b.setPrice(3.2f);
p.setBook(b);
return p.getName()+":"+p.getBook().getBookName();
}
public String getPersonInfo(Person p){
Book b = new Book();
b.setBookName("jiangcheng");
b.setPrice(3.2f);
p.setBook(b);
return p.getName()+":"+p.getBook().getBookName();
}
}
4.在web-info文件夹下新建deploy.wsdd文件
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="businessService" provider="java:RPC">
<parameter name="className"
value="com.axis.serviceside.service.PersonInfoService" /> <!-- 对应 PersonInfoService的全路径(所在包+类名)-->
<parameter name="allowedMethods" value="getPersonInfo" /> <!-- 允许发布的方法,为*则发布类中定义的全部public方法,如果指定多个可使用,隔开 -->
<beanMapping qname = "myNS:Person" xmlns:myNS="urn:PersonInfo"
languageSpecificType="java:com.axis.serviceside.entity.Person" /> <!--复杂参数传递所需,该例子中因PersonInfoService第三个方法getPersonInfo(Person p) 请求参数为一个对象,需要序列化-->
</service>
</deployment>
这里还要多解释下beanMapping
<beanMapping qname="前缀:本地名" xmlns:前缀=“urn:名称空间” languageSpecificType="java:自定义类型的全路径(这里就是Person类的全路径)"
5.发布项目
将项目发布到tomcat路径下,我这里发布到了D:\software\apache-tomcat-7.0.59\wtpwebapps路径下,运行tomcat,然后打开cmd,进入发布到项目路径的WEB-INFO目录下,我进入的是D:\software\apache-tomcat-7.0.59\wtpwebapps\mywebapp\WEB-INF,mywebapp是我的项目名称,运行命令
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient -lhttp://localhost:8081/mywebapp/services/BusinessService deploy.wsdd
这是你会发现在web-info下生成了server-config.wsdd文件,刷新http://localhost:8081/mywebapp/services/businessService?wsdl看是否能打开,打开说明发布成功了。
6.编写客户端代码
1)调用无参方法
package com.axis.client;
import java.net.URL;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
import com.axis.serviceside.entity.Book;
import com.axis.serviceside.entity.Person;
public class TestClient {
public static void main(String[] args) {
try {
String endPoint = "http://localhost:8081/mywebapp/services/businessService"; //
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new URL(endPoint));
//调用带有Person对象的getPersonInfo方法采用 开始
//QName qn = new QName("urn:PersonInfo", "Person");
//call.registerTypeMapping(Person.class, qn,
//new BeanSerializerFactory(
//
//Person.class, qn),
//
//new BeanDeserializerFactory(Person.class, qn));
//
//
//Person person = new Person();
//
//person.setName("Kiah Han");
////结束
call.setOperationName(new QName(
"http://service.serviceside.axis.com", "getPersonInfo"));
String ret = (String) call.invoke(new Object[] {});
System.out.println("Sent 'Hello!', got '" + ret + "'");
} catch (Exception e) {
e.printStackTrace();
}
}
}
************************************************************************************************************************
调用有参数方法,参数为string类型
package com.axis.client;
import java.net.URL;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
import com.axis.serviceside.entity.Book;
import com.axis.serviceside.entity.Person;
public class TestClient {
public static void main(String[] args) {
try {
String endPoint = "http://localhost:8081/mywebapp/services/businessService"; //
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new URL(endPoint));
//调用带有Person对象的getPersonInfo方法采用 开始
//QName qn = new QName("urn:PersonInfo", "Person");
//call.registerTypeMapping(Person.class, qn,
//new BeanSerializerFactory(
//
//Person.class, qn),
//
//new BeanDeserializerFactory(Person.class, qn));
//
//
//Person person = new Person();
//
//person.setName("Kiah Han");
////结束
call.setOperationName(new QName(
"http://service.serviceside.axis.com", "getPersonInfo"));
String ret = (String) call.invoke(new Object[] {"test"});
System.out.println("Sent 'Hello!', got '" + ret + "'");
} catch (Exception e) {
e.printStackTrace();
}
}
}
*******************************************************************************************************************
调用有参数方法,参数类型为对象
package com.axis.client;
import java.net.URL;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
import com.axis.serviceside.entity.Book;
import com.axis.serviceside.entity.Person;
public class TestClient {
public static void main(String[] args) {
try {
String endPoint = "http://localhost:8081/mywebapp/services/businessService"; //
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new URL(endPoint));
//调用带有Person对象的getPersonInfo方法采用 开始
QName qn = new QName("urn:PersonInfo", "Person");
call.registerTypeMapping(Person.class, qn,
new BeanSerializerFactory(
Person.class, qn),
new BeanDeserializerFactory(Person.class, qn));
Person person = new Person();
person.setName("Kiah Han");
//结束
call.setOperationName(new QName(
"http://service.serviceside.axis.com", "getPersonInfo"));
String ret = (String) call.invoke(new Object[] {person});
System.out.println("Sent 'Hello!', got '" + ret + "'");
} catch (Exception e) {
e.printStackTrace();
}
}
}
这样一个简单的基于axis1.4方法的webservice项目就开发完成了