正 文

使用JAX-WS发布RESTful Web Service


www.7dspace.com  更新日期:2006-2-7 23:18:32  七度空间


于是,我们的示例invoke方法就会是下面这个样子。

   public Source invoke(Source source) {
        try {
            MessageContext mc = wsContext.getMessageContext();
            // check for a PATH_INFO request
            String path = (String)mc.get(MessageContext.PATH_INFO);
            if (path != null && path.contains("/num1") &&
                       path.contains("/num2")) {
                return createResultSource(path);
            }
            throw new HTTPException(404);
        } catch(Exception e) {
            e.printStackTrace();
            throw new HTTPException(500);
        }
    }

你会发现,如果MessageContext.PATH_INFO没有找到,该示例会抛出HTTPException(404)异常。我们的示例终端并不抛出该异常,而是能为方法参数检查请求字符串。例如MessageContext.PATH_INFO,请求字符串可以用下面的代码从 MessageContext中获得。

String query = (String)mc.get(MessageContext.QUERY_STRING);

于是,我们可以把请求字符串传递到createResultSource(String str)方法中来解析参数,如果要为我们的示例部署一个servlet容器也可以使用标准ServletRequest对象来抽取请求字符串。而如果我们想部署一个基于Java SE的终端,我们就必须使用MessageContext.QUERY_STRING。

下面的代码获取了num1和num2的值,相加后调用createResultSource(int sum)方法来创建Source对象,它将从invoke方法中被返回。

ServletRequest req = (ServletRequest)mc.get(MessageContext.SERVLET_REQUEST);
int num1 = Integer.parseInt(req.getParameter("num1"));
int num2 = Integer.parseInt(req.getParameter("num2"));
return createResultSource(num1+num2);

至此,我们的AddNumbers类应该如下所示:

public class AddNumbersImpl implements Provider {

    @Resource
    protected WebServiceContext wsContext;

    public Source invoke(Source source) {
        try {
            MessageContext mc = wsContext.getMessageContext();
            // check for a PATH_INFO request
            String path = (String)mc.get(MessageContext.PATH_INFO);
            if (path != null && path.contains("/num1") &&
                       path.contains("/num2")) {
                return createResultSource(path);
            }
            String query = (String)mc.get(MessageContext.QUERY_STRING);
            System.out.println("Query String = "+query);
            ServletRequest req = (ServletRequest)mc.get(MessageContext.SERVLET_REQUEST);
            int num1 = Integer.parseInt(req.getParameter("num1"));
            int num2 = Integer.parseInt(req.getParameter("num2"));
            return createResultSource(num1+num2);
        } catch(Exception e) {
            e.printStackTrace();
            throw new HTTPException(500);
        }
    }

    private Source createResultSource(String str) {
        StringTokenizer st = new StringTokenizer(str, "=&/");
        String token = st.nextToken();
        int number1 = Integer.parseInt(st.nextToken());
        st.nextToken();
        int number2 = Integer.parseInt(st.nextToken());
        int sum = number1+number2;
        return createResultSource(sum);
    }

    private Source createResultSource(int sum) {
        String body =
            "<ns:addNumbersResponse xmlns:ns=\"http://duke.org\"><ns:return>"
            +sum
            +"</ns:return></ns:addNumbersResponse>";
        Source source = new StreamSource(
            new ByteArrayInputStream(body.getBytes()));
        return source;
    }
}

4页,页码:[1] [2] [3] [4] 

上一篇:反向访问列表在实际中的应用
下一篇:2006年微软停止免费技术支持的产品列表
标题:使用JAX-WS发布RESTful Web Service 作者:Joseph Ottinger 来源:Techtarget
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐