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配置成功。