JavaEE5 Jax-ws 学习

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.WSServletContextListener</listener-class>
  9.   </listener>
  10.   
  11.   <servlet>
  12.      <servlet-name>fish</servlet-name>
  13.      <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
  14.   </servlet>
  15.   
  16.   <servlet-mapping>
  17.      <servlet-name>fish</servlet-name>
  18.      <url-pattern>/quick</url-pattern>
  19.   </servlet-mapping>
  20.     
  21.   <welcome-file-list>
  22.     <welcome-file>index.jsp</welcome-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. <!-- 
  8.   endpoint 一个端点,代表了一个服务,
  9.   name = fish
  10.   url-pattern="/quick"
  11.  -->

           下面是  com.sun.xml.ws.transport.http.servlet.WSServletContextListener 加载/WEB-INF/sun-jaxws.xml

            是 jax-ws 的源代码。

  1.  try {
  2.             // Parse the descriptor file and build endpoint infos
  3.             DeploymentDescriptorParser<ServletAdapter> parser = new DeploymentDescriptorParser<ServletAdapter>(
  4.                 classLoader,new ServletResourceLoader(context), createContainer(context), new ServletAdapterList());
  5.             URL sunJaxWsXml = context.getResource(JAXWS_RI_RUNTIME);
  6.             if(sunJaxWsXml==null)
  7.                 throw new WebServiceException(WsservletMessages.NO_SUNJAXWS_XML(JAXWS_RI_RUNTIME));
  8.             List<ServletAdapter> adapters = parser.parse(sunJaxWsXml.toExternalForm(), sunJaxWsXml.openStream());
  9.             delegate = createDelegate(adapters, context);
  10.             context.setAttribute(WSServlet.JAXWS_RI_RUNTIME_INFO,delegate);
  11.             
  12.         } catch (Throwable e) {
  13.             logger.log(Level.SEVERE,
  14.                 WsservletMessages.LISTENER_PARSING_FAILED(e),e);
  15.             context.removeAttribute(WSServlet.JAXWS_RI_RUNTIME_INFO);
  16.             throw new WSServletException("listener.parsingFailed", e);
  17.         }
  18.  // JAXWS_RI_RUNTIME 为  /WEB-INF/sun-jaxws.xml 
  19. 这个监听器 主要是 解析 endpoints ,
  20.  delegate = createDelegate(adapters, context);
  21.   context.setAttribute(WSServlet.JAXWS_RI_RUNTIME_INFO,delegate);
  22.  这两行代码  把解析的 endpoint 结果 放入 session中 ,给后面的 WSServlet使用,
  23.  下面是 
  24. com.sun.xml.ws.transport.http.servlet.WSServlet 部分源代码.
  25. public void init(ServletConfig servletConfig) throws ServletException {
            super.init(servletConfig);
            delegate = getDelegate(servletConfig);
        }
  26. // 这个地方就是取出 上面监听器 解析sun-jaxws.xml 结果,
  27. delegate  这个是 主要处理大部分逻辑的代码 ,是 WSServletDelegate类
  28. 看 WSServelt 的doPost方法,将会调用
  29. protected void doPost( HttpServletRequest request, HttpServletResponse response) throws ServletException {
            if (delegate != null) {
                delegate.doPost(request,response,getServletContext());
            }
        }
  30. 这里便会访问到 WSServletDelegate 的doPost方法
  31.  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");
    }
  32. 这部分代码 开始处理请求 并且生成WSDL服务
  33. 当tomcat启动成功后 在浏览器中输入
  34. http://localhost:8080/jaxws2/quick?wsdl
  35. 将会显示 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 应用。
 
 

 

 

 

  

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值