下面通过一个HelloWorld的例子来看看,JAX-WS 2.0 API的应用过程.程序是客户端传给服务端一个名字,经过服务端处理后,返回到客户端并打印出来.<o:p></o:p>
<o:p></o:p>
一. 环境配置.<o:p></o:p>
1. JDK 5.0 下载: http://java.sun.com/j2se/1.5.0/download.jsp<o:p></o:p>
2. Java EE 5.0 App Server. <o:p></o:p>
https://glassfish.dev.java.net/public/downloadsindex.html<o:p></o:p>
本例中测试用了Build 37<o:p></o:p>
下载完毕后请设置一下Path.还有例子中使用的命令对应于Cygwin,如果用Dos或Linux的话,请适当更改相应的形式.
<o:p></o:p>
例子中执行中的命令行以E:\jaxws20为基准,在其下面创造相对应的文件夹.<o:p></o:p>
<o:p></o:p>
二.编写建立服务端<o:p></o:p>
1. 实现类.<o:p></o:p>
<o:p></o:p>
package endpoint;<o:p></o:p>
<o:p></o:p>
import javax.jws.WebService;<o:p></o:p>
import javax.jws.WebMethod;<o:p></o:p>
<o:p></o:p>
@WebService() <o:p></o:p>
public class HelloWorld{<o:p></o:p>
<o:p></o:p>
//the implementation class must have a default public constructor<o:p></o:p>
public HelloWorld() {};<o:p></o:p>
<o:p></o:p>
@WebMethod(operationName="sayHello", action="urn:SayHello")<o:p></o:p>
public String sayHello(String name){<o:p></o:p>
return "Hello "+ name + "!";<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
请注意实现类必须标注WebService(),还必须包括一个default public constructor.<o:p></o:p>
<o:p></o:p>
2. 编译实现类.<o:p></o:p>
编译前,创造相应文件夹build/classes/service来保存class文件.还请注意命令在同一行.<o:p></o:p>
javac -classpath $GLASSFISH_HOME/lib/javaee.jar -d ./build/classes/service endpoint/HelloWorld.java<o:p></o:p>
<o:p></o:p>
3. 生成相应文件<o:p></o:p>
在E:\jaxws20下,执行下面的命令,注意事先生成/build/generated.<o:p></o:p>
$GLASSFISH_HOME/bin/wsgen.bat-cp ./build/classes/service -keep -d ./build/classes/service -r ./build/generated -wsdl endpoint.HelloWorld
<o:p></o:p>
通过这个命令,会生成相对应的WSDL文件.<o:p></o:p>
<o:p></o:p>
4. 打包<o:p></o:p>
4.1 WEB-INF`结构准备<o:p></o:p>
WEB-INF/classes/<o:p></o:p>
WEB-INF/wsdl/<o:p></o:p>
<o:p></o:p>
4.2 Web.xml<o:p></o:p>
在WEB-INF/下,编写下面的文件.<o:p></o:p>
<!----><o:p></o:p>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"></web-app>
xmlns:j2ee="http://java.sun.com/xml/ns/javaee"<o:p></o:p>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"<o:p></o:p>
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee<o:p></o:p>
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><o:p></o:p>
<o:p></o:p>
<description></description>HelloWorld Service<o:p></o:p>
<display-name></display-name>HelloWorldWAR<o:p></o:p>
<o:p></o:p>
<servlet></servlet><o:p></o:p>
<description></description>Endpoint for HelloWorld Web Service<o:p></o:p>
<display-name></display-name>HelloWorldWebService<o:p></o:p>
<servlet-name></servlet-name>HelloWorldPort<o:p></o:p>
<servlet-class></servlet-class>endpoint.HelloWorld<o:p></o:p>
<load-on-startup></load-on-startup>0<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
<servlet-mapping></servlet-mapping><o:p></o:p>
<servlet-name></servlet-name>HelloWorldPort<o:p></o:p>
<url-pattern></url-pattern>/HelloWorldService<o:p></o:p>
<o:p></o:p>
<session-config></session-config><o:p></o:p>
<session-timeout></session-timeout>60<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
4.3 拷贝文件<o:p></o:p>
cp -r build/classes/service/endpoint ./WEB-INF/classes/<o:p></o:p>
cp build/generated/* archive/WEB-INF/wsdl/<o:p></o:p>
<o:p></o:p>
4.4打包<o:p></o:p>
jar cvf helloworld-webservice.war WEB-INF/<o:p></o:p>
<o:p></o:p>
5. 配置<o:p></o:p>
先启动服务器,<o:p></o:p>
asadmin.bat start-domain domain1<o:p></o:p>
配置到服务器中,<o:p></o:p>
asadmin.bat deploy --user admin --password adminadmin --host localhost --port 4848 --contextroot helloworld-webservice --upload=true --target server helloworld-webservice.war<o:p></o:p>
<o:p></o:p>
三. 客户端<o:p></o:p>
1. 客户端类.<o:p></o:p>
在client/下,<o:p></o:p>
package client;<o:p></o:p>
<o:p></o:p>
import javax.xml.ws.WebServiceRef;<o:p></o:p>
import endpoint.HelloWorldService;<o:p></o:p>
import endpoint.HelloWorld;<o:p></o:p>
<o:p></o:p>
public class WSClient{<o:p></o:p>
<o:p></o:p>
@WebServiceRef(wsdlLocation=<o:p></o:p>
"http://localhost:8080/helloworld-webservice/HelloWorldService?WSDL")<o:p></o:p>
<o:p></o:p>
static HelloWorldService service;<o:p></o:p>
<o:p></o:p>
public static void main(String[] args){<o:p></o:p>
try{<o:p></o:p>
WSClient client = new WSClient();<o:p></o:p>
client.callEndpoint(args[0]);<o:p></o:p>
}catch(Exception e){<o:p></o:p>
e.printStackTrace();<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
public void callEndpoint(String name){<o:p></o:p>
try{<o:p></o:p>
HelloWorld port = service.getHelloWorldPort();<o:p></o:p>
System.out.println(port.sayHello(name));<o:p></o:p>
}catch(Exception e){<o:p></o:p>
e.printStackTrace();<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
2. 生成相关文件<o:p></o:p>
在编译客户端类之前, 需要从服务端公开中的WSDL生成相关的文件.<o:p></o:p>
wsimport.bat -keep -d ./build/classes/client http://localhost:8080/helloworld-webservice/HelloWorldService?WSDL<o:p></o:p>
<o:p></o:p>
3. 编译客户端类<o:p></o:p>
javac-d ./build/classes/client -classpath $GLASSFISH_HOME/lib/javaee.jar\;$GLASSFISH_HOME/lib/appserv-ws.jar\;./build/classes/client client/WSClient.java
<o:p></o:p>
四. 执行<o:p></o:p>
在build/classes/client/下,<o:p></o:p>
appclient.bat -mainclass client.WSClient Duke<o:p></o:p>
<o:p></o:p>
你会看到如下反馈<o:p></o:p>
Hello Duke!<o:p></o:p>
<o:p></o:p>
追加: 通过下面的命令,可以卸掉装配好的war文件.<o:p></o:p>
<o:p></o:p>
asadmin.bat undeploy --user admin --password adminadmin helloworld-webservice
Trackback URL: http://blogs.sun.com/xiaojun/entry/jax_ws_2_0_an
<o:p></o:p>
<o:p></o:p>
<o:p>另一篇文章:</o:p>
<o:p>来自:http://www.volitation.net/tools/List.asp?SelectId=278&ClassId=15 </o:p>
<o:p>这篇文章说明使用NetBeans5.0和GlassFish应用服务器如何创建JAX-WS2.0服务。使用NetBeans和GlassFish的内置特征,你可以创建一个web services工程,它通过一个命令进行编译和测试。
第一部分描述如何设置NetBeans IDE和创建一个GlassFish库。第二部分包含了关于创建一个web service工程以及用到的示例代码的信息。最后一部分描述了利用这个工程创建你自己的web service的技巧,也作为从WSDL开始创建一个服务的指导。注意,JAX-WS2.0应用程序需要J2SE5.0。最新的JDK可以从http://java.sun.com下载。
注意:为了使用JAS-WS2.0工作空间创建web service,而不是使用GlassFish,要了解本文所代替的这个版本。
目录
1、 设置NetBeans和GlassFish
2、 建立一个工程
从Java创建一个服务
创建一个客户端
使用NetBeans Web Services Registry
调试应用程序
3、 技巧
编写你自己的服务
从WSDL创建一个服务
设置NetBeans和GlassFish
这篇文章使用NetBeans5.0 Beta2编写,更多关于NetBeans,包括这个应用程序的信息可以从NetBeans.org网站获得。如果你对这个集成开发环境还很陌生,站点上的向导和指南能帮你建立环境并运行起来。
为了获得GlassFish应用服务器,访问GlassFish网站并点击Download Now按钮。按照说明书安装一个GlassFish二进制包,使用build b28或者更新的版本。这篇文章在提及安装文件夹时将简化为“glassfish”文件夹。注意:由于在JAX-WS 中ant target的变化,文章中的例子只能在GlassFish build b28日期为11月23日或者更新的版本上运行。为了使用早期的版本,你必须改变wsimport及(或)wsgen target的属性。更多细节请参照JAX-WS或者GlassFish文档。
在NetBeans和GlassFish安装后,使用这些步骤将服务器增加到NetBeans中,然后创建要被工程用到的GlassFish库。在NetBeans中,点击菜单栏中的Tools,选择Server Manager。点击Add Server,从Server菜单中选择Sun Java System Application Server,然后为这个服务器输入一个名字,例如“GlassFish”,点击Next。在下一个屏幕上输入你的“glassfish”文件夹的路径,然后点击Next,接受注册器的默认域,点击“Next”。在最后一屏上,输入管理密码,点击“Finish”。随包的默认密码在GlassFish快速入门页面上给了出来。点击Close退出Server Manager。注意:当前在Runtime选项卡中Server节点下有两个可用的服务器。
为了创建工程中将要用到的库,点击菜单栏中的Tools,然后选择Library Manager。点击New Library,输入一个库名字,例如“GlassFish”。按OK,由于“ClassPath”选项卡仍旧打开着,点击Add JAR/Folder,浏览你的glassfish/lib文件夹,选择所有的jar文件(按下shift键同时,点击所选文件)。点击Add JAR/Folder,然后点击OK。这个库在创建服务时并不是必须的,因为在运行时GlassFish的一些jar文件已经包含在NetBeans的ClassPath中了。这个库在稍后运行测试客户端时将要用到。
建立一个应用程序
从Java创建一个服务
使用GlassFish创建一个web service的步骤比只使用JAX-WS代码和包含在NetBeans之中的Tomcat服务器要简单得多。不像那些这篇文章的这个版本中略述的步骤,在创建war文件前,你不需要使用wsgen创建服务器文件。你只需要创建服务端类,修改默认的web.xml文件,然后就可以进行发布了。
下面由创建一个新的web应用工程开始。在NetBeans中,选择菜单栏中的File,接着选择 New Project,在“Categories”下选择Web,在“Project”下选择Web Application,点击Next。在“Project Name”一栏中输入“SampleApp”,并且选择保存工程的位置。确保“Server”设置成了你的GlassFish应用服务器,并且去掉对“Set Source Level to 1.4”的选择(JAX-WS2.0需要JDK5),点击Finish。现在这个工程已经创建了,如果愿意,你也许要删除“index.jsp”。这个工程将会用到你服务端类作为Servlet类,并且GlassFish在发布时会将这个类转化为一个web service。
添加GlassFish库到新的工程中。在Project选项卡中,右键点击“Libraries”,选择Add Library。选择“GlassFish”库,然后点击Add Library。现在你应该告诉NetBeans,在产生的war文件中不包括GlassFish的jar文件(因为它们已经包含在了服务器中)。右键点击SampleApp工程,选择Properties。点击左面的Library节点,去掉“Compile-time Libraries”表格中紧挨着GlassFish选项的选择。作为一个可选(不过是有帮助的)步骤,点击Run节点,在“Relative URL”中输入“/hello?wsdl”。当程序运行时,它将会为这个web service的wsdl文件打开一个浏览器。点击OK。
增加服务类。右键点击“Source Packages”,选择New和Java Packages,输入“my.sample.server”,点击Finish。为了向这个包中增加一个类,在这个包节点上右键点击,选择New和Java Class。因为示例类已经写好,你可以将ServiceImpl.java保存到SampleApp/src/java/sample/server/文件夹下,NetBeans会找到它。如果你想要查看文件的内容,只需双击包节点下的这个文件的名字。你可以看到它是一个包含一个方法的简单Java类,还有一些在JAX-WS2.0运行时要用到的注释。
保存配置文件web.xml文件到SampleApp/web/WEB-INF/文件夹下。它将覆盖默认的那个,它指定ServiceImpl类作为servlet,以及servlet的名字,这个servlet的名字基于JAX-WS服务名+端口号。应用服务器将用到这个信息运行wsgen作为创建web service的必要条件。
为了创建和启动服务,从菜单栏中选择Run和Run Main Project,或者使用快捷键F6。NetBeans将会编译服务类、创建war文件、启动应用服务器和发布应用程序。如果NetBeans安装时都进行了适当的设置,一个浏览器将会被打开,显示web service的wsdl文件。如果你愿意你可以改变服务类,可以看到反射的wsdl发生的变化,只需要按下F6重新编译和发布服务。
创建一个客户端
对于一个包含web应用的完整应用程序,你将要为这个应用程序正常地创建一个新的工程。为了简单地创建一个客户端来测试我们新的web service,你可以使用NetBeans的单元测试功能。
由创建一个新的测试包入手。右键点击Projects选项卡中“Test Packages”,选择New和Java Packages。输入“my.sample.test”,点击Finish。一般来说,你可以通过右键点击这个测试包和选择New和Empty Test增加测试。对于本例,你可以保存ServiceTest.java到SampleApp/test/my/sample/test/文件夹下。打开这个文件查看测试时如何创建一个服务,然后是服务的代理器,对它调用hello(String)。注意:当你增加自己的客户端代码作为一个JUnit测试时,NetBeans希望名字的形式为“*Test.java”。
运行之前,增加这段xml到工程的build.xml文件中。为了编辑这个文件,你可以使用菜单栏中的File-〉Open File,或者打开Files选项卡而不是Projects,展开“SampleApp”节点,接着双击build.xml。NetBeans在编译和运行测试客户端之前就会调用这个target。当这个target运行时,它确保这个服务已经建立并且发布(如果需要重新编译)。关于wsimport工具的更多信息参见JAX-WS文档。
<!---->
<target name="-pre-compile-test"></target>
<taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport"></taskdef>
<classpath path="${javac.classpath}"></classpath>
<!---->
<antcall target="run"></antcall>
<echo></echo>running wsimport
debug="true"
keep="true"
destdir="test"
package="my.sample.test.generated"
wsdl="http://localhost:8080/SampleApp/hello?wsdl"/>
为了运行测试,从菜单栏中选择Run和Test Project,或者使用快捷键ALT-F6。在输出信息中,你应该可以看到从这个服务返回的“hello world”。
使用NetBeans Web Services Registry
作为测试服务的一个预备的方法,你可以使用NetBeans的Web Services Registry。在Runtime选项卡中,右键点击Web Services,然后选择Add Web Service。在“URL”中输入web service的地址,在这里是“http://localhost:8080/SampleApp/hello?wsdl”,点击Get Web Service Description。这将会产生有关这个web service的描述。为了测试“hello”操作,点击紧挨着操作名称的TestOperation。然后输入一个要发送的值,观察返回值(在这个要点上,为返回字符串增加一些文本来改变服务的接口类也许是非常有用的)。点击Close退出测试,如果你想添加这个服务到注册器中点击Add。
调试应用程序
单步遍历应用程序中的代码(和JAX-WS代码)非常简单。由在ServiceImpl.java(15行)中的System.out.println("Service received: " + s);行上放置断点开始。最快捷的方式就是打开文件,在要放置断点的行上点击编辑器的左边框。或者将鼠标放在该行上,然后使用Ctrl-F8(关于使用调试器的全部信息参见NetBeans的用户指南)。
在这一点上你可以在调试模式下使用Run—〉Debug Main Project启动服务器,除此之外你也可以一步运行客户端代码。为了实现这个功能,改变工程中的build.xml文件中 “-pre-compile-test”target的“antcall”行,由<antcall target="run"></antcall> 改为 <antcall target="debug"></antcall>。
<!---->
<antcall target="debug"></antcall>
现在再次运行客户端测试(例如按下Alt-F6)。在建立测试之前,NetBeans将会在调试模式下重启GlassFish服务器。在客户端启动后,调试器将会停止在ServiceImpl中适当的行上,你可以单步执行服务器代码。注意:如果你在JAX-WS工作空间中的某一行上增加了断点,Alt-F6将不会运行,直到你将焦点移回到SampleApp工程中的一个文件上,通过在编辑器中的产生一个文件,点击Projects选项卡中工程等等完成。如果你对应用程序做了修改,当再一次运行测试时,所有东西都必须重新编译。记住,为了停止测试会话,你可以通过选择菜单栏中的Run和Finish Debugger Session,或者通过点击工具栏中的停止按钮。
为了测试客户端代码,由在ServiceTest.java中test1()方法上放置断点开始。在Project视图中的这个文件上右击,选择Debug File(或者将其作为编辑器中的活动文件,对ServiceTest使用Ctrl-Alt-F5)。它会在调试器中启动客户端以及服务。
技巧
编写你自己的服务
为了编写你自己的服务,你可以从工程中移除“my.sample.server”包,然后增加一个新的,或者按照上面的步骤创建一个新的web工程。你仍旧需要配置文件web.xml到WEB-INF文件夹下,根据需要进行修改。在web.xml中,你应该只需要修改<servlet-name></servlet-name>和<servlet-class></servlet-class>元素(也可以修改<url-pattern></url-pattern>)。你可以使用这个build.xml文件,它有target来保存一个步骤。
为了帮助你正确得到两个配置文件和build.xml
相关推荐
JAX-WS 2.0是JAX-WS的第二个主要版本,它在JAX-RPC(Java API for XML-based RPC)的基础上进行了改进,引入了许多新特性以提升开发者的体验和效率。 **JAX-WS 2.0 的核心概念:** 1. **服务端点接口(SEI, ...
### 设计与开发 JAX-WS 2.0 Web 服务 #### JAX-WS 技术概述 JAX-WS(Java API for XML Web Services)是Java平台中用于简化Web服务开发的一项关键技术。该技术提供了全面的支持,使得开发者能够在Java环境中轻松...
### JAX-WS 2.0 规范详解 #### 一、概述 JAX-WS(Java API for XML Web Services)2.0 是一种用于创建和访问 Web 服务的标准 Java API,它允许开发人员使用 Java 编写 Web 服务,并以 XML 的形式进行数据交换。JAX...
**Java API for XML Web Services(JAX-WS)2.0**是Java平台上的一个标准,用于构建和消费Web服务。它提供了简化Web服务开发的API,使得开发者能够以更面向对象的方式处理Web服务。本篇文章将深入探讨JAX-WS 2.0的...
JAX-WS 2.0 是Java API for XML Web Services的第二个主要版本,它引入了异步Web服务调用的功能,以解决在Service-Oriented Architecture(SOA)环境中开发响应迅速的Web服务客户端应用程序的挑战。由于Web服务调用...
[奥莱理] RESTful Java 开发 (Jax-RS 2.0 实现) (英文版) [奥莱理] RESTful Java with JAX-RS 2.0 (E-Book) ☆ 图书概要:☆ Learn how to design and develop distributed web services in Java, using RESTful ...
标题"jax-rs jax-ws所需包,亲测可用"表明这个压缩包包含了用于开发Java RESTful Web服务(JAX-RS)和Java SOAP Web服务(JAX-WS)所需的库文件。这些库是Java应用程序进行Web服务交互的核心组件,确保了对HTTP协议...
Java API for XML Web Services(JAX-WS)是Java平台上用于构建和消费Web服务的标准API。它简化了创建和使用Web服务的过程,使得开发者能够通过SOAP消息与远程服务进行交互。JAX-WS允许开发者将服务接口直接映射到...
在WebLogic服务器上部署JAX-WS服务时,可能会遇到一些配置问题。JAX-WS(Java API for XML Web Services)是Java平台上的一个标准,用于创建和部署Web服务。WebLogic作为一款强大的Java EE应用服务器,支持JAX-WS...
《RESTful Java with JAX-RS 2.0》是一本专注于Java语言在构建RESTful服务方面的专著。作者Bill Burke以其在Java技术方面的深厚底蕴和对RESTful架构的深刻理解,引领读者深入理解并掌握JAX-RS 2.0标准。 书中首先...
在给定的压缩包文件"jax-ws api jar包"中,包含的是JAX-WS 2.2.1版本的API库,即`jaxws-api-2.2.1.jar`。这个jar文件是开发基于JAX-WS的Web服务所必需的依赖之一。以下是关于JAX-WS的一些核心知识点: 1. **服务端...
标题提到的"JAX-WS所需Jar包"是指为了在Java环境中支持JAX-WS功能,开发者需要的一组核心库。这些库包含了运行和开发JAX-WS Web服务所必需的组件。下面将逐一解释这些库的作用: 1. **jaxb-xjc.jar**: 这是Java ...
3.众多元数据(Annotations)会被JAX-WS用来描述Web Services的相关类,包括Common Annotations, Web Services Metadata, JAXB2的元数据和JAX-WS2.0规范自己的元数据. 4.Annotation Processing Tool(APT)是JAX-WS重要的...
标题中的“一个包含jax-ws和jax-rs的例子(含服务端和客户端)”是指这是一个示例项目,它演示了如何使用Java API for XML Web Services (JAX-WS)和Java API for RESTful Web Services (JAX-RS)来创建和消费Web服务。...
**JAX-WS 2.0 研究项目** JAX-WS(Java API for XML Web Services)是Java平台上用于构建和消费Web服务的标准API。这个研究项目专注于JAX-WS 2.0版本,它是JAX-WS的一个重要里程碑,引入了许多改进和新特性以增强...
基于jax-ws 实现的web service client和server端的demo程序。 注:如果使用的是 myeclipse 时 server 部署到tomcat 启动的时候会报错 解决办法:找到myeclipse安装目录下的 plugins 目录里 查找 webservices-rt.jar,...
**JAX-WS2.1用户指南** JAX-WS(Java API for XML Web Services)是Java平台上用于创建Web服务的标准API,版本2.1是其一个重要里程碑。本指南将深入探讨JAX-WS 2.1的核心概念、功能以及如何在实际开发中应用它。...
【标题】: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** Java API for XML Web Services (JAX-WS) 是Java平台上的一个标准接口,用于创建和消费Web服务。它是Sun Microsystems在2004年推出的一个重要框架,旨在简化Web服务的开发,使得Java开发者能够更...
JAX-WS(Java API for XML Web Services)是Java平台上的一个标准,用于创建和消费Web服务。本篇将深入讲解如何基于JAX-WS开发一个WebService实例。 首先,让我们了解JAX-WS的基本概念。JAX-WS提供了一种简单的方式...