[转] JAX-WS 2.0, an HelloWorld例子

JAX-RPC 1.1 , 开发人员需要写一个接口类 Service Endpoint Interface(SEI), JAX-WS 2.0 , 开发人员一上来就可以直接写自己的实现类 . 通过使用 annotations, 自动生成 SEI 和其他一些文件 . 这样有助于开发人员专注于自己想开发的部分 , 而不必要地分散精力去维护其他的一些附属文件 .<o:p></o:p>

下面通过一个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,如果用DosLinux的话,请适当更改相应的形式.

 <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>
使用NetBeans 5.0和GlassFish建立JAX-WS 2.0服务

这篇文章说明使用NetBeans5.0GlassFish应用服务器如何创建JAX-WS2.0服务。使用NetBeansGlassFish的内置特征,你可以创建一个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
</o:p>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值