对于webservice,说实话一直以来都是没有动手写过,因为工作中几乎都是调用其他人提供的接口,大学时候也没有仔细的学过,所以对于这块很陌生。
最近正在看一些招聘信息,虽然说没有打算最近跳槽,但是看到上面一些自己中意的公司都是要求会webservice,刚好最近有空,所以就写下了这个学习axis的博文了。
具体的axis的介绍,我就不多说了,百度网上一大堆,直接就是上代码吧 :
1、建立一个web项目,将axis的jar包,放到lib中。jar包下载地址(jar包下载地址)。
2、打开web.xml,添加如下内容:
<!--start of webservice setting -->
<servlet>
<servlet-name>axis</servlet-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>axis</servlet-name>
<url-pattern>/webservice/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SOAPMonitorService</servlet-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>SOAPMonitorService</servlet-name>
<url-pattern>/SOAPMonitor</url-pattern>
</servlet-mapping>
<!-- end of webservice setting -->
3、新建HelloWebservice.java
package com.webservice;
public class HelloWebservice {
public String doService(String name) {
String result = "Hello " + name;
return result;
}
}
4、在WEB-INF下新建server-config.wsdd文件
<?xml version="1.0" encoding="UTF-8"?>
<deployment name="defaultClientConfig"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
xmlns:handler="http://xml.apache.org/axis/wsdd/providers/handler"
xmlns="http://xml.apache.org/axis/wsdd/">
<globalConfiguration name="defaultClientConfig">
<requestFlow name="RequestFlow1" type="">
<handler name="Handler1" type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="session" />
</handler>
<handler name="Handler2" type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="request" />
<parameter name="extension" value=".jwr" />
</handler>
</requestFlow>
</globalConfiguration>
<handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper" />
<handler name="LocalResponder"
type="java:org.apache.axis.transport.local.LocalResponder" />
<handler name="Authenticate"
type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />
<transport name="http" type="">
<requestFlow name="RequestFlow1" type="">
<handler name="Handler1" type="URLMapper" />
<handler name="Handler2"
type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />
</requestFlow>
</transport>
<transport name="local" type="">
<responseFlow name="ResponseFlow1" type="">
<handler name="Handler1" type="LocalResponder" />
</responseFlow>
</transport>
<!-- 每个webservice均需要一个如下配置,name为访问时的请求名 -->
<!--返回的是简单类型 -->
<service name="helloService" provider="java:RPC" style="rpc"
use="encoded">
<parameter name="scope" value="Request" />
<!-- className为实际访问的服务类 -->
<parameter name="className" value="com.webservice.HelloWebservice" />
<!-- allowedMethods为实际访问的服务方法 -->
<parameter name="allowedMethods" value="doService" />
</service>
</deployment>
5、启动项目,在浏览器输入http://localhost:8080/项目名/webservice/helloService?wsdl,出现如下的页面,就是代表着ok了。
要是没有出现上面的图片,查看部署的项目,class文件是否全都编译,配置文件是否都齐全。
6、用soap调用这个接口:
其他的基本类型的,几乎都是这样,搞定这些之后,我便是想要做个能够返回自定义实体bean的webservice接口了。
开始返回自定义实体bean的websevice开发:
1、在上面的项目中,新建学生类Student:
package com.webservice;
import java.io.Serializable;
public class Student implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getStuAge() {
return stuAge;
}
public void setStuAge(String stuAge) {
this.stuAge = stuAge;
}
public int getStuId() {
return stuId;
}
public void setStuId(int stuId) {
this.stuId = stuId;
}
private String stuName;
private String stuAge;
private int stuId;
}
2、新建获取学生的业务类GetStuService:
package com.webservice;
public class GetStuService {
public Student getStudentById(int stuId) {
Student student = new Student();
student.setStuId(stuId);
student.setStuName("小杰");
student.setStuAge("23");
return student;
}
}
3、在server-config.wsdd中,添加:
<!-- 返回自定义实体类 -->
<service name="getStuService" provider="java:RPC" style="rpc"
use="encoded">
<parameter name="scope" value="Request" />
<!-- className为实际访问的服务类 -->
<parameter name="className" value="com.webservice.GetStuService" />
<!-- allowedMethods为实际访问的服务方法 -->
<parameter name="allowedMethods" value="getStudentById" />
<beanMapping languageSpecificType="java:com.webservice.Student"
qname="ns1:Student" xmlns:ns1="com.webservice" />
<typeMapping languageSpecificType="java:com.webservice.Student"
qname="ns1:Student" xmlns:ns1="com.webservice"
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" />
<namespace>com.webservice</namespace>
</service>
注意,没有添加下面的这段代码:
<beanMapping languageSpecificType="java:com.webservice.Student"
qname="ns1:Student" xmlns:ns1="com.webservice" />
<typeMapping languageSpecificType="java:com.webservice.Student"
qname="ns1:Student" xmlns:ns1="com.webservice"
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" />
会报错:
No serializer found for class com.webservice.Student in registry org.apache.axis.encoding.TypeMappingDelegate@13e39a7c
解决错误的方法,网上百度也能够找到,可以自己去看看
4、启动项目,输入http://localhost:8080/axisProject/webservice/getStuService?wsdl,会出现下面的页面:
5、soapuI调用这个接口,会出现如下的返回值:
6、重新建一个项目,通过wsdl自动生成客户端:
7、新建ClientTest测试类:
package webservice.com;
import java.rmi.RemoteException;
public class ClientTest {
public static void main(String[] args) throws RemoteException {
String endPoint = "http://localhost:8080/axisProject/webservice/getStuService?wsdl";
GetStuServiceProxy proxy = new GetStuServiceProxy(endPoint);
Student student = proxy.getStudentById(1);
System.out.println("student[stuId=" + student.getStuId() + ",stuName=" + student.getStuName() + ",stuAge="
+ student.getStuAge() + "]");
}
}
好吧,以上就是axis开发出来的服务端返回自定义实体bean的所有代码了。
webservice这东西还是要自己多写吧,我也在不断的学习,会不断的更新博客的。
源码已经上传:地址(源码下载地址),下载解压后有两个包:axisProject和axisClinet,前者是服务端,后者是客户端,先执行服务端后执行客户端。有问题的话,直接留言。