技术开发 频道

使用WAS CE开发基于JAX-WS的RESTful服务

    三、开发一个简单的RESTful Web Service

    1. 在Eclipse中创建一个Dynamic Web Project作为Web Service的宿主:

    选择File->New->Dynamic Web Project

    输入Project Name为HelloRestfulService

    2. 右击Java Resources: src,新建一个class,其中package、Name、Interfaces如下设置:

    3. 加入如下代码:

package com.ibm.wasce.samples.jaxws.rest;

import java.io.ByteArrayInputStream;
import javax.annotation.Resource;
import javax.servlet.ServletRequest;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.BindingType;
import javax.xml.ws.Provider;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.WebServiceProvider;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.http.HTTPBinding;
import javax.xml.ws.http.HTTPException; 
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

@WebServiceProvider
@BindingType (value = HTTPBinding. HTTP_BINDING )
public  class HelloWorld  implements Provider<Source> {
   @Resource
   protected WebServiceContext wsContext ;

   public Source invoke(Source source) {
       try {
           String targetName = null ;

           if (source == null ) {
               //Get: Getting input from query string
               MessageContext mc = wsContext .getMessageContext();
               String query = (String) mc.get(MessageContext. QUERY_STRING );
               System. out .println( "Query String = " + query);
               ServletRequest req = (ServletRequest) mc.get(MessageContext. SERVLET_REQUEST );
               targetName = req.getParameter( "target" );
           } else {
               //POST: Getting input from input box
               Node n = null ;
               if (source instanceof DOMSource) {
                   n = ((DOMSource) source).getNode();
               } else  if (source instanceof StreamSource) {
                   StreamSource streamSource = (StreamSource) source;
                   DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
                   InputSource inputSource = null ;
                   if (streamSource.getInputStream() != null ) {
                       inputSource = new InputSource(streamSource.getInputStream());
                   } else  if (streamSource.getReader() != null ) {
                       inputSource = new InputSource(streamSource.getReader());
                   }
                   n = builder.parse(inputSource);
               } else {
                   throw  new RuntimeException( "Unsupported source: " + source);
               }
               NodeList children = n.getChildNodes();
               for ( int i = 0; i < children.getLength(); i++) {
                   Node child = children.item(i);
                   if (child.getNodeName().equals( "people" )) {
                       targetName = child.getAttributes().getNamedItem( "target" ).getNodeValue();
                       break ;
                   }
               }
           }
            
           String body = "<ns:return xmlns:ns=\"http://rest.jaxws.samples.wasce.ibm.com\">"
                   + "<ns:HelloWorldResponse>" + this .sayHello(targetName) + "</ns:HelloWorldResponse>"
                   + "</ns:return>" ;
           return  new StreamSource( new ByteArrayInputStream(body.getBytes()));
 
       } catch (Exception e) {
           e.printStackTrace();
           throw  new HTTPException(500);
       }
   }
 
   private String sayHello(String target){
       return  "Hello " + target;
   }

    让我们看一看代码中的几个关键点:

    a) @WebServiceProvider 表明这个Web Service实现了Provider接口,可以对XML消息进行完全的处理。

    b) Provider 是这类Web Service都要实现的接口,它只有一个方法需要实现,即:

    public abstractjava.lang.Object invoke(java.lang.Object arg0);

    c) Source 是交换信息的载体:

    当Source对象为空时,表示是一个GET Request。因为这种情况下,所有信息是被拼成一个URI的参数,并传到这个URI对应的Web Service。

    否则,是一个POST Request,其内容会包括在一个Source对象内;

    另外,Response的内容也要放到一个Source对象内。

    4. 编写web.xml

    为了使我们前面编写的Web Service能够成功部署到WAS CE中,我们需要将如下内容加入到web.xml中:

<servlet>
    <servlet-name>Hello</servlet-name>
    <servlet-class>com.ibm.wasce.samples.jaxws.rest.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Hello</servlet-name>
    <url-pattern>/Hello</url-pattern>
</servlet-mapping>

    注意,这里只是借用了<servlet>和<servlet-mapping>标签来帮助暴露Web Service,并不是真是要求这个Web Service必须要实现HttpServlet接口。

    5. 部署,运行并测试这个Web Service

    右击这个HelloRestfulService工程,选择Run As -> Run on Server,会将其部署到WAS CE中,当Status栏变为Synchronized时,在Console中会有类似如下信息显示:

    通过访问如下地址,测试使用GET方式调用RESTful Web Service返回的结果:

    http://localhost:8080/HelloRestfulService/Hello?target=Rex

0
相关文章