`
hujin1979
  • 浏览: 80186 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用javax创建webservice服务

 
阅读更多

 

什么是WebServices?
    它是一种构建应用程序的普遍模型,可以在任何支持网络通信的操作系统中实施运行;它是一种新的web应用程序分支,是自包含、自描述、模块化的应用,可以发布、定位、通过web调用。Web Service是一个应用组件,它逻辑性的为其他应用程序提供数据与服务.各应用程序通过网络协议和规定的一些标准数据格式(Http,XML,Soap)来访问Web Service,通过Web Service内部执行得到所需结果.Web Service可以执行从简单的请求到复杂商务处理的任何功能。一旦部署以后,其他Web Service应用程序可以发现并调用它部署的服务。
关键的技术和规则
   在构建和使用Web Service时,主要用到以下几个关键的技术和规则:
  1.XML:描述数据的标准方法.
  2.SOAP:表示信息交换的协议.
  3.WSDL:Web服务描述语言.
   4.UDDI:通用描述、发现与集成,它是一种独立于平台的,基于XML语言的用于在互联网上描述商务的协议。
   XML
   可扩展的标记语言(XML)是Web service平台中表示数据的基本格式。除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关的。无关性是比技术优越性更重要的:软件厂商是不会选择一个由竞争对手所发明的技术的。
   SOAP
   SOAP是web service的标准通信协议,SOAP为simple object access protocoll的缩写,简单对象访问协议. 它是一种标准化的传输消息的XML消息格式。
   WSDL
   WSDL的全称是web service Description Language,是一种基于XML格式的关于web服务的描述语言。其主要目的在于web service的提供者将自己的web服务的所有相关内容,如所提供的服务的传输方式,服务方法接口,接口参数,服务路径等,生成相应的完全文档,发布给使用者。使用者可以通过这个WSDL文档,创建相应的SOAP请求消息,通过HTTP传递给webservice提供者;web服务在完成服务请求后,将SOAP返回消息传回请求者,服务请求者再根据WSDL文档将SOAP返回消息解析成自己能够理解的内容。
   UDDI
   将web service进行UDDI注册发布,UDDI是一种创建注册表服务的规范,以便大家将自己的web service进行注册发布供使用者查找.然而当服务提供者想将自己的web service向全世界公布,以便外部找到其服务时,那么服务提供者可以将自己的web service注册到相应的UDDI商用注册网站,目前全球有IBM等4家UDDI商用注册网站。因为WSDL文件中已经给定了web service的地址URI,外部可以直接通过WSDL提供的URI进行相应的web service调用。所以UDDI并不是一个必需的web service组件,服务方完全可以不进行UDDI的注册。
签于webservice开发C/S或B/S结构中的重要性,一直在研究其原理。本章主要讲述使用JDK自带的javax扩展包创建webservice服务的过程。我们创建通用性高的web服务接口时一般采取java基础类型来作为参数传递和返回,比如string,byte[],int等。string多采用XML格式来进行规范化交互,byte[]常用来进行二进制的处理,这样使用web service可以做很多设计了。
我们提供一个范式的服务器端代码:
import javax.annotation.Resource;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.WebServiceContext;
 
import com.sun.net.httpserver.HttpExchange;
import com.ue.dto.CrackBean;
import com.ue.server.CrackControl;
import com.ue.util.ConvertUtils;
@WebService (name = "client" , targetNamespace = "http://ws.ue.com", serviceName = "client" )
@SOAPBinding (style = SOAPBinding .Style. RPC)
public class CrackClientImp implements CrackClient
{
       @Resource
       private WebServiceContext wsContext ;
 
       private String getIp()
      {
            HttpExchange exchange = (HttpExchange) wsContext .getMessageContext().get("com.sun.xml.internal.ws.http.exchange" );
            String remortAddress = exchange.getRemoteAddress().getAddress().getHostAddress();
             return remortAddress;
      }
       // 获得破解开
       @WebMethod (operationName = "getCrack" , action = "getCrack", exclude = false )
       @WebResult (name = "returnWord" )
       public byte [] getCrack ()
      {
             byte [] defaultvalue = "" .getBytes();
             byte [] code = null;
            
            CrackControl c = CrackControl. getInstance();
            CrackBean bean = c.take();
             if (bean != null)
            {
                   byte [] name = bean.getTypeName().getBytes();
                   byte [] pack = ConvertUtils.intToBytes4(name. length );
                   byte [] content = bean.getContent();
                  code = new byte [content. length + pack. length + name.length ];
                  System. arraycopy(pack, 0, code, 0, pack. length);
                  System. arraycopy(name, 0, code, pack. length, name.length );
                  System. arraycopy(content, 0, code, pack. length + name.length , content.length );
            }
             if (code== null){
                   //throw new RuntimeException("Exception in getCrack()");
                  code = defaultvalue;                
            }
             return code;
      }
       // 获得破解开
       @WebMethod (operationName = "crack" , action = "crack", exclude = false )
       public void crack (@WebParam (partName = "id")
      String id, @WebParam (partName = "crackValue" )
      String crackValue)
      {
            CrackControl c = CrackControl. getInstance();
            c.setCrackCode(id, crackValue);
      }
       // 获得破解开
       @WebMethod (operationName = "unCrack" , action = "unCrack", exclude = false )
       public void unCrack (@WebParam (partName = "id")
      String id)
      {
            CrackControl c = CrackControl. getInstance();
            c.unCrack(id);
      }
       @WebMethod (operationName = "getPackLength" , action = "getPackLength" , exclude = false)
       @WebResult (name = "returnWord" )
       public int getPackLength (@WebParam (partName = "p")
       byte [] p)
      {
             int value = 0;
             if (p.length >= 4)
            {
                   byte [] bytes = new byte[4];
                  System. arraycopy(p, 0, bytes, 0, 4);
                  value = ConvertUtils. byteToInt(bytes);
            }
             return value;
      }
}
public class Server
{
       public static void main(String[] args) throws IOException   {            
            CrackServerImp server = new CrackServerImp();
             /*
             * 发布Web Service
             */
            String ip = InetAddress. getLocalHost().getHostAddress();
            Endpoint clientEndpoint = Endpoint. publish( "http://" + ip + ":7000/client" ,server );
            Binding clientBinding = clientEndpoint.getBinding();
            List<Handler> clientHandlerChain = new LinkedList<Handler>();
            clientHandlerChain.add( new ClientTraceHandler());
            clientBinding. setHandlerChain(clientHandlerChain);
 }
}
Annotation 1:@WebService(name="client", targetNamespace="http://ws.ue.com", serviceName="client")
@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="getCrack",action="getCrack",exclude=false)
@WebMethod定义Web Service运作的方法,
属性action 对应操作的活动 ,如<soap:operation soapAction="getCrack" />
属性operationName匹配的wsdl:operation 的名称,如<operation name="getCrack" parameterOrder="userName">
属性exclude 用于阻止将某一继承方法公开为web服务,默认为false
 
Annotation 4:@WebResult(name="returnWord")
@ WebResult定义方法返回值得名称,如<part name="returnWord" type="xsd:string" />
在产生的WSDL文档中,message元素反映了这个变化:
 
<message name="getTimeAsString"/>
<message name="getTimeAsStringResponse">
    <part name="time_response" type="xsd:string"/>
</message>
<message name="getTimeAsElased"/>
<message name="getTimeAsElasedResponse">
    <part name="time_response" type="xsd:long"/>
</message>
 
没有添加@WebResult注解之前,WSDL文档中,message元素是这样的:
 
<message name="getTimeAsString"/>
<message name="getTimeAsStringResponse">
    <part name="return" type="xsd:string"/>
</message>
<message name="getTimeAsElased"/>
<message name="getTimeAsElasedResponse">
    <part name="return" type="xsd:long"/>
</message> 
两个message元素对比,我们可以看出,return标签被换成了time_response,也就是@WebResult注解定义的。在从web服务返回的SOAP消息中也同样反映出了这点变化,以调用getTimeAsString服务方法为例: 
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns2:getTimeAsStringResponse xmlns:ns2="http://ts.ch01/">
            <time_response>Mon Mar 17 10:41:13 CST 2014</time_response>
        </ns2:getTimeAsStringResponse>
    </S:Body>
</S:Envelope>
没有添加@WebResult注解时,SOAP消息返回是这样的: 
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns2:getTimeAsStringResponse xmlns:ns2="http://ts.ch01/">
            <return>Mon Mar 17 10:46:30 CST 2014</return>
        </ns2:getTimeAsStringResponse>
    </S:Body>
</S:Envelope> 
从SOAP消息对比中,我们也可以看到,return标签也相应地被替换成了time_response标签。假设我们只对getTimeAsString增加@WebResult注解,那么返回的SOAP消息中针对该服务操作使用time_response标签,而针对getTimeAsElapsed服务操作所返回的SOAP消息中仍然使用默认的return标签。
Annotation 5:@WebParam(partName="person", mode=Mode.IN
@WebParam定义方法的参数名称,如<part name="person" type="tns:person" />,其中mode属性表示参数的流向,可选值有IN / OUT / INOUT
 
我们提供一个范式的客户器端代码:
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
 
@WebServiceClient (name = "client" , targetNamespace = "http://ws.ue.com", wsdlLocation = "http://10.0.108.194:7000/client?wsdl" )
public class ClientService extends Service
{
 
       private final static URL CLIENT_WSDL_LOCATION;
 
       static
      {
            URL url = null ;
             try
            {
                  url = new URL("http://10.0.108.194:7000/client?wsdl" );
            }
             catch (MalformedURLException e)
            {
                  e.printStackTrace();
            }
             CLIENT_WSDL_LOCATION = url;
      }
 
       public ClientService(URL wsdlLocation, QName serviceName)
      {
             super (wsdlLocation, serviceName);
      }
 
       public ClientService()
      {
             super ( CLIENT_WSDL_LOCATION, new QName( "http://ws.ue.com" , "client" ));
      }
 
       /**
       *
       * @return returns Client
       */
       @WebEndpoint (name = "clientPort" )
       public Client getClientPort()
      {
             return (Client) super.getPort( new QName( "http://ws.ue.com" , "clientPort" ), Client. class);
      }
}
 
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
 
 
@WebService (name = "client" , targetNamespace = "http://ws.ue.com", serviceName = "client" )
@SOAPBinding (style = SOAPBinding .Style. RPC)
public interface Client
{
       // 获得破解开
       @WebMethod (operationName = "getCrack", action = "getCrack" , exclude = false )
       @WebResult (name = "returnWord" )
       public byte [] getCrack();
 
       // 获得破解开
       @WebMethod (operationName = "crack", action = "crack" , exclude = false )
       public void crack( @WebParam(partName = "id" )
      String id, @WebParam (partName = "crackValue" )
      String crackValue);
 
       @WebMethod (operationName = "getPackLength", action = "getPackLength" , exclude = false)
       @WebResult (name = "returnWord" )
       public int getPackLength( @WebParam(partName = "p" )
       byte [] p);
 
       // 不填了
       @WebMethod (operationName = "unCrack", action = "unCrack" , exclude = false )
       public void unCrack( @WebParam(partName = "id" )
      String id);
}
 
import com.ue.dto.CrackBean;
import com.ue.ws.client.Client;
import com.ue.ws.client.ClientService;
import com.ue.ws.client.HandlerResolverImp;
 
public class TestClient
{
       public static void main(String[] args)
      {
            ClientService cs = new ClientService();
            HandlerResolver hr = new HandlerResolverImp("ue" , "ue123456" );
            cs.setHandlerResolver(hr);
            Client c = cs.getClientPort();             
             byte [] bytes = c.getCrack();
             byte [] p = new byte[4];
            System. arraycopy(bytes, 0, p, 0, 4);
            
             int cl = c.getPackLength(p);      
             byte [] typeName = new byte[cl];
            System. arraycopy(bytes, 4, typeName, 0, cl);            
            
             byte [] content = new byte[bytes. length -cl-4];
            System. arraycopy(bytes, cl+4, content, 0, content. length );
            
            CrackBean cb = new CrackBean( new String(typeName),content);
            System. out .println(cb.getTypeName());
      }
}
 
当然我们完全可以使用Xfire搭建基于B/S架构的web service,这个在之前的文章中已经有讲述。javax的好处是完全脱离servlet容器的支持,我们就可以搭建非web体系的服务,有时候我们选择这样做或许更好。

 

分享到:
评论

相关推荐

    使用Myeclipse 创建WebService 项目服务端

    在Java源代码目录下创建一个新的Java类,通常命名为"IWebService",并使用`@WebService`注解标识它为一个Web服务接口。例如: ```java import javax.jws.WebService; @WebService public interface IWebService { ...

    利用MyEclipse快速创建webService服务

    在IT行业中,Web服务是一种广泛使用的通信协议,它允许不同应用程序之间进行数据交换。MyEclipse作为一款强大的Java集成开发环境(IDE),提供了便捷的方式来创建和部署Web Service服务。本篇将详细介绍如何利用...

    java6创建webservice,原来这么简单啊

    要调用Web服务,Java 6提供了`javax.xml.ws.Service`类,可以根据WSDL URL创建一个服务代理。例如: ```java URL url = new URL("http://localhost:8080/HelloWorldService?wsdl"); QName qname = new QName(...

    springboot+webservice搭建webservice服务端

    2. **实例化服务代理**:使用`javax.xml.ws.Service`接口创建服务代理对象。 3. **调用服务方法**:通过服务代理对象调用Web Service接口方法。 ```java // 创建服务代理 HelloWorldService service = new ...

    javax-ws java自带webservice实现方式

    在Java中,`javax.ws` 包提供了一种内置的方式来实现Web服务,使得开发者可以方便地创建和消费Web服务。本篇文章将深入探讨Java自带的Web服务实现方式,主要涉及`javax.ws`的相关知识点。 ### 1. Web服务基础 Web...

    发布webService服务接口与spring整合教程

    你也可以使用Spring-WS或Apache CXF等库来创建WSDL并部署服务。 4. **测试和调试**:确保编写了单元测试来验证Web Service接口的功能。你还可以使用工具(如SoapUI)进行功能测试和性能测试。 5. **注意兼容性**:...

    springboot+webservice搭建webservice服务端及使用java客户端两种方式进行调用webservice接口

    总结,本教程详细介绍了如何利用Spring Boot和Apache CXF搭建Web Service服务端,以及使用JAX-WS的`javax.xml.ws.Service`和Apache CXF的`JaxWsProxyFactoryBean`两种方式实现Java客户端调用。这些技能对于开发者来...

    jax webservice 服务器和客户端示例程序

    通过使用注解,如`@WebService`、`@SOAPBinding`等,可以轻松定义服务接口和服务实现。 2. **创建服务器端服务** - **定义服务接口**:首先,我们需要定义一个Java接口,用`@WebService`注解标记,接口中的方法...

    开发基于JWS的webservice并通过jun-jaxws发布所需的jar包

    Java Web Service (JWS) 是一种使用Java技术构建Web服务的方法,它允许应用程序通过网络提供和使用服务。在本场景中,"开发基于JWS的webservice并通过jun-jaxws发布所需的jar包"指的是利用Java API for XML Web ...

    java6中超级简单的WebService服务器和客户端实现

    **二、创建WebService服务器** 1. **定义服务接口(SEI, Service Endpoint Interface)** 首先,我们需要创建一个Java接口,该接口将定义服务的方法。例如,我们可以创建一个名为`HelloWorldService`的接口,包含一...

    WebService二——使用Eclipse开发WebService及各种调用方式

    1. **创建WebService项目** - 首先,打开Eclipse,选择"File" -&gt; "New" -&gt; "Dynamic Web Project",为项目起个名字,比如"WebServiceDemo"。 - 创建完成后,右键点击项目,选择"New" -&gt; "Other" -&gt; "Web" -&gt; ...

    使用Http post的方式调用webservice

    如果WebService使用SOAP协议,你需要构造SOAP请求消息并设置适当的HTTP头。SOAP消息通常包含一个XML结构,包括SOAP Envelope、Header和Body。使用如SAAJ(SOAP with Attachments API for Java)库可以更方便地处理...

    搭建WebService服务器

    本篇文章将详细讲解如何搭建一个基于CXF框架的WebService服务器,以及如何发布并使用服务。 1. **WebService基本概念** - **WSDL**(Web Services Description Language)是XML格式的文档,用于描述Web服务的接口...

    Tomcat上部署WebService服务所需要引用的jar包集合

    3. **创建WebService**: 使用JAX-WS,你可以通过在Java类上使用注解来定义Web服务接口和实现。比如,使用`@WebService`注解标记服务接口,用`@WebMethod`注解标记服务方法。 4. **生成WSDL**: JAX-WS提供了一个工具...

    WebService实现步骤(包括WEBSERVICE的demon)

    使用 SoapUI 等工具测试 WebService,验证其是否能够正确地提供服务。 WebService DEMO 下面是一个简单的 WebService DEMO,演示如何使用 Java 语言创建一个 WebService,使用 SoapUI 工具测试该 WebService。 ...

    WebService使用JDK发布

    3. 注册服务:使用`@WebService`注解的`endpointInterface`属性指定SEI的全限定名,并将服务实例暴露给JAX-WS运行时。 ```java @WebService(endpointInterface = "com.example.HelloWorld") public class ...

    CXF创建Webservice接口与Spring整合实例

    在IT行业中,Web服务是一种广泛使用的通信协议,它允许不同应用程序之间进行数据交换。CXF(CXF: Apache CXF, formerly XFire)是一个开源的Java框架,专门用于构建和消费Web服务。它提供了丰富的功能,包括SOAP、...

    webservice

    1. **服务类注解**:服务类必须使用`@WebService`注解标记,表明其为一个Web服务。 2. **方法可见性**:为了使服务可用,所有暴露给外部的方法必须是公共的(public),私有(private)或其他非公开访问级别将导致异常。...

    webservice接口调用工具类依赖jar包

    5. **activation.jar** 和 **javax.mail.jar**:如果需要使用邮件服务,这两个jar包是处理JavaMail API所必需的。 6. **httpclient.jar** 或 **httpcore.jar**:HTTP客户端库,如Apache HttpClient,用于执行HTTP...

    EOS5.x 的 WebService 服务配置及使用说明

    ### EOS5.x 的 WebService 服务配置及使用说明 #### 一、文档介绍 ##### 1.1 文档概述 本文档旨在详细介绍如何在WebLogic、JBoss、WebSphere等不同环境中配置EOS5.x的WebService服务,并且提供了通过EOS的...

Global site tag (gtag.js) - Google Analytics