JavaEE5 Jax-ws 学习(Soap webservice)

http://blog.csdn.net/birdsaction/article/details/3408350

JavaEE 5 相比 j2ee 1.4有了很大的改进,最大的是减少 XML繁杂的配置,增加了JavaSE 5.0 中 Annotation, EJB ,WebServices 都简化了不少.

我们使用JAX-WS建立一个简单的 WEB 服务 ,建立业务逻辑代码 ,就是暴露给客户的 服务的代码.

到这里下载 JAX-WS 2.0的 包: https://jax-ws.dev.java.net/

  1. package com.birds.ws;
  2. import javax.jws.WebMethod;
  3. import javax.jws.WebService;
  4. /**
  5.  * @author birds
  6.  * @since Nov 27, 2008 9:20:16 PM
  7.  */
  8. @WebService
  9. public class HelloQuick {
  10.     public HelloQuick() {
  11.     }
  12.     @WebMethod
  13.     public String show() {
  14.         return "SHOW YOU!";
  15.     }
  16. }
  17. // 上面的代码,足够简单, 在HelloQuick类上面 ,有一个 Annotation修饰 @WebService
  18. 这个修饰必须是 javax.jws.WebService ,  javax.jws.WebServiceProvider 其中一个,
  19. 默认构造函数必须有一个。
  20. 业务方法 show() 函数上面有一个 @WebMethod修饰,,如果这个函数有参数,就需要增加参数的修饰
  21. 比方说: show(@WebParam(name = "msg") String msg){}  多了一个参数
  22. 知道更多的细节,参考 jax-ws的文档,

       建立环境 : 这里使用 Tomcat 6.0

       需要编写 配置 webapps/jaxws2/WEB-INF/Web.xml

      

  1. xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5" 
  3.     xmlns="http://java.sun.com/xml/ns/javaee" 
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  7.   <listener>
  8.      <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListenerlistener-class>
  9.   listener>
  10.   
  11.   <servlet>
  12.      <servlet-name>fishservlet-name>
  13.      <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServletservlet-class>
  14.   servlet>
  15.   
  16.   <servlet-mapping>
  17.      <servlet-name>fishservlet-name>
  18.      <url-pattern>/quickurl-pattern>
  19.   servlet-mapping>
  20.     
  21.   <welcome-file-list>
  22.     <welcome-file>index.jspwelcome-file>
  23.   welcome-file-list>
  24. web-app>

             WSServletContextListener ,和 WSServlet 都是 系统运行需要的配置,

             还需要建立一个 sun-jaxws.xml 

            

 

  1. xml version="1.0" encoding="UTF-8"?>
  2. <endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime'
  3.     version='2.0'>
  4.     <endpoint name='fish' implementation='com.birds.ws.HelloQuick'
  5.         url-pattern='/quick' />
  6. endpoints>
  7.             // Parse the descriptor file and build endpoint infos
  8.             DeploymentDescriptorParser parser = new DeploymentDescriptorParser(
  9.                 classLoader,new ServletResourceLoader(context), createContainer(context), new ServletAdapterList());
  10.             URL sunJaxWsXml = context.getResource(JAXWS_RI_RUNTIME);
  11.             if(sunJaxWsXml==null)
  12.                 throw new WebServiceException(WsservletMessages.NO_SUNJAXWS_XML(JAXWS_RI_RUNTIME));
  13.             List adapters = parser.parse(sunJaxWsXml.toExternalForm(), sunJaxWsXml.openStream());
  14.             delegate = createDelegate(adapters, context);
  15.             context.setAttribute(WSServlet.JAXWS_RI_RUNTIME_INFO,delegate);
  16.             
  17.         } catch (Throwable e) {
  18.             logger.log(Level.SEVERE,
  19.                 WsservletMessages.LISTENER_PARSING_FAILED(e),e);
  20.             context.removeAttribute(WSServlet.JAXWS_RI_RUNTIME_INFO);
  21.             throw new WSServletException("listener.parsingFailed", e);
  22.         }
  23.  // JAXWS_RI_RUNTIME 为  /WEB-INF/sun-jaxws.xml 
  24. 这个监听器 主要是 解析 endpoints ,
  25.  delegate = createDelegate(adapters, context);
  26.   context.setAttribute(WSServlet.JAXWS_RI_RUNTIME_INFO,delegate);
  27.  这两行代码  把解析的 endpoint 结果 放入 session中 ,给后面的 WSServlet使用,
  28.  下面是 
  29. com.sun.xml.ws.transport.http.servlet.WSServlet 部分源代码.
  30. public void init(ServletConfig servletConfig) throws ServletException {
            super.init(servletConfig);
            delegate = getDelegate(servletConfig);
        }
  31. // 这个地方就是取出 上面监听器 解析sun-jaxws.xml 结果,
  32. delegate  这个是 主要处理大部分逻辑的代码 ,是 WSServletDelegate类
  33. 看 WSServelt 的doPost方法,将会调用
  34. protected void doPost( HttpServletRequest request, HttpServletResponse response) throws ServletException {
            if (delegate != null) {
                delegate.doPost(request,response,getServletContext());
            }
        }
  35. 这里便会访问到 WSServletDelegate 的doPost方法
  36.  ServletAdapter target = getTarget(request);
                if (target != null) {
                    if (logger.isLoggable(Level.FINEST)) {
                        logger.finest(
                            WsservletMessages.SERVLET_TRACE_GOT_REQUEST_FOR_ENDPOINT(target.name));
                    }
                    target.handle(context, request, response);
                } else {
                    Localizer localizer = getLocalizerFor(request);
                    writeNotFoundErrorPage(localizer, response, "Invalid Request");
    }
  37. 这部分代码 开始处理请求 并且生成WSDL服务
  38. 当tomcat启动成功后 在浏览器中输入
  39. http://localhost:8080/jaxws2/quick?wsdl
  40. 将会显示 WSDL xml服务结果.
  1. <definitions targetNamespace="http://ws.birds.com/" name="HelloQuickService">
  2.     <types>
  3.     <xsd:schema>
  4. <xsd:import namespace="http://ws.birds.com/" schemaLocation="http://localhost:8080/jaxws2/quick?xsd=1"/>
  5. xsd:schema>
  6. types>
  7.     <message name="show">
  8. <part name="parameters" element="tns:show"/>
  9. message>
  10.     <message name="showResponse">
  11. <part name="parameters" element="tns:showResponse"/>
  12. message>
  13.     <portType name="HelloQuick">
  14.     <operation name="show">
  15. <input message="tns:show"/>
  16. <output message="tns:showResponse"/>
  17. operation>
  18. portType>
  19.     <binding name="HelloQuickPortBinding" type="tns:HelloQuick">
  20. <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
  21.     <operation name="show">
  22. <soap:operation soapAction=""/>
  23.     <input>
  24. <soap:body use="literal"/>
  25. input>
  26.     <output>
  27. <soap:body use="literal"/>
  28. output>
  29. operation>
  30. binding>
  31.     <service name="HelloQuickService">
  32.     <port name="HelloQuickPort" binding="tns:HelloQuickPortBinding">
  33. <soap:address location="http://localhost:8080/jaxws2/quick"/>
  34. port>
  35. service>
  36. definitions>

            上面的tomcat 6.0可能启动有错误 ,,这个需要把jax-ws 需要的几个包复制到 tomcat6.0/endorsed 目录下,这个目录原本没有,需要自己创建,主要是覆盖java虚拟机默认的 加载jaxb-api.jar ,

可以看看 http://java.sun.com/j2se/1.5.0/docs/guide/standards/index.html ,

如果不是用tomcat做服务发布的话, 用普通的java命令的话 需要在java安装目录下 建立 这个endorsed目录,把jar包放到下面,

jdk1.5 把叫做 " Endorsed Standards Override Mechanism ".

 

// 下面是 客户端代码 ,用来调用创建好的服务

// 用 jdk提供的 wsimport 的命令 来生成 对应的客户端服务代码,,也可以自己编写,如果你很清楚 jax-ws的机制。

wsimport -p com.birds.ws.myclient.HelloServices http://localhost:8080/jaxws2/quick?wsdl
-p 选项是 可以帮你生成包名. 
 生成了六个文件
HelloQuick.class, HelloQuickService.class,ObjectFactory.class,package-info.class
Show.class, ShowResponse.class
如果想看到源代码 可以加上 -keep 选项,

以上就可以方面的创建 客户端服务代码,不用自己手工编写 
下面就很容易的调用。
public static void main(String[] args) {HelloQuickService HelloQuickService = new HelloQuickService();HelloQuick quick = HelloQuickService.getHelloQuickPort();System.out.println(quick.show());}
这样就是一个简单的jax-ws 应用。

 

 

=========================================

http://piggy.iteye.com/blog/322585

前面一篇《jbossws快速入门》指出,使用jax-ws开发web service难度大大减低。本文再以Metro为示例,写一个简短的教程。

注:Metro,是GlassFish服务器的子项目,大家可以浏览jax-ws参考实现了解更多的信息。

Web Service EndPoint

Java代码 复制代码 收藏代码
  1. package helloservice;      
  2.      
  3. @javax.jws.WebService(      
  4.         serviceName="HelloService",       
  5.         name="Hello",      
  6.         targetNamespace="http://www.jboss.org/example")      
  7. public class HelloBean {   
  8.     private String message = new String("Hello, ");      
  9.      
  10.     @javax.jws.WebMethod      
  11.     public String sayHello(String name) {      
  12.         return message + name + ".";      
  13.     }      
  14. }    
package helloservice;   @javax.jws.WebService(   serviceName="HelloService",    name="Hello",   targetNamespace="http://www.jboss.org/example")   
public class HelloBean {private String message = new String("Hello, ");   @javax.jws.WebMethod   public String sayHello(String name) {   return message + name + ".";   }   
}  



Deploy Web Service

在部署文件web.xml里加入监听器及适配器。

Xml代码 复制代码 收藏代码
  1. <listener>  
  2.     <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListenerlistener-class>  
  3. listener>  
  4. <servlet>  
  5.     <servlet-name>HelloServiceservlet-name>  
  6.     <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServletservlet-class>  
  7. servlet>  
  8. <servlet-mapping>  
  9.     <servlet-name>HelloServiceservlet-name>  
  10.     <url-pattern>/hellourl-pattern>  
  11. servlet-mapping>  
com.sun.xml.ws.transport.http.servlet.WSServletContextListener

HelloServicecom.sun.xml.ws.transport.http.servlet.WSServlet

HelloService/hello



还需要在部署文件sun-jaxws.xml描述EndPoint。

Xml代码 复制代码 收藏代码
  1. xml version="1.0" encoding="UTF-8"?>  
  2. <endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'>  
  3.   <endpoint  
  4.     name='HelloService'  
  5.     implementation='helloservice.HelloBean'  
  6.     url-pattern='/hello'/>  
  7. endpoints>  





如果没有配置,无法使用/hello进行访问,但可以用HelloService?wsdl进行访问到,这是适配器的作用。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部