2013.9.22 关于WebService的理解

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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值