`
m635674608
  • 浏览: 5028788 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

WSServletContextListener jax-ws 源码分析

    博客分类:
  • java
 
阅读更多

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

建立环境 : 这里使用 Tomcat 6.0

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



27.<?xml version="1.0" encoding="UTF-8"?>
28.<web-app version="2.5"
29. xmlns="http://java.sun.com/xml/ns/javaee"
30. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
31. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
32. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
33.
34. <listener>
35. <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
36. </listener>
37.
38. <servlet>
39. <servlet-name>fish</servlet-name>
40. <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
41. </servlet>
42.
43. <servlet-mapping>
44. <servlet-name>fish</servlet-name>
45. <url-pattern>/quick</url-pattern>
46. </servlet-mapping>
47.
48. <welcome-file-list>
49. <welcome-file>index.jsp</welcome-file>
50. </welcome-file-list>
51.</web-app>

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

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

54.<?xml version="1.0" encoding="UTF-8"?>
55.<endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime'
56. version='2.0'>
57. <endpoint name='fish' implementation='com.birds.ws.HelloQuick'
58. url-pattern='/quick' />
59.</endpoints>
60.
61.<!--
62. endpoint 一个端点,代表了一个服务,
63. name = fish
64. url-pattern="/quick"
65.
66. -->

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

是 jax-ws 的源代码。

70. try {
71. // Parse the descriptor file and build endpoint infos
72. DeploymentDescriptorParser<ServletAdapter> parser = new DeploymentDescriptorParser<ServletAdapter>(
73. classLoader,new ServletResourceLoader(context), createContainer(context), new ServletAdapterList());
74. URL sunJaxWsXml = context.getResource(JAXWS_RI_RUNTIME);
75. if(sunJaxWsXml==null)
76. throw new WebServiceException(WsservletMessages.NO_SUNJAXWS_XML(JAXWS_RI_RUNTIME));
77. List<ServletAdapter> adapters = parser.parse(sunJaxWsXml.toExternalForm(), sunJaxWsXml.openStream());
78.
79. delegate = createDelegate(adapters, context);
80.
81. context.setAttribute(WSServlet.JAXWS_RI_RUNTIME_INFO,delegate);
82.
83. } catch (Throwable e) {
84. logger.log(Level.SEVERE,
85. WsservletMessages.LISTENER_PARSING_FAILED(e),e);
86. context.removeAttribute(WSServlet.JAXWS_RI_RUNTIME_INFO);
87. throw new WSServletException("listener.parsingFailed", e);
88. }
89. // JAXWS_RI_RUNTIME 为 /WEB-INF/sun-jaxws.xml
90.这个监听器 主要是 解析 endpoints ,
91. delegate = createDelegate(adapters, context);
92. context.setAttribute(WSServlet.JAXWS_RI_RUNTIME_INFO,delegate);
93. 这两行代码 把解析的 endpoint 结果 放入 session中 ,给后面的 WSServlet使用,
94. 下面是
95.com.sun.xml.ws.transport.http.servlet.WSServlet 部分源代码.
96.
97.public void init(ServletConfig servletConfig) throws ServletException {
super.init(servletConfig);
delegate = getDelegate(servletConfig);
}
98.// 这个地方就是取出 上面监听器 解析sun-jaxws.xml 结果,
99.delegate 这个是 主要处理大部分逻辑的代码 ,是 WSServletDelegate类
100.看 WSServelt 的doPost方法,将会调用
101.protected void doPost( HttpServletRequest request, HttpServletResponse response) throws ServletException {
if (delegate != null) {
delegate.doPost(request,response,getServletContext());
}
}
102.这里便会访问到 WSServletDelegate 的doPost方法
103. 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");
}
104.这部分代码 开始处理请求 并且生成WSDL服务
105.当tomcat启动成功后 在浏览器中输入
106.http://localhost:8080/jaxws2/quick?wsdl
107.将会显示 WSDL xml服务结果.
108.
109.

109.<definitions targetNamespace="http://ws.birds.com/" name="HelloQuickService">
110.−
111. <types>
112.−
113. <xsd:schema>
114.<xsd:import namespace="http://ws.birds.com/" schemaLocation="http://localhost:8080/jaxws2/quick?xsd=1"/>
115.</xsd:schema>
116.</types>
117.−
118. <message name="show">
119.<part name="parameters" element="tns:show"/>
120.</message>
121.−
122. <message name="showResponse">
123.<part name="parameters" element="tns:showResponse"/>
124.</message>
125.−
126. <portType name="HelloQuick">
127.−
128. <operation name="show">
129.<input message="tns:show"/>
130.<output message="tns:showResponse"/>
131.</operation>
132.</portType>
133.−
134. <binding name="HelloQuickPortBinding" type="tns:HelloQuick">
135.<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
136.−
137. <operation name="show">
138.<soap:operation soapAction=""/>
139.−
140. <input>
141.<soap:body use="literal"/>
142.</input>
143.−
144. <output>
145.<soap:body use="literal"/>
146.</output>
147.</operation>
148.</binding>
149.
150. <service name="HelloQuickService">
151.
152. <port name="HelloQuickPort" binding="tns:HelloQuickPortBinding">
153.<soap:address location="http://localhost:8080/jaxws2/quick"/>
154.</port>
155.</service>
156.</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.classShow.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 应用。

分享到:
评论

相关推荐

    jax-rs jax-ws所需包,亲测可用

    标题"jax-rs jax-ws所需包,亲测可用"表明这个压缩包包含了用于开发Java RESTful Web服务(JAX-RS)和Java SOAP Web服务(JAX-WS)所需的库文件。这些库是Java应用程序进行Web服务交互的核心组件,确保了对HTTP协议...

    Jax-ws所需要的JAR包

    Java API for XML Web Services(JAX-WS)是Java平台上用于构建和消费Web服务的标准API。它简化了创建和使用Web服务的过程,使得开发者能够通过SOAP消息与远程服务进行交互。JAX-WS允许开发者将服务接口直接映射到...

    jax-ws api jar包

    在给定的压缩包文件"jax-ws api jar包"中,包含的是JAX-WS 2.2.1版本的API库,即`jaxws-api-2.2.1.jar`。这个jar文件是开发基于JAX-WS的Web服务所必需的依赖之一。以下是关于JAX-WS的一些核心知识点: 1. **服务端...

    解决weblogic部署JAX-WS需要的配置文件

    在WebLogic服务器上部署JAX-WS服务时,可能会遇到一些配置问题。JAX-WS(Java API for XML Web Services)是Java平台上的一个标准,用于创建和部署Web服务。WebLogic作为一款强大的Java EE应用服务器,支持JAX-WS...

    JAX-WS2.0 API

    JAX-WS 2.0是JAX-WS的第二个主要版本,它在JAX-RPC(Java API for XML-based RPC)的基础上进行了改进,引入了许多新特性以提升开发者的体验和效率。 **JAX-WS 2.0 的核心概念:** 1. **服务端点接口(SEI, ...

    jax-ws webservice demo

    基于jax-ws 实现的web service client和server端的demo程序。 注:如果使用的是 myeclipse 时 server 部署到tomcat 启动的时候会报错 解决办法:找到myeclipse安装目录下的 plugins 目录里 查找 webservices-rt.jar,...

    一个包含jax-ws和jax-rs的例子(含服务端和客户端)

    标题中的“一个包含jax-ws和jax-rs的例子(含服务端和客户端)”是指这是一个示例项目,它演示了如何使用Java API for XML Web Services (JAX-WS)和Java API for RESTful Web Services (JAX-RS)来创建和消费Web服务。...

    JAX-WS2.1用户指南

    **JAX-WS2.1用户指南** JAX-WS(Java API for XML Web Services)是Java平台上用于创建Web服务的标准API,版本2.1是其一个重要里程碑。本指南将深入探讨JAX-WS 2.1的核心概念、功能以及如何在实际开发中应用它。...

    webservice之jax-ws

    【标题】:Web服务之Java API for XML Web Services (JAX-WS) 【内容详解】 JAX-WS,全称为Java API for XML Web Services,是Java平台上的一个标准,用于构建和部署基于SOAP(Simple Object Access Protocol)的...

    JAX-WS API, JAX-RS API

    **JAX-WS API** Java API for XML Web Services (JAX-WS) 是Java平台上的一个标准接口,用于创建和消费Web服务。它是Sun Microsystems在2004年推出的一个重要框架,旨在简化Web服务的开发,使得Java开发者能够更...

    JAX-WS 2.2 RI所有相关jar包

    JAX-WS 2.2 RI 所包含的JAR包集合,包含25个JAR包,列表如下: FastInoset.jar gmbal-api-only.jar ha-api.jar javax.annotation.jar javax.mail_1.4.jar jaxb-api.jar jaxb-impl.jar jaxb-xjc.jar jaxws-api...

    如何基于JAX-WS开发一个WebService实例

    JAX-WS(Java API for XML Web Services)是Java平台上的一个标准,用于创建和消费Web服务。本篇将深入讲解如何基于JAX-WS开发一个WebService实例。 首先,让我们了解JAX-WS的基本概念。JAX-WS提供了一种简单的方式...

    metro-jax-ws-jaxws221x.zip

    【标题】"metro-jax-ws-jaxws221x.zip" 提供的是一个关于JAX-WS(Java API for XML Web Services)的开发示例,其中包含了JAX-WS 2.2.1版本的相关组件和库文件。这个压缩包是针对Java开发者设计的,用于帮助他们理解...

    JAX-WS规范

    **JAX-WS规范详解** Java API for XML Web Services(JAX-WS)是Java平台上的一个标准,用于创建Web服务和客户端。它提供了一种简单、类型安全的方式来构建和消费基于SOAP的消息传递应用程序,是Java世界中实现Web...

    jax-ws2.1.zip

    **标题:“jax-ws2.1.zip”**指的是一个包含Java API for XML Web Services(JAX-WS)2.1版本的压缩包。JAX-WS是Java平台标准版(Java SE)和企业版(Java EE)的一部分,用于构建基于SOAP(Simple Object Access ...

    jax-ws 2.0文档说明以及源码

    通过分析这些代码,可以了解JAX-WS如何将Java类映射到SOAP消息,以及如何通过客户端代理进行调用。同时,源码中可能会展示如何配置和部署Web服务,以及如何生成和使用WSDL文件。 总的来说,JAX-WS 2.0为Java开发者...

    JAX-WS所需Jar包

    标题提到的"JAX-WS所需Jar包"是指为了在Java环境中支持JAX-WS功能,开发者需要的一组核心库。这些库包含了运行和开发JAX-WS Web服务所必需的组件。下面将逐一解释这些库的作用: 1. **jaxb-xjc.jar**: 这是Java ...

    jax-ws发布webservice

    Java API for XML Web Services(JAX-WS)是Java平台上的一个标准,用于构建和部署Web服务。它简化了Web服务的开发,使得Java开发者能够更方便地创建、调用和部署SOAP(Simple Object Access Protocol)服务。在这个...

    Jax-ws RI.zip

    Java API for XML Web Services (JAX-WS) 是Java平台上的一个标准,用于构建和部署Web服务。JAX-WS RI(Reference Implementation)是这个规范的官方参考实现,它提供了开发、测试和运行基于SOAP(Simple Object ...

    jax-ws webservice简单demo

    在"jax-ws webservice完整demo"中,你可以通过查看源码了解每个组件的具体实现,并学习如何将它们组合在一起,形成一个完整的Web服务。此外,通过运行提供的测试代码,你可以验证Web服务是否正常工作。这个例子是一...

Global site tag (gtag.js) - Google Analytics