概述
我们思考发布一个web服务需要做的工作,并进行职责的划分。
职责的划分
通常我们会先制定抽象的接口,然后根据接口构造实现类。接口和实现类都完成了,再实施发布。所以,服务端的角色可以划分为:服务接口、服务实现、服务发布者。
服务端的实现
功能:将阿拉伯数字转换成中文数字序列。
服务接口
package cn.ljl.sand.jws.chapter1.service;import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService;@WebService public interface InterpretService {@WebResult(name = "chnum") // 默认的result的name是returnpublic String interpret(@WebParam(name = "num")/* 默认的参数名是arg0, arg1... */int num); }
注意:
- WebResult注解
用以指定返回结果的名称,不指定则默认为return - WebParam注解
用以指定参数的名称,不指定则默认为arg0, arg1...
服务实现类
package cn.ljl.sand.jws.chapter1.service;import javax.jws.WebService;@WebService(endpointInterface = "cn.ljl.sand.jws.chapter1.service.InterpretService") public class InterpretServiceImpl implements InterpretService {public static final String[] CH_NUMS = // 强制格式化换行{ "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };@Overridepublic String interpret(int num) {StringBuilder builder = new StringBuilder(Integer.toString(num).length());for (int digit = num % 10; num > 0; num = num / 10, digit = num % 10) {builder.append(CH_NUMS[digit]);}builder.reverse();return builder.toString();} }
注意:
- 服务实现类也需要用WebService进行注解,并且以endpointInterface指定所继承的接口。
- 默认生成的代码可能会生成WebResult、WebParam的注解内容,但是这些不是必要的。
服务发布者
package cn.ljl.sand.jws.chapter1.service;import javax.xml.ws.Endpoint;public class InterpretServicePublisher {public static void main(String[] args) {String address = "http://localhost:6666/service/interpret";InterpretService service = new InterpretServiceImpl();Endpoint.publish(address, service);} }
根据代码可知,wsdl的URL是http://localhost:6666/service/interpret?wsdl。可以在浏览器输入这个地址,浏览下其内容。但是我们还没有准备好对其进行解释。
客户端测试
来自为知笔记(Wiz)