Java创建web services

web service,从名字上看,就是 web 服务。那神马是 web 服务呢?~~~~(>_<)~~~~ 网络上的程序大多采用 c/s 模型,也就是客户端和服务器分离,客户端不直接操纵数据,而数据的来源以及增删改查都是服务器完成的。手机或是 pad 上的 app 实际上是个 client,它通常要获取数据,从服务器端,那肿么获取呢?HTTP 协议,很好,很不错。不过 app 获取的数据和 web 页面获取的数据还有点不一样,me 们希望 app 获取到的是一种“纯”数据,而 html 文档则不是。还有些时候,me 们希望给其他人提供接口服务,或是使用其他人的数据,这是比较常见的,为此,在 web 应用之上出现了 web service 这个东西。

简单滴说,web service 就是一系列接口,使用应用层协议 HTTP, xml 或是 json 的格式传递数据。

Java 语言本身提供对 web service 的支持,可以说甚至方便。web service 的一般使用方式是配置在 web server 上的,不过也可以使用一个普通的 java 程序 publish 它。

快速创建 web service

这里有 4 个文件,HelloWeb.java、HelloWebImpl.java、HelloWebPublisher.java 和 HelloWebClient.java,第一个是 web service 的接口,第二个是接口的实现类,第三个发布 web service,第四个是客户端测试程序。先上代码:

HelloWeb.java

  1. package test;
  2.  
  3. import javax.jws.WebMethod;
  4. import javax.jws.WebService;
  5.  
  6. @WebService
  7. public interface HelloWeb {
  8.  
  9.    @WebMethod
  10.     public String sayGreeting(String name);
  11.  
  12. }

HelloWebImpl.java

  1. package test;
  2.  
  3. import javax.jws.WebService;
  4.  
  5. @WebService(endpointInterface = "test.HelloWeb")
  6. public class HelloWebImpl implements HelloWeb{
  7.     @Override
  8.     public String sayGreeting(String name){
  9.         return "hello," + name +".";
  10.     }
  11. }

HelloWebPublisher.java

  1. package test;
  2.  
  3. import javax.xml.ws.Endpoint;
  4. import test.HelloWebImpl;
  5.  
  6. public class HelloWebPublisher{
  7.     public static void main(String[] args) {
  8.         Endpoint.publish("http://localhost:8088/web-services/hello", new HelloWebImpl());
  9.     }
  10. }

HelloWebClient.java

  1. package test;
  2.  
  3. import javax.xml.namespace.QName;
  4. import javax.xml.ws.Service;
  5. import java.net.URL;
  6.  
  7. public class HelloWebClient{
  8.     public static void main(String argv[ ]) throws Exception {
  9.         String name = "ant";
  10.                
  11.  
  12.         // Qualified name of the service:
  13.         // 1st arg is the service URI
  14.         // 2nd is the service name published in the WSDL
  15.         QName qname = new QName("http://test/", "HelloWebImplService");
  16.  
  17.         Service service = Service.create(url, qname);
  18.         // Extract the endpoint interface, the service "port".
  19.         HelloWeb app = service.getPort(HelloWeb.class);
  20.  
  21.         System.out.println(app.sayGreeting(name));
  22.     }
  23. }

说明:

  • 需要运行的是 HelloWebPublisher 和 HelloWebClient 两个程序,前一个是发布 web service,运行它之后,可以浏览器中访问:http://localhost:8088/web-services/hello;后一个是 Java 的测试程序,它向 web service 传递一个参数,然后返回一个结果,这应该是典型的应用;
  • 至于 HelloWebClient 中的 QName 为嘛是:http://test/,其实 me 也不大清楚,me 只是根据结果凑出来的这个东西;也就是其实 me 是个 newcomer;
  • over !

配置在 web 上的 web service

将 web service 发布在 web 上,首相说上面的 HelloWeb.java 和 HelloWebImpl.java 是不需要变的,而 HelloWebPublisher.java 已经不再需要了,HelloWebClient.java 是做测试用的。好吧,要将上面写的 web service 部署在 web 容器内,其一要添加些配置,其二要加载一些 jar 包,主要是三个地方:首先要在 web.xml 中配置一下,其次要添加一个 sum-jaxws.xml 的配置文件,再最后就是加进来 jar 包。

1. web.xml 中添加设置

  1.   <listener>
  2.       <listener-class>
  3.           com.sun.xml.ws.transport.http.servlet.WSServletContextListener
  4.       </listener-class>
  5.   </listener>
  6.   <servlet>
  7.       <servlet-name>HelloWebWS</servlet-name>
  8.       <servlet-class>
  9.           com.sun.xml.ws.transport.http.servlet.WSServlet
  10.       </servlet-class>
  11.  </servlet>
  12.  
  13.  <servlet-mapping>
  14.      <servlet-name>HelloWebWS</servlet-name>
  15.      <url-pattern>/web-services/hello</url-pattern>
  16.   </servlet-mapping>

2. 在 web.xml 所在的目录添加一个 sun-jaxws.xml 文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
  3.   <endpoint
  4.     name="HelloWebWS"
  5.     implementation="test.HelloWebImpl"
  6.     url-pattern="/web-services/hello"/>
  7. </endpoints>

3. 所需要的 jar 包:

https://jax-ws.java.net/ 上面下载 jar 包,然后全部放到 lib 目录下。好傻瓜的做法,~~~~(>_<)~~~~

4. 这一步可能需要,但是发现有时候又不是必须的

在项目文件夹下(可以看到 src 和 build 目录)执行命令:> wsgen -s src -d build/classes -cp build/classes test.HelloWebImpl;这一步貌似会生成一些 web service 相关的 java 类和 class;

over ! 其实 me 也是个新手,只是最初有人问到如何实现 web service,me 了解了一下,貌似已经有一两个星期了,O__O"…。暂时可能不会深入学习了,以后有时间了再。

Tags: 

Article type: