转:利用Java编写简单的WebService实例/*?*?File?name:?HelloService.java?*??*?Version:?v1.0?*??*?Create
转:利用Java编写简单的WebService实例
/*
?*?File?name:?HelloService.java
?*?
?*?Version:?v1.0
?*?
?*?Created?on?Aug?2,?2008?9:40:20?AM
?*?
?*?Designed?by?Stephen
?*?
?*?(c)Copyright?2008
?*/
package?com.sinosoft.webservice;
/**
?*?@author?Stephen
?*?
?*?Test?web?service
?*/
public?class?HelloService?{
????/**
?????*?不带参数的函数
?????*?
?????*?@return?返回Hello字符串
?????*/
????public?String?sayHello()?{
????????return?"Hello";
????}
????/**
?????*?带参数的函数
?????*?
?????*?@param?name
?????*????????????名称
?????*?@return?返回加上名称的欢迎词
?????*/
????public?String?sayHelloToPerson(String?name)?{
????????if?(name?==?null?||?name.equals(""))?{
????????????name?=?"nobody";
????????}
????????return?"Hello?"?+?name;
????}
}
发布WebService
????? 要将上边写的HelloService类发布为WebService,需要先搭建Web应用。下面是在Tomcat下使用Axis创建WebService服务的例子。
在Tomcat下创建Web应用
???? 在该例子中,在Tomcat下创建了一个context path为ws的WEB应用。
?????1. 在Tomcat的webapps下创建如下文件系统
??????????ws
???????????????WEB-INF
????????????????????lib
????????????????????classes
?????2. 在WEB-INF文件夹下创建web.xml文件,该文件的内容如下:
?
<?xml?version="1.0"?encoding="ISO-8859-1"?>
<!DOCTYPE?web-app?PUBLIC?"-//Sun?Microsystems,?Inc.//DTD?Web
Application?2.3//EN"?"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
??<display-name>Apache-Axis</display-name>
????
????<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>
?<!--?uncomment?this?if?you?want?the?admin?servlet?-->
?<!--
??<servlet-mapping>
????<servlet-name>AdminServlet</servlet-name>
????<url-pattern>/servlet/AdminServlet</url-pattern>
??</servlet-mapping>
?-->
????<session-config>
????????<!--?Default?to?5?minute?session?timeouts?-->
????????<session-timeout>5</session-timeout>
????</session-config>
????<!--?currently?the?W3C?havent?settled?on?a?media?type?for?WSDL;
????http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
????for?now?we?go?with?the?basic?'it's?XML'?response?-->
??<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>
??<welcome-file-list?id="WelcomeFileList">
????<welcome-file>index.jsp</welcome-file>
????<welcome-file>index.html</welcome-file>
????<welcome-file>index.jws</welcome-file>
??</welcome-file-list>
</web-app>
?
?????在上面的web.xml中主要是配置了axis的相关配置。
axis的相关配置
?????在上述的web.xml文件中已经对axis进行了配置,但是还需要进行额外的配置。
?????复制axis相关的jar文件
?????将axis的相关jar文件复制到WEB-INF\lib文件夹下。这些文件包括:
activation.jar
axis.jar
axis-ant.jar
axis-schema.jar
commons-discovery-0.2.jar
commons-logging-1.0.4.jar
jaxrpc.jar
log4j-1.2.8.jar
mailapi.jar
saaj.jar
wsdl4j-1.5.1.jar
xmlsec-1.3.0.jar
?????复制WebService服务主文件
?????将HelloService.java编译后的class文件复制到WEB-INF\classes文件夹下,也就是说在WEB-INF\classes文件夹下的文件夹结构为:com\sinosoft\webservice,在webservice文件夹下有一个helloservice.class文件。
测试发布的Web应用
?????启动Tomcat服务,打开IE浏览器,访问地址http:host:port/ws/services,如果看到如下界面就说明AXIS部署成功了。
?
?
发布WebService
?????发布WebService需要使用现有的AdminService来实现,这里我写了一个批处理文件来发布WebService,以后如果需要发布其他文件,只需要修改相应的参数就可以了。
创建deploy.wsdd文件
?????文件deploy.wsdd内容如下所示:
?
<?xml?version="1.0"?encoding="UTF-8"?>
<deployment?xmlns="http://xml.apache.org/axis/wsdd/"?xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
????<service?name="HelloServices"?provider="java:RPC">
????????<parameter?name="className"?value="com.sinosoft.webservice.HelloService"/>
????????<parameter?name="allowedMethods"?value="*"/>
????</service>
</deployment>
创建发布WebService服务的批处理文件
?????批处理文件deploywebservice.bat内容如下:
?
java?-cp?E:\Stephen\Lib\axislib\activation.jar;E:\Stephen\Lib\axislib\axis-ant.jar;E:\Stephen\Lib\axislib\axis-schema.jar;E:\Stephen\Lib\axislib\axis.jar;E:\Stephen\Lib\axislib\commons-discovery-0.2.jar;E:\Stephen\Lib\axislib\commons-logging-1.0.4.jar;E:\Stephen\Lib\axislib\jaxrpc.jar;E:\Stephen\Lib\axislib\log4j-1.2.8.jar;E:\Stephen\Lib\axislib\mailapi.jar;E:\Stephen\Lib\axislib\saaj.jar;E:\Stephen\Lib\axislib\wsdl4j-1.5.1.jar;E:\Stephen\Lib\axislib\xmlsec-1.3.0.jar?org.apache.axis.client.AdminClient?-lhttp://localhost:8090/ws/services/AdminService?deploy.wsdd
?????其中E:\Stephen\Lib\axislib是存放axis对应的jar文件的文件夹,现在将所有的jar文件都加入到classpath中进行执行。
?????-l后的参数是本地要发布WebService的AdminService对应的访问地址。
?????最后deploy.wsdd是对应的配置文件名称。
发布WebService服务
?????将deploy.wsdd文件和deploywebservice.bat文件复制到同一个文件夹下,执行deploywebservice.bat批处理文件,就可以将deploy.wsdd中描述的Java类发布为WebService。发布完成之后在访问http://host:port/ws/services如下图所示:
?
?
?
从上图可以看出,发布成功后,多了一个HelloServices的服务。这样就说明HelloService发布成功了。
查看HelloServices的wsdl
?????访问http://host:port/ws/services/HelloServices?wsdl可以看到如下wsdl的内容:
?
<?xml?version="1.0"?encoding="UTF-8"?>
<wsdl:definitions?targetNamespace="http://localhost:8090/ws2/services/HelloServices"?xmlns:apachesoap="http://xml.apache.org/xml-soap"?xmlns:impl="http://localhost:8090/ws2/services/HelloServices"?xmlns:intf="http://localhost:8090/ws2/services/HelloServices"?xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"?xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"?xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"?xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL?created?by?Apache?Axis?version:?1.3
Built?on?Oct?05,?2005?(05:23:37?EDT)-->
???<wsdl:message?name="sayHelloResponse">
??????<wsdl:part?name="sayHelloReturn"?type="soapenc:string"/>
???</wsdl:message>
???<wsdl:message?name="sayHelloToPersonResponse">
??????<wsdl:part?name="sayHelloToPersonReturn"?type="soapenc:string"/>
???</wsdl:message>
???<wsdl:message?name="sayHelloToPersonRequest">
??????<wsdl:part?name="name"?type="soapenc:string"/>
???</wsdl:message>
???<wsdl:message?name="sayHelloRequest">
???</wsdl:message>
???<wsdl:portType?name="HelloService">
??????<wsdl:operation?name="sayHello">
?????????<wsdl:input?message="impl:sayHelloRequest"?name="sayHelloRequest"/>
?????????<wsdl:output?message="impl:sayHelloResponse"?name="sayHelloResponse"/>
??????</wsdl:operation>
??????<wsdl:operation?name="sayHelloToPerson"?parameterOrder="name">
?????????<wsdl:input?message="impl:sayHelloToPersonRequest"?name="sayHelloToPersonRequest"/>
?????????<wsdl:output?message="impl:sayHelloToPersonResponse"?name="sayHelloToPersonResponse"/>
??????</wsdl:operation>
???</wsdl:portType>
???<wsdl:binding?name="HelloServicesSoapBinding"?type="impl:HelloService">
??????<wsdlsoap:binding?style="rpc"?transport="http://schemas.xmlsoap.org/soap/http"/>
??????<wsdl:operation?name="sayHello">
?????????<wsdlsoap:operation?soapAction=""/>
?????????<wsdl:input?name="sayHelloRequest">
????????????<wsdlsoap:body?encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"?namespace="http://webservice.sinosoft.com"?use="encoded"/>
?????????</wsdl:input>
?????????<wsdl:output?name="sayHelloResponse">
????????????<wsdlsoap:body?encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"?namespace="http://localhost:8090/ws2/services/HelloServices"?use="encoded"/>
?????????</wsdl:output>
??????</wsdl:operation>
??????<wsdl:operation?name="sayHelloToPerson">
?????????<wsdlsoap:operation?soapAction=""/>
?????????<wsdl:input?name="sayHelloToPersonRequest">
????????????<wsdlsoap:body?encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"?namespace="http://webservice.sinosoft.com"?use="encoded"/>
?????????</wsdl:input>
?????????<wsdl:output?name="sayHelloToPersonResponse">
????????????<wsdlsoap:body?encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"?namespace="http://localhost:8090/ws2/services/HelloServices"?use="encoded"/>
?????????</wsdl:output>
??????</wsdl:operation>
???</wsdl:binding>
???<wsdl:service?name="HelloServiceService">
??????<wsdl:port?binding="impl:HelloServicesSoapBinding"?name="HelloServices">
?????????<wsdlsoap:address?location="http://localhost:8090/ws2/services/HelloServices"/>
??????</wsdl:port>
???</wsdl:service>
</wsdl:definitions>
用Java调用WebService实例
?????下面是用Java调用刚发布的WebService例子。
?
/*
?*?File?name:?TestHelloService.java
?*?
?*?Version:?v1.0
?*?
?*?Created?on?Aug?2,?2008?9:54:10?AM
?*?
?*?Designed?by?Stephen
?*?
?*?(c)Copyright?2008
?*/
package?test.com.sinosoft.webservice;
import?java.io.IOException;
import?java.net.MalformedURLException;
import?javax.xml.namespace.QName;
import?javax.xml.rpc.ServiceException;
import?org.apache.axis.client.Call;
import?org.apache.axis.client.Service;
import?org.apache.commons.logging.Log;
import?org.apache.commons.logging.LogFactory;
/**
?*?@author?Stephen
?*?
?*?测试调用WebService
?*/
public?class?TestHelloService?{
????private?static?final?Log?log?=?LogFactory.getLog(TestHelloService.class);
????private?static?final?String?HELLO_SERVICE_ENDPOINT?=?"http://localhost:8090/ws/services/HelloServices?wsdl";
????public?static?void?main(String[]?args)?{
????????TestHelloService?tester?=?new?TestHelloService();
????????//?tester.callSayHello();
????????tester.callSayHelloToPerson();
????}
????public?void?callSayHello()?{
????????try?{
????????????Service?service?=?new?Service();
????????????Call?call?=?(Call)?service.createCall();
????????????call.setTargetEndpointAddress(new?java.net.URL(
????????????????????HELLO_SERVICE_ENDPOINT));
????????????call.setOperationName(new?QName("http://webservice.sinosoft.com/",
????????????????????"sayHello"));
????????????call.setReturnType(org.apache.axis.Constants.XSD_STRING);
????????????try?{
????????????????String?ret?=?(String)?call.invoke(new?Object[]?{});
????????????????System.out.println("The?return?value?is:"?+?ret);
????????????????return;
????????????}?catch?(IOException?e)?{
????????????????e.printStackTrace();
????????????}
????????}?catch?(MalformedURLException?e)?{
????????????e.printStackTrace();
????????}?catch?(ServiceException?e)?{
????????????e.printStackTrace();
????????}
????????log.error("call?sayHello?service?error!");
????}
????public?void?callSayHelloToPerson()?{
????????try?{
????????????Service?service?=?new?Service();
????????????Call?call?=?(Call)?service.createCall();
????????????call.setTargetEndpointAddress(new?java.net.URL(
????????????????????HELLO_SERVICE_ENDPOINT));
????????????call.setOperationName(new?QName("http://webservice.sinosoft.com/",
????????????????????"sayHelloToPerson"));
????????????call.addParameter("name",?org.apache.axis.Constants.XSD_STRING,
????????????????????javax.xml.rpc.ParameterMode.IN);
????????????call.setReturnType(org.apache.axis.Constants.XSD_STRING);
????????????try?{
????????????????String?ret?=?(String)?call.invoke(new?Object[]?{?"Stephen"?});
????????????????System.out.println("The?return?value?is:"?+?ret);
????????????????return;
????????????}?catch?(IOException?e)?{
????????????????e.printStackTrace();
????????????}
????????}?catch?(MalformedURLException?e)?{
????????????e.printStackTrace();
????????}?catch?(ServiceException?e)?{
????????????e.printStackTrace();
????????}
????????log.error("call?sayHello?service?error!");
????}
}
??分类:?WebService标签:?webservice,?java,?axis