jax-ws webservice编程

本文转载自http://ethan163.iteye.com/blog/1779194

1.理解JAX-WS

1.1JAX-WS概述

JAX-WS2.0 的全称为 Java API for XML-Based Webservices (JAX-WS) 2.0。JAX-WS 2.0 是对 JAX-RPC 1.0 规范的扩展,是 JAX-RPC 1.1 的后续版本, JAX-RPC 2.0 标准发布不久后便被重新命名为 JAX-WS 2.0。 JAX-WS 2.0 是面向 Java 5 的开发 Web services 的最新编程标准,它提供了新的编程模型和对以往的 JAX-RPC 方式的 Web services 进行了增强。 JAX-WS2.0 (JSR 224)是Sun新的web services协议栈,是一个完全基于标准的实现。在binding层,使用的是the Java Architecture for XMLBinding (JAXB, JSR 222),在parsing层,使用的是the Streaming API for XML (StAX, JSR 173),同时它还完全支持schema规范。

1.2JAX-WS 2.1特性

支持SOAP 1.1(默认)、1.2

支持XML/HTTP Binding

支持WS-Addressing

支持document/literal样式

支持WS-I Basic Profile 1.1

支持消息传输优化机制(Message Transmission Optimization Mechanism,MTOM)

2.准备工作

(1) jdk 1.6,j2ee-eclipse

(2) JAXWS2.2.7-20120813(http://jax-ws.java.net/),下载后解压。

3.在eclipse中新建web工程

在工程下新建目录wssrc,wsdl,build,与src目录平级

4.开始书写第一个web service

Java代码 复制代码 收藏代码
  1. package ethan.webservice;
  2. import java.util.List;
  3. import javax.jws.WebMethod;
  4. import javax.jws.WebService;
  5. import ethan.webservice.bean.User;
  6. @WebService
  7. public interface IHello {
  8. @WebMethod
  9. public List<User> sayHello(String user);
  10. }
package ethan.webservice;

import java.util.List;

import javax.jws.WebMethod;
import javax.jws.WebService;

import ethan.webservice.bean.User;

@WebService
public interface IHello {
	@WebMethod
	public List<User> sayHello(String user);
}

Java代码 复制代码 收藏代码
  1. package ethan.webservice.impl;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import javax.jws.WebService;
  5. import ethan.webservice.IHello;
  6. import ethan.webservice.bean.User;
  7. @WebService(endpointInterface = "ethan.webservice.IHello",
  8. portName = "HelloServicePort",
  9. serviceName = "HelloService",
  10. targetNamespace = "http://www.ethanSKY.com/webservice/hello")
  11. public class HelloImpl implements IHello {
  12. @Override
  13. public List<User> sayHello(String user) {
  14. System.out.println("=================start==================");
  15. List<User> users = new ArrayList<User>();
  16. User u1 = new User();
  17. u1.setId("1");
  18. u1.setName("name1");
  19. User u2 = new User();
  20. u2.setId("2");
  21. u2.setName("name2");
  22. users.add(u1);
  23. users.add(u2);
  24. System.out.println("2:"+user);
  25. System.out.println("=================end==================");
  26. return users;
  27. }
  28. }
package ethan.webservice.impl;

import java.util.ArrayList;
import java.util.List;

import javax.jws.WebService;

import ethan.webservice.IHello;
import ethan.webservice.bean.User;

@WebService(endpointInterface = "ethan.webservice.IHello", 
portName = "HelloServicePort", 
serviceName = "HelloService", 
targetNamespace = "http://www.ethanSKY.com/webservice/hello")
public class HelloImpl implements IHello {

	@Override
	public List<User> sayHello(String user) {
		System.out.println("=================start==================");
		List<User> users = new ArrayList<User>();
		User u1 = new User();
		u1.setId("1");
		u1.setName("name1");
		User u2 = new User();
		u2.setId("2");
		u2.setName("name2");
		users.add(u1);
		users.add(u2);
		System.out.println("2:"+user);
		System.out.println("=================end==================");
		return users;
	}

}

注意:

@WebService

注释在了Class之上,这告诉了JAXWS,此类为Webservice。

@WebMethod

注释在了public方法上,这告诉了JAXWS,此方法为soap方法。

5.通过Java类编译Webservice

JAX-WS 2.0 有两种开发过程:自顶向下和自底向上。自顶向下方式指通过一个 WSDL 文件来创建Web Service,自底向上是从 Java 类出发创建 Web Service。两种开发过程最终形成的文件包括:

1.SEI。一个SEI对应WSDL中WebService的一个port,在Java中是一个Java接口。

2.SEI实现类。

3.WSDL和XSD文件。

结合公司内项目的特点,我们更多的是碰到以下两种情况:

1. Onsite要我们做一个Webservice或者是客户要求我们提供Webservice接口;

2. Onsite已经有一个Webservice了,现在要我们做客户端集成。

因此,我们选用Server端通过Java Class生成webservice,而客户端通过wsdl生成Java调用类的做法。

JAXWS为我们提供了两个工具:

(1)wsgen

主要用于Server端通过Java类编译成Webservice及相关的wsdl文件

(2)wsimport

主要用于Client端(调用端)通过wsdl编译出调用Server端的Java文件

我们就来生成一下上面的这个Hello,打开命令行工具,输入如下命令:

wsgen -cp /home/ethan/workspace/work/jax-ws-server/WebContent/WEB-INF/classes ethan.webservice.impl.HelloImpl -wsdl -s wssrc -r wsdl

注:

-wsdl参数代表生成webservice

- s参数代表生成的.java文件置于何处

-d 参数代表生成的编译class文件置于何处(这个可以忽略,我们利用eclipse编译)

-r 参数代表生成的.wsdl文件与.xsd文件生成在何处

-cp参数代表classpath,即HelloImpl.class的所在

生成的java文件在wssrc目录下,将其拷贝到src目录。

同时在wsdl目录会生成四个文件,两个是wsdl文件两个是xsd文件。

6.部署webservice

在工程的WEB-INF目录下建立“sun-jaxws.xml”文件,内容如下:

Java代码 复制代码 收藏代码
  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="HelloService" implementation="ethan.webservice.impl.HelloImpl"
  5. url-pattern="/HelloService" />
  6. </endpoints>
<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
    version="2.0">
    <endpoint name="HelloService" implementation="ethan.webservice.impl.HelloImpl"
        url-pattern="/HelloService" />
</endpoints>

修改web.xml文件,如下:

Java代码 复制代码 收藏代码
  1. <listener>
  2. <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
  3. </listener>
  4. <servlet>
  5. <servlet-name>HelloService</servlet-name>
  6. <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
  7. <load-on-startup>2</load-on-startup>
  8. </servlet>
  9. <servlet-mapping>
  10. <servlet-name>HelloService</servlet-name>
  11. <url-pattern>/HelloService</url-pattern>
  12. </servlet-mapping>
<listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>

<servlet>
        <servlet-name>HelloService</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
        <servlet-name>HelloService</servlet-name>
        <url-pattern>/HelloService</url-pattern>
</servlet-mapping>

将JAXWS2.2.7-20120813中lib目录下的jar包导入工程。

将内容部署到应用服务器中,启动应用服务器,访问:http://localhost:8080/jax-ws-server/HelloService?wsdl,出现内容即代表完成服务端部署。

7.客户端开发

利用wsimport生成客户端

在eclipse中新建java工程,在命令行输入:wsimport -keep -d bin -s src wsdl/HelloService.wsdl

生成的HelloService.java中

将url = new URL(baseUrl, "file:/home/ethan/workspace/work/jax-ws-client/wsdl/HelloService.wsdl");

改为:url = new URL(baseUrl, "http://localhost:8080/jax-ws-server/HelloService");

8.书写测试类:

Java代码 复制代码 收藏代码
  1. public class HelloServiceTest {
  2. public static void main(String args[]){
  3. HelloService service = new HelloService();
  4. IHello port = service.getHelloServicePort();
  5. List<User> users = port.open("aaa");
  6. System.out.println(users.size());
  7. }
  8. }
public class HelloServiceTest {
	public static void main(String args[]){
		HelloService service = new HelloService();
        IHello port = service.getHelloServicePort();
        List<User> users = port.open("aaa");
        System.out.println(users.size());
	}
}

大功告成!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值