A.对WebService的理解 B.实现简单WebService的实例
A.
WebService一般分为两种:
REST式WebService,基于HTTP协议;
RPC式WebService,基于SOAP协议,不过SOAP也是基于HTTP传输的。
狭义上的WebService是指第二种RPC式的WebService,也就是我们常说的那种。
JAVA中有三种WebService规范,分别是JAX-WS(JAX-RPC)、JAX-RS(REST)、JAXM&SAAJ。
具体的实现技术有jdk6,CXF,Axis和X-Fire 。
JAX-WS简单点说就是基于JDK的注解来实现WebService。
MyEclipse集成了三种WebService实现方式JaxWS,xFire,Rest。
优势:跨语言、跨平台,SOA思想的实现;安全性高;可以用来兼容legacy系统的功能
劣势:性能相对差,不支持两阶段事务
B.
(一)简单的webservice: myeclipse上基于JAX-WS开发Webservice(中文示例):http://horizonhyg.iteye.com/blog/378046
(二)简单的webservice(使用axis):
所需文件:
1.server-config.wsdd(/web-inf/)
2.web.xml(/web-inf/)
3.axis
4.名称为webservice(任意取名)的工程
5.axis/lib/下的所有包
一。下载axis包,解压后取出/webapps/axis下的axis文件夹,放到tomcat的webapps文件夹下// http://localhost:8080/axis/services/Login.jws?wsdl地址中的axi
二。修改:在axis/web-inf/web.xml中添加配置:
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern> //http://localhost:8080/axis/services/Login.jws?wsdl地址中的services
</servlet-mapping>
三。修改:在axis/web-inf文件夹下新增server-config.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">
<globalConfiguration>
<parameter name="sendMultiRefs" value="true"/>
<parameter name="disablePrettyXML" value="true"/>
<parameter name="dotNetSoapEncFix" value="true"/>
<parameter name="enableNamespacePrefixOptimization" value="false"/>
<parameter name="sendXMLDeclaration" value="true"/>
<parameter name="sendXsiTypes" value="true"/>
<parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>
</globalConfiguration>
<handler type="java:org.apache.axis.handlers.http.URLMapper" name="URLMapper"/>
<service name="Login.jws" provider="java:RPC"> //http://localhost:8080/axis/services/Login.jws?wsdl地址中的Login.jws
<parameter name="className" value="server.SayHello"/> //目标类
<parameter name="scope" value="request"/>
<parameter name="allowedMethods" value="*"/>
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper"/>
</requestFlow>
</transport>
</deployment>
四。新建名称为webservice的工程
五。在工程下新建类并提供方法:
package server;
public class SayHello {
public String getName(String name)
{
return "hello====>" + name;
}
}
到此已经可以测试了:
a.将类编译好的class文件拷贝到axis/web-inf/classes/server/路径下;
b.启动tomcat
c.在浏览器地址栏中输入:http://localhost:8080/axis/services/Login.jws?wsdl,如果能看见一个文件,这是发布的接口API,可以看见上边定义的SayHello()这个方法,这时表示
WebService配置成功。
六。客户端访问方法
package client;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class TestClient {
public static void main(String[] args) throws Exception {
// 指出service所在URL
String endpoint = "http://127.0.0.1:8080/axis/services/Login.jws";
// 创建一个服务(service)调用(call)
Service service = new Service();
Call call = (Call) service.createCall();// 通过service创建call对象
// 设置service所在URL
call.setTargetEndpointAddress(new java.net.URL(endpoint));
// 方法名(processService)与MyService.java方法名保持一致
call.setOperationName("getAge");
// Object 数组封装了参数,参数为"This is Test!",调用processService(String arg)
String ret = (String) call.invoke(new Object[] { 12 });
System.out.println(ret);
}
}
(三)简单的WebService(注解方式),参:http://blog.163.com/jiawei28888@126/blog/static/7997376920127163923793/
Annotation 1
@WebService(name="Example", targetNamespace="http://www.jsoso.com/wstest", serviceName="Example")
@WebService标签主要将类暴露为WebService,其中targetNamespace属性定义了自己的命名空间,serviceName则定义了< definitions >标签和<service>标签的name属性。
Annotation 2:
@SOAPBinding(style=SOAPBinding.Style.RPC)
@SOAPBinding标签定义了WSDL文档中SOAP的消息协议,其中style属性对应SOAP的文档类型,可选的有RPC和DOCUMENT
Annotation 3:
@WebMethod(operationName="toSayHello",action="sayHello",exclude=false)
@WebMethod定义Web Service运作的方法, 属性action 对应操作的活动 ,如<soap:operation soapAction="sayHello" /> 属性operationName匹配的wsdl:operation 的名称,如<operation name="toSayHello" parameterOrder="userName"> 属性exclude 用于阻止将某一继承方法公开为web服务,默认为false
Annotation 4:
@WebResult(name="returnWord")
@ WebResult定义方法返回值得名称,如<part name="returnWord" type="xsd:string" />
Annotation 5:
@WebParam(partName="person", mode=Mode.IN
@WebParam定义方法的参数名称,如<part name="person" type="tns:person" />,其中mode属性表示参数的流向,可选值有IN / OUT / INOUT
简单实现:
1.新建web service project 名称为:WebService
2.新建Hello接口,Hello.java如下:
package com.server;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
/**
* @author Pant
* @version 创建时间:2013-9-18 下午4:04:21
*/
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface Hello {
@WebResult(name = "HelloString") //可选,对应WSDL文件中:<message name="sayResponse"><part name="HelloString" type="xsd:string"/></message>
//@WebResult(name = "HelloString[]") 此方式有误,不能带有“[]”符号
public String say(String words);
}
3.新建Hello的实现类:HelloImpl.java如下:
package com.server;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
/**
* @author Pant
* @version 创建时间:2013-9-18 下午4:05:11
*/
@WebService(endpointInterface="com.server.Hello")
public class HelloImpl implements Hello {
@WebMethod
public String say(String words) {
return " hello " + words;
}
}
4.发布注册:
public class Main {
public static void main(String[] args) {
Endpoint.publish("http://localhost:8080/Webservice2/Hello", new HelloImpl());
System.out.println("发布成功");
}
}
到此已经可以测试了:
a.启动tomcat
b.在浏览器地址栏中输入:http://localhost:8080/Webservice2/Hello?wsdl,如果能看见一个xml文件,这是发布的接口API,可以看见上边定义的say()这个方法,这时表示
WebService配置成功。