Опубликован: 10.10.2010 | Уровень: специалист | Доступ: свободно
Лекция 11:

Web-сервисы. Компиляция и развертывание

< Лекция 10 || Лекция 11: 12 || Лекция 12 >

Клиент

Теперь, когда Web -cервис готов к работе, можно приступить к реализации клиента для него. Для этого снова воспользуемся кодом примера, поставляемого с The Java Web Services Tutorial (он располагается в каталоге simpleclient ).

Класс клиента будет выглядеть следующим образом (пример 11.1).

1	package simpleclient;
2	
3	import javax.xml.ws.WebServiceRef;
4	import helloservice.endpoint.HelloService;
5	import helloservice.endpoint.Hello;
6	
7	public class HelloClient {
8	    @WebServiceRef(wsdlLocation="http://localhost:8080/helloservice/hello?wsdl")
9	    static HelloService service;
10	        
11	    /**
12	     * @param args the command line arguments
13	     */
14	    public static void main(String[] args) {
15	        try {
16	            HelloClient client = new HelloClient();
17	            client.doTest(args);
18	        } catch(Exception e) {
19	            e.printStackTrace();
20	        }
21	    }
22	    
23	    public void doTest(String[] args) {
24	        try {
25	            System.out.println("Retrieving the port from the following service: " + service);
26	            Hello port = service.getHelloPort();
27	            System.out.println("Invoking the sayHello operation on the port.");
28	
29	            String name;
30	            if (args.length > 0) {
31	                name = args[0];
32	            } else {
33	                name = "No Name";
34	            }
35	            
36	            String response = port.sayHello(name);
37	            System.out.println(response);
38	        } catch(Exception e) {
39	            e.printStackTrace();
40	        }
41	    }
42	}
Листинг 11.1. Клиентское приложение

Клиент объявляется принадлежащим пакету simpleclient (строка 1). Импортируется класс javax.xml.ws.WebServiceRef (строка 3), являющийся аннотацией. Далее импортируются два класса из пакета helloservice.endpoint - класс Hello (строка 5) и класс HelloService (строка 4). Эти классы (а также несколько других) будут сгенерированы автоматически, на основании анализа WSDL -файла. Hello - интерфейс, в котором объявлены все методы Web -сервиса. Клиентская заглушка ( proxy класс), передающий вызовы Web -сервису, реализует этот интерфейс, и со стороны клиента все выглядит так, как будто он непосредственно вызывает методы Web -сервиса. HelloService - сервисный класс, который создает клиентский proxy. Кроме того, для каждого метода и возвращаемого значения генерируются свои вспомогательные классы.

Для того чтобы вспомогательные классы могли быть сгенерированы, нужно указать файл WSDL, в котором описан нужный Web -сервис. Для этого служит специальная аннотация WebServiceRef (строка 8), свойство wsdlLocation которой указывает на местоположение этого файла.

При старте клиента (метод main,строка 14) создается объект типа HelloClient (строка 16) и запускается его метод doTest (строка 17). Этот метод получает ссылку на клиентский класс proxy, вызывая метод getHelloPort (строка 26) класса HelloService.Начиная с этого момента, клиент может вызывать методы Web -сервиса (строка 36). Таким образом, как и ожидалось, транспортные детали взаимодействия с Web -сервисом полностью скрыты от клиента - для него все выглядит как обычный локальный вызов метода sayHello локального объекта port.

Для того чтобы откомпилировать пример, достаточно набрать команду

asant

(компиляция является целью по умолчанию). Ниже приведен вывод этой команды

Buildfile: build.xml

clean:

javaee-home-test:

init:

prepare:
[echo] Creating the required directories ...
[mkdir] Created dir: H:\Java\jwstutorial20_new\examples\ 
jaxws\simpleclient\build

generate-client:
[wsimport] command line: wsimport 
H:\Java\AppServer\jdk\jre\bin\java.exe -classpath 
H:\Java\AppServer\lib\activation.jar;
H:\Java\AppServer\lib\admin-cli.jar;
H:\Java\AppServer\lib\appserv-admin.jar;
H:\Java\AppServer\lib\appserv-ext.jar;
H:\Java\AppServer\lib\ jmxremote_optional.jar;
H:\Java\AppServer\lib\appserv-cmp.jar; 
H:\Java\AppServer\lib\appserv-deployment-client.jar;
H:\Java\AppServer\lib\appserv-jstl.jar;
H:\Java\AppServer\lib\appserv-jwsacc.jar;
H:\Java\AppServer\lib\appserv-launch.jar;
H:\Java\AppServer\lib\appserv-rt.jar;
H:\Java\AppServer\lib\appserv-tags.jar;
H:\Java\AppServer\lib\appserv-upgrade.jar;
H:\Java\AppServer\lib\appserv-ws.jar;
H:\Java\AppServer\lib\com-sun-commons-launcher.jar;
H:\Java\AppServer\lib\com-sun-commons-logging.jar;
H:\Java\AppServer\lib\dbschema.jar; 
H:\Java\AppServer\lib\j2ee-svc.jar;
H:\Java\AppServer\lib\j2ee.jar; 
H:\Java\AppServer\lib\javaee.jar;
H:\Java\AppServer\
 
lib\jhall.jar;
H:\Java\AppServer\lib\jsf-impl.jar;
H:\Java\ AppServer\lib\mail.jar;
H:\Java\AppServer\lib\sun-appserv-ant.jar; 
H:\Java\AppServer\lib\toplink-essentials-agent.jar; 
H:\Java\AppServer\lib\toplink-essentials.jar;
H:\Java\ AppServer\jdk\lib\tools.jar com.sun.tools.ws.WsImport -d 
H:\Java\jwstutorial20_new\examples\jaxws\simpleclient\build -g -keep -s 
H:\Java\jwstutorial20_new\examples\jaxws\simpleclient\ src -verbose 
	http://localhost:8080/helloservice/hello?wsdl -p 
helloservice.endpoint
[wsimport] helloservice\endpoint\Hello.java 
[wsimport] helloservice\endpoint\HelloService.java 
[wsimport] helloservice\endpoint\ObjectFactory.java 
[wsimport] helloservice\endpoint\SayHello.java 
[wsimport] helloservice\endpoint\SayHelloResponse.java 
[wsimport] helloservice\endpoint\package-info.java 
[wsimport] helloservice\endpoint\Hello.java 
[wsimport] helloservice\endpoint\HelloService.java 
[wsimport] helloservice\endpoint\ObjectFactory.java 
[wsimport] helloservice\endpoint\SayHello.java 
[wsimport] helloservice\endpoint\SayHelloResponse.java 
[wsimport] helloservice\endpoint\package-info.java

compile-client:
[echo] Compiling the client source code ...
[javac] Compiling 1 source file to H:\Java\ 
jwstutorial20_new\examples\jaxws\simpleclient\build

prepare-dist:
[echo] Creating the required directories ...
[mkdir] Created dir: H:\Java\jwstutorial20_new\ 
examples\jaxws\simpleclient\dist

package-client:
[echo] Building the client JAR   file ...
[jar] Building jar: H:\Java\jwstutorial20_new\ 
examples\jaxws\simpleclient\dist\simpleclient.jar

build-client:

build:
BUILD SUCCESSFUL 
Total time: 9 seconds

Следует отметить, что одной командой выполнено несколько действий. Во-первых, сгенерированы необходимые вспомогательные файлы с помощью утилиты wsimport.Во-вторых, исходный код клиента откомпилирован (вместе с автоматически сгенерированными файлами). И в-третьих, полученные откомпилированные модули собраны в архив.

Теперь осталось выполнить команду

asant run

и убедиться в том, что написанный клиент успешно обратился к Web -сервису:

Buildfile: build.xml 

run:
[echo] To set the name, modify the client.arg property 
[echo] in build.properties. If client.arg is unset, 
[echo] the default name sent to the service is No Name.

appclient-command-common:
[exec] Retrieving the port from the following service:
helloservice.endpoint.HelloService@9770a3
[exec] Invoking the sayHello operation on the port.
[exec] Hello, Web service test.

BUILD SUCCESSFUL
Total time: 9 seconds

Без использования скриптов процесс компиляции выглядел бы так:

  1. создаем директорию ./build (в нее будем складывать откомпилированные файлы);
  2. с помощью утилиты wsimport создаем вспомогательные файлы на основании анализа WSDL.

    Для этого введем команду:

    wsimport -d ./build -s ./build -keep http://localhost:8080/ 
    helloservice/hello?wsdl

    здесь ключ -d указывает директорию, в которую следует помещать результирующие откомпилированные файлы;

    ключ -s указывает директорию для размещения сгенерированных исходных файлов;

    ключ -keep указывает на то, что после компиляции исходные файлы следует сохранить;

    последний параметр - адрес WSDL -файла, для которого нужно сгенерировать вспомогательные файлы.

    В результате работы этой утилиты в папке ./build будет сформирована соответствующая структуре пакетов структура каталогов и в ней будут размещены исходные и откомпилированные файлы - результат работы утилиты wsimport ;

  3. компилируем приложение:
    javac -classpath H:\Java\AppServer\lib\activation.jar;
    H:\Java\ AppServer\lib\admin-cli.jar;
    H:\Java\AppServer\lib\ appserv-admin.jar;
    H:\Java\AppServer\lib\appserv-cmp.jar;
    H:\Java\AppServer\lib\appserv-deployment-client.jar;
    H:\Java\AppServer\lib\appserv-ext.jar;
    H:\Java\AppServer\lib\appserv-jstl.jar;
    H:\Java\AppServer\lib\appserv-jwsacc.jar;
    H:\Java\AppServer\lib\appserv-launch.jar;
    H:\Java\AppServer\lib\appserv-rt.jar;
    H:\Java\AppServer\lib\appserv-tags.jar;
    H:\Java\AppServer\lib\appserv-upgrade.jar;
    H:\Java\AppServer\lib\appserv-ws.jar;
    H:\Java\AppServer\lib\com-sun-commons-launcher.jar;
    H:\Java\AppServer\lib\com-sun-commons-logging.jar;
    H:\Java\AppServer\lib\dbschema.jar; 
    H:\Java\AppServer\lib\j2ee-svc.jar;
    H:\Java\AppServer\lib\j2ee.jar;
    H:\Java\AppServer\lib\javaee.jar;
    H:\Java\AppServer\lib\ jhall.jar;
    H:\Java\AppServer\lib\jmxremote_optional.jar;
    H:\Java\AppServer\lib\jsf-impl.jar;
    H:\Java\AppServer\lib\mail.jar; 
    H:\Java\AppServer\lib\sun-appserv-ant.jar;
    H:\Java\AppServer\lib\toplink-essentials-agent.jar;
    H:\Java\AppServer\lib\toplink-essentials.jar;
    H:\Java\AppServer\jdk\lib\tools.jar;
    H:\Java\jwstutorial20_new\examples\jaxws\simpleclient\ 
    build -d H:\Java\jwstutorial20_new\examples\jaxws\simpleclient\ 
    build ./src/HelloClient.java
  4. и запускаем (для этого нужно перейти в папку ./build):
    appclient simpleclient.HelloClient "WEB service test "

Полученный вывод

Retrieving the port from the following service: helloservice.end-
point.HelloService@801059 
Invoking the sayHello operation on the port. 
Hello, WEB service test

говорит о том, что клиент успешно откомпилирован и выполнен.

Командный файл appclient располагается в каталоге bin сервера приложений и представляет собой обертку над интерпретатором java, которая определяет некоторые переменные окружения, classpath и другие параметры виртуальной машины.

< Лекция 10 || Лекция 11: 12 || Лекция 12 >
Алмаз Мурзабеков
Алмаз Мурзабеков
Прохожу курс "Построение распределенных систем на Java" в третьей лекции где описывается TCPServer вылетает эта ошибка
"Connection cannot be resolved to a type"


Java version 1.7.0_05