Розробка клієнтів веб-служб JAX-WS

  1. створення клієнта
  2. Розробка клієнта
  3. Написання коду веб-сторінки
  4. Створення та написання коду для сервлета
  5. розгортання клієнта
  6. Асинхронні клієнти веб-служб
  7. Створення форми Swing
  8. Включення асинхронних клієнтів
  9. Додавання коду асинхронного клієнта
  10. Закріплення матеріалу на практиці
  11. додаткові відомості

У цьому навчальному курсі використовуються функції веб-служб, надані IDE NetBeans, для аналізу веб-служби Spell Checker, після чого створюється веб-клієнт, який взаємодіє зі службою. Клієнт використовує клас сервлетів та веб-сторінку. Користувач передає інформацію сервлету з веб-сторінки.

зміст

Для роботи з цим навчальним курсом зверніть увагу на таке програмне забезпечення та ресурси.

Застереження. У разі використання пакета JDK 6 необхідний пакет JDK 6 Update 7 або більш пізній.

Можна встановити і сервер Tomcat, і GlassFish, при поширенні IDE NetBeans через Інтернет і за допомогою Java EE. Також можна скористатися сторінкою завантажень GlassFish Server або сторінкою завантажень Apache Tomcat .

Важливо! Для роботи з проектами Java EE потрібні Tomcat 7.x, GlassFish Server або Oracle WebLogic Server 12c.

Нижче представлений зовнішній вигляд клієнта з усіма даними, отриманими від веб-служби:

Після закінчення даного навчального курсу ви виявите, що ваш єдиний внесок в додаток складається з надання тексту на перевірку, виклику веб-служби та виведення результату. Весь код, необхідний для взаємодії з веб-службою і для передачі тексту, створюється в середовищі IDE автоматично. Веб-служба перевірки орфографії подбає про все інше. Вона визначає неправильно написані слова і надає список пропонованих альтернатив.

Використовувана в цьому навчальному курсі веб-служба перевірки орфографії надана CDYNE Corporation. Компанія CDYNE займається розробкою, продажем і підтримкою повного набору веб-служб розширення даних, якості даних і аналізу даних, а також інтеграцію рішень по бізнес-інформації і аналітики. Веб-служба перевірки орфографії є ​​однією з веб-служб, що надаються компанією CDYNE. Слід зазначити, що стабільність додатків на основі однієї або більше веб-служб залежить від доступності та надійності веб-служб. Однак в розділі Часто задавані питання CDYNE, вказується, що задана "завдання досягнення доступності зі значенням 100%" і що в разі "стихійних лих, терористичних актів та інших катастроф трафік веб-служб передається на додатковий центр управління даними". NetBeans дякує CDYNE за можливість написання цього навчального курсу і за допомогу в його розробці.

Для використання веб-служби в мережі (інакше званого "споживанням веб-служби") необхідно створити клієнт веб-служби. Для створення клієнтів веб-служб IDE NetBeans забезпечує функцію створення клієнтів, що представляє собою майстер клієнта веб-служб, що створює код для пошуку веб-служби. Відвідувачі можуть замовити кошти для розробки створюваного клієнта веб-служби - робоча область, що складається з вузлів у вікні "Проекти". Ці функції є частиною комлекта EE установки IDE NetBeans. Вони доступні відразу після установки, додаткові модулі не потрібні.

створення клієнта

Цей розділ присвячений роботі з майстром для створення вихідних об'єктів Java з файлу WSDL веб-служби.

  1. Виберіть 'Файл'> 'Створити проект' (Ctrl-Shift-N в Windows і Linux, ⌘-Shift-N в ОС Mac). У розділі "Категорії" виберіть "Java Web". В області "Проекти" виберіть "Веб-додаток". Натисніть кнопку "Далі". Назвіть проект SpellCheckService і переконайтеся, що в якості цільового сервера вказаний відповідний сервер. (Зверніться до розділу "Початок роботи" для отримання додаткових відомостей). Залиште значення інших параметрів за замовчуванням і натисніть кнопку "Готово".
  2. У вікні 'Проекти' клацніть правою кнопкою миші вузол проекту SpellCheckService і виберіть Створити> Інші, потім виберіть 'Клієнт веб-служби' в категорії 'Веб-служби' майстра створення файлів. Натисніть кнопку "Далі".
  3. Виберіть 'URL-адресу WSDL' і вкажіть наступний URL-адресу веб-служби:

    asmx?wsdl> http://wsf.cdyne.com/SpellChecker/check.asmx?wsdl

    Якщо комп'ютер захищений брандмауером, то може знадобитися вказати проксі-сервер, тому що в іншому випадку завантажити файл WSDL буде неможливо. Щоб вказати проксі-сервер, натисніть в майстра кнопку "Налаштувати проксі". Відкривається вікно налаштувань середовища IDE, в якому можна вказати загальний проксі-сервер для середовища IDE.

  4. Назва пакета вказувати не слід. За замовчуванням ім'я пакета класу клієнта береться з WSDL. В даному випадку це com.cdyne.ws. Натисніть 'Готово'.
  5. У вікні "Проекти" в вузлі "Web Service References" має бути представлено наступне:

У вікні "Проекти" видно, що веб-служба під назвою "check" зробила доступними для вашого застосування кілька операцій "CheckTextBody" і "CheckTextBodyV2". У цих операціях рядок перевіряється на помилки орфографії, і дані повертаються для обробки клієнтом. Версія служби V2 не вимагає перевірки автентичності. В даному навчальному курсі буде використовуватися операція checkSoap.CheckTextBodyV2.

У вузлі Generated Sources показані клієнтські заглушки, автоматично створені майстром створення клієнта веб-служби JAX-WS.

Розгорніть вузол "WEB-INF" і ніжній вузол "wsdl". На екран буде виведена локальна копія файлу WSDL з ім'ям check.asmx.wsdl.

URL-адресу файлу WSDL, використовуваного для створення клієнта, прив'язаний до локальної копії файлу WSDL в файлі jax-ws-catalog.xml. Прив'язка до локальної копії має ряд переваг. Дистанційна копія файлу WSDL не обов'язково повинна бути доступна для виконання клієнта. Клієнт виконується швидше, так як відсутня потреба в аналізі віддаленого файлу WSDL. Крім того, спрощується переносимість.

Розробка клієнта

Існує багато способів реалізації клієнта веб-служби. Файл WSDL веб-служби обмежує тип даних, що відправляються в веб-службу, а також тип даних, одержуваних у відповідь. Однак файл WSDL не встановлює обмежень ні на спосіб передачі необхідної інформації, ні на компоненти користувальницького інтерфейсу. Ця реалізація клієнта складається з веб-сторінки, що дозволяє користувачеві вводити текст для перевірки, і сервлету, передає текст в веб-службу і потім відображає звіт з результатами.

Написання коду веб-сторінки

Створювана веб-сторінка складається з текстової області, в якій користувач може ввести текст, і з кнопки, щоб надіслати текст веб-службу. Залежно від версії обраного цільового серверу у тому IDE створює або файл index.html, або файл index.jsp як сторінки індексу для додатка.

  1. У вікні 'Проекти' розгорніть вузол 'Веб-сторінки' проекту SpellCheckService і двічі клацніть сторінку індексу (index.html або index.jsp), щоб відкрити відповідний файл в редакторі вихідного коду.
  2. Скопіюйте наступний код і вставте його на сторінку індексу поверх тегів <body>: <body> <form name = "Test" method = "post" action = "SpellCheckServlet"> <p> Enter the text you want to check: </ p > <p> <p> <textarea rows = "7" name = "TextArea1" cols = "40" ID = "Textarea1"> </ textarea> </ p> <p> <input type = "submit" value = "Spell Check" name = "spellcheckbutton"> </ form> </ body>

    Описаний вище код вказує, що при натисканні кнопки передачі запиту вміст області textarea передається методом POST в сервлет SpellCheckServlet.

Створення та написання коду для сервлета

У цьому розділі описано створення сервлету, що взаємодіє з веб-службою. При цьому код, який виконує взаємодія, надається середовищем IDE. В результаті необхідно працювати тільки з бізнес-логікою, тобто з підготовкою переданого тексту і обробкою результату.

  1. Клацніть правою кнопкою миші вузол проекту SpellCheckService в вікні "Проекти", виберіть команду "Створити> Інше", а потім "Веб> Сервлет". Натисніть 'Далі', щоб відкрити майстер створення сервлетів.
  2. Назвіть сервлет SpellCheckServlet і введіть clientservlet в списку "Пакет". Натисніть 'Далі'.
  3. Зверніть увагу, що зіставлення URL-адреси на панелі 'Налаштування розгортання сервлету' для даного сервлету має значення / SpellCheckServlet. Прийміть параметри за замовчуванням і натисніть кнопку "Готово". Сервлет відкривається в редакторі вихідного коду.
  4. Помістіть покажчик миші в тіло методу processRequest в проекті SpellCheckServlet.java і додайте кілька нових рядків прямо у верхній частині методу.
  5. Клацніть правою кнопкою миші область, створену в попередньому дії, і виберіть "Вставити код> Дзвонити операцію веб-служби". Виберіть операцію checkSoap.CheckTextBodyV2 в діалоговому вікні "Вибір спричиненої операції", як зазначено нижче:

    Натисніть кнопку "ОК".

    Примітка. Також можна перетягнути вузол операції безпосередньо з вікна 'Проекти' в редактор, а не відкривати діалогове вікно, показане вище.

    В кінці класу SpellCheckServlet видно закритий метод виклику служби SpellCheckerV2 і повернення об'єкта com.cdyne.ws.DocumentSummary.

    private DocumentSummary checkTextBodyV2 (java.lang.String bodyText) {
    com.cdyne.ws.CheckSoap port = service.getCheckSoap ();
    return port.checkTextBodyV2 (bodyText);
    }

    Цього методу цілком достатньо для виклику операцій веб-служби. Крім того, у верхній частині класу оголошені наступні рядки коду (виділено жирним шрифтом):

    public class SpellCheckServlet extends HttpServlet {@WebServiceRef (wsdlLocation = "http://wsf.cdyne.com/SpellChecker/check.asmx?WSDL") private Check service;
  6. Замініть блок try в методі processRequest () наступним кодом. Вбудовані коментарі в коді пояснюють призначення кожного рядка. try (PrintWriter out = response.getWriter ()) {// Get the TextArea from the web page
    String TextArea1 = request.getParameter ( "TextArea1");
    // Initialize WS operation arguments java.lang.String bodyText = TextArea1; // Process result com.cdyne.ws.DocumentSummary doc = checkTextBodyV2 (bodyText); String allcontent = doc.getBody (); // From the retrieved document summary, // identify the number of wrongly spelled words: int no_of_mistakes = doc.getMisspelledWordCount (); // From the retrieved document summary, // identify the array of wrongly spelled words: List allwrongwords = doc.getMisspelledWord (); out.println ( "<html>"); out.println ( "<head>"); // Display the report's name as a title in the browser's titlebar : out.println ( "<title> Spell Checker Report </ title>"); out.println ( "</ head>"); out.println ( "<body>"); // Display the report's name as a header within the body of the report : out.println ( "<h2> <font color = 'red'> Spell Checker Report </ font> </ h2>"); // Display all the content (correct as well as incorrectly spelled) between quotation marks: out.println ( "<hr> <b> Your text: </ b> \" "+ allcontent +" \ "" + "<p > "); // For every array of wrong words (one array per wrong word), // identify the wrong word, the number of suggestions, and // the array of suggestions. Then display the wrong word and the number of suggestions and // then, for the array of suggestions belonging to the current wrong word , display each // suggestion: for (int i = 0; i <allwrongwords.size (); i ++) {String onewrongword = ((Words) allwrongwords.get (i)). getWord (); int onewordsuggestioncount = ((Words) allwrongwords.get (i)). getSuggestionCount (); List allsuggestions = ((Words) allwrongwords.get (i)). GetSuggestions (); out.println ( "<hr> <p> <b> Wrong word: </ b> <font color = 'red'>" + onewrongword + "</ font>"); out.println ( "<p> <b>" + onewordsuggestioncount + "suggestions: </ b> <br>"); for (int k = 0; k <allsuggestions.size (); k ++) {String onesuggestion = (String) allsuggestions.get (k); out.println (onesuggestion); }} // Display a line after each array of wrong words : out.println ( "<hr>"); // Summarize by providing the number of errors and display them : out.println ( "<font color = 'red'> <b> Summary: </ b>" + no_of_mistakes + "mistakes ("); for (int i = 0; i <allwrongwords.size (); i ++) {String onewrongword = ((Words) allwrongwords.get (i)). getWord (); out.println (onewrongword);} out.println ( ")."); out.println ( "</ font>"); out.println ( "</ body>"); out.println ( "</ html>"); }
  7. З'являться панелі помилок і попереджуючі значки, що вказують на класи, які не знайдені. Щоб виправити вираження імпорту після вставки коду натисніть Ctrl-Shift-I (⌘-Shift-I в Mac) або клацніть правою кнопкою миші в будь-якому місці розташування, після чого відкриється контекстне меню і виберіть 'Виправити вираження імпорту'. Можна вибрати клас зі списку класів List для імпорту. Прийміть клас за замовчуванням java.util.List. Нижче наведено повний список імпортованих класів: import com.cdyne.ws.Check; import com.cdyne.ws.Words; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.ws.WebServiceRef;

    Примітка. Якщо відображається попередження, що класи com.cdyne. * Не можуть бути знайдені, не хвилюйтеся. Ця проблема вирішується при складанні проекту, коли середовище IDE аналізує файли WSDL і виявляє класи.

    Слід зазначити, що до наведеного вище код не входить обробка помилок. Додаткові відомості наведено в документі Закріплення матеріалу на практиці .

розгортання клієнта

Для складання і виконання веб-додатків в середовищі IDE використовується сценарій збірки Ant. Цей сценарій збірки створюється середовищем IDE на основі параметрів, зазначених при створенні проекту. Можна налаштувати ці параметри в діалоговому вікні 'Властивості проекту' (клацніть правою кнопкою миші вузол проекту у вікні 'Проекти' і виберіть 'Властивості').

  1. Клацніть правою кнопкою миші вузол проекту і виберіть "Виконати". Через деякий час програма має розгорнути і відобразити веб-сторінку, код якої був написаний за інструкціями в попередньому розділі.
  2. Введіть довільний текст, переконавшись, що частина тексту написана з помилками:
  3. Натисніть кнопку "Перевірка орфографії" і подивіться результат:

Асинхронні клієнти веб-служб

За замовчуванням клієнти JAX-WS, створювані IDE NetBeans є синхронізованими. Синхронні клієнти надсилають запит в веб-службу і потім припиняють обробку до отримання відповіді. Однак в деяких випадках необхідно продовжити виконання будь-яких інших дій, а не чекати відповіді. Наприклад, в деяких випадках для обробки запиту службою потрібно чимало часу. Клієнти веб-служб, які продовжують роботу без очікування відповіді служби, називаються "асинхронними".

Асинхронні клієнти ініціюють запит служби і негайно продовжують роботу, не чекаючи отримання відповіді. Службою обробляється запит клієнта, і після закінчення деякого часу вирушає відповідь, який потім обробляється клієнтом.

Асинхронні клієнти використовують веб-служби як в режимі опитування, так і в режимі зворотного виклику. При використанні методу опитування відбувається виклик методу веб-служби та багаторазово запитується результат. Опитування займає потік виклику і тим самим блокує роботу, що робить небажаним його використання в додатках з графічним інтерфейсом користувача. У режимі зворотного виклику в момент виклику методу веб-служби в веб-службу передається обробник зворотного виклику. Після отримання результату викликається метод обробника handleResponse (). Даний режим підходить для додатків з графічним інтерфейсом користувача, оскільки при цьому немає необхідності чекати відповіді. Наприклад, якщо виклик здійснюється з обробника подій графічного інтерфейсу користувача, то управління негайно повертається з додатком, що дозволяє запобігти "зависання" інтерфейсу користувача. Недоліком методу опитування є той факт, що навіть якщо відповідь використовується після отримання, необхідно запросити його і дізнатися, що він отриманий.

В IDE NetBeans додається підтримка для асинхронних клієнтів до клієнтського додатку веб-служб шляхом установки прапорця в розділі редагування GUI атрибутів веб-служб для посилань на веб-служби. Всі інші аспекти розробки клієнтів збігаються з випадком синхронних клієнтів, за винятком наявності методів опитування веб-служб і методів зворотного виклику з очікуванням результату.

В іншій частині даного розділу детально описується створення графічних інтерфейсів Swing і впровадження в них асинхронних клієнтів JAX-WS.

Створення форми Swing

У цьому розділі описується створення додатка Swing. Можна не виконувати розробку графічного інтерфейсу Swing самостійно, а просто завантажити попередньо розроблену форму JFrame і перейти до розділу Створення асинхронного клієнта .

У клієнт Swing передається набирається на клавіатурі текст, який потім відправляється в службу, яка в свою чергу повертає кількість помилок і список всіх слів з помилками. Крім того, цей клієнт також виводить кожне неправильно написане слово і пропонує варіанти його заміни (слова з помилками обробляються по одному).

Створення клієнта Swing:

  1. Створіть новий проект програми Java. Назвіть його AsynchSpellCheckClient НЕ створюйте клас Main для проекту.
  2. У поданні 'Проекти' клацніть правою кнопкою миші вузол проекту AsynchSpellCheckClient і виберіть 'Створити'> 'Форма JFrame ...'
  3. Дайте формі ім'я MainForm і розмістіть її в пакеті org.me.forms.
  4. Після створення форми JFrame відкрийте властивості проекту. У категорії "Виконати" вкажіть MainForm в якості головного класу.
  5. Відкрийте режим проектування для MainForm.java в редакторі. Перетягніть з палітри три елементи "панель прокрутки" на MainForm. Задайте положення і розмір панелей прокрутки. У них будуть розміщені поля з набирається текстом, який потрібно перевірити, слова з помилками і пропозиції по заміні чергового неправильно написаного слова.
  6. Перетягніть п'ять текстових полів на форму MainForm. Три з них розмістіть на панелях прокрутки. Змініть їх наступним чином: tfYourText Так Так tfNumberMistakes Ні Ні tfWrongWords Так Ні tfWrongWord1 Ні Ні tfSuggestions1 Так Ні
  7. Перетягніть індикатор виконання на MainForm. Назвіть змінну pbProgress.
  8. Перетягніть дві Кнопки на MainForm. Назвіть першу кнопку btCheck і замініть її текст на "Перевірити текст" або "Перевірити правопис". Назвіть другу кнопку btNextWrongWord, змініть її текст на "Наступне слово з помилкою" і зробіть її неактивною.
  9. Перетягніть кілька Ярликів на MainForm, щоб озаглавити ваше додаток і описати текстові поля.

Налаштуйте зовнішній вигляд JFrame відповідно до вподобань і збережіть його. Потім додайте функціональні можливості клієнта веб-служби.

Включення асинхронних клієнтів

Додайте посилання на веб-службу, як описано в розділі створення клієнта . Потім змініть атрибути веб-служб для включення асинхронних клієнтів.

  1. У вікні 'Проекти', клацніть правою кнопкою миші вузол проекту AsynchSpellCheckClient і виберіть 'Створити'> 'Інші'. У майстра створення файлу виберіть "Веб-служби"> "Клієнт веб-служби". У майстра "Клієнт веб-служби" вкажіть URL-адресу веб-служби:

    asmx?wsdl> http://wsf.cdyne.com/SpellChecker/check.asmx?wsdl . Прийміть параметри за замовчуванням і натисніть кнопку "Готово". Зробіть все те саме, що і в розділі створення клієнта , Починаючи з пункту 2.

  2. Розгорніть 'посилання на агентство веб-служби' і клацніть правою кнопкою міші службу check. Відкріється контекстне меню.
  3. У контекстного меню віберіть "Правка атрібутів веб-служби". Відкріється діалогове вікно "Атрибути веб-служби".
  4. Перейдіть на вкладку "Налаштування WSDL".
  5. Розгорніть вузол "Операції типу порту". Розгорніть вузол first CheckTextBodyV2 и віберіть пункт "Включити асинхронний клієнт".
  6. Натісніть кнопку "ОК". Діалогове вікно закріється, и появится попередження про ті, что зміна атрібутів веб-служби прізведе до оновлення Вузли клієнта.
  7. Натисніть кнопку "ОК". Вікно попередження закриється, і вузол клієнта буде оновлено. Якщо розгорнути вузол check в вузлі "Посилання на веб-служби", з'являться два варіанти роботи CheckTextBody: "Опитування" і "Як передзвонити".

Тепер для додатка включені асинхронні клієнти веб-служби SpellCheck.

Додавання коду асинхронного клієнта

Тепер, коли є асинхронні операції веб-служб, додайте асинхронну операцію до MainForm.java.

Додавання коду асинхронного клієнта

  1. У MainForm перейдіть до подання вихідного коду і додайте наступний метод перед остаточною закриває дужкою.
    public void callAsyncCallback (String text) {}
  2. У вікні 'Проекти' розгорніть вузол 'Посилання на веб-служби' AsynchSpellCheckClient і знайдіть операцію checkSoap.CheckTextBodyV2 [Asynch Callback].
  3. Перетягніть операцію CheckTextBodyV2 [Asynch Callback] в порожнє тіло методу callAsyncCallback. Створюється наступний блок try. Порівняйте цей згенерований код з кодом, який генерується для синхронних клієнтів. try {// Call Web Service Operation (async. callback) com.cdyne.ws.Check service = new com.cdyne.ws.Check (); com.cdyne.ws.CheckSoap port = service.getCheckSoap (); // TODO initialize WS operation arguments here java.lang.String bodyText = ""; javax.xml.ws.AsyncHandler <com.cdyne.ws.CheckTextBodyV2Response> asyncHandler = new javax.xml.ws.AsyncHandler <com.cdyne.ws.CheckTextBodyV2Response> () {public void handleResponse (javax.xml.ws.Response < com.cdyne.ws.CheckTextBodyV2Response> response) {try {// TODO process asynchronous response here System.out.println ( "Result =" + response.get ()); } Catch (Exception ex) {// TODO handle exception}}}; java.util.concurrent.Future <? extends java.lang.Object> result = port.checkTextBodyV2Async (bodyText, asyncHandler); while (! result.isDone ()) {// do something Thread.sleep (100); }} Catch (Exception ex) {// TODO handle custom exceptions here}

    У цьому коді, крім виклику веб-служби, за допомогою об'єкта AsynchHandler обробляється відповідь від служби SpellCheck. У той же час об'єкт Future перевіряє, чи був повернутий результат, і призупиняє роботу потоку до отримання результату.

  4. Перейдіть назад до подання проектування. Двічі натисніть кнопку "Перевірити правопис". При цьому до кнопки автоматично додається дію ActionListener, і виконується перехід до вистави "Вихідний код", причому курсор встановлюється в порожнє тіло методу btCheckActionPerformed.
  5. Додайте наступний код до тіла методу btCheckActionPerformed. Даний код отримує текст, що набирається в полі tfYourText, відображає індикатор виконання та повідомлення "очікування сервера", відключає кнопку btCheck і викликає асинхронний метод зі зворотним викликом. private void btCheckActionPerformed (java.awt.event.ActionEvent evt) {String text = tfYourText.getText (); pbProgress.setIndeterminate (true); pbProgress.setString ( "waiting for server"); btCheck.setEnabled (false); callAsyncCallback (text); }
  6. На початку класу MainForm використовуйте закрите поле ActionListener з ім'ям nextWord. Даний ActionListener призначене для кнопки "Наступне слово з помилкою", яка додає одне слово в список неправильно написаних слів і відображає можливі варіанти його виправлення. Створюється приватне поле, тому якщо дія ActionListener вже було визначено, можна скасувати його реєстрацію. В іншому випадку кожен раз при перевірці нового тексту потрібно додавати додатковий прослуховує процес, що в свою чергу призведе до багаторазового виклику actionPerformed (). Додаток буде працювати некоректно. public class MainForm extends javax.swing.JFrame {private ActionListener nextWord; ...
  7. Замініть весь метод callAsyncCallbackследующім кодом. Зверніть увагу, що крайній зовні блок tryудален. У ньому немає необхідності, оскільки всередині методу додані більш конкретні блоки try. Інші зміни в коді пояснені в коментарях до коду.
    public void callAsyncCallback (String text) {com.cdyne.ws.Check service = new com.cdyne.ws.Check (); com.cdyne.ws.CheckSoap port = service.getCheckSoap (); // initialize WS operation arguments here java.lang.String bodyText = text; javax.xml.ws.AsyncHandler <com.cdyne.ws.CheckTextBodyV2Response> asyncHandler = new javax.xml.ws.AsyncHandler <com.cdyne.ws.CheckTextBodyV2Response> () {public void handleResponse (final javax.xml.ws.Response <com.cdyne.ws.CheckTextBodyV2Response> response) {SwingUtilities.invokeLater (new Runnable () {public void run () {try {// Create a DocumentSummary object containing the response. // Note that getDocumentSummary () is called from the Response object // unlike the synchronous client, where it is called directly from // com.cdyne.ws.CheckTextBody
    com.cdyne.ws.DocumentSummary doc = response.get (). getDocumentSummary ();
    // From the retrieved DocumentSummary, // identify and display the number of wrongly spelled words:
    final int no_of_mistakes = doc.getMisspelledWordCount (); String number_of_mistakes = Integer.toString (no_of_mistakes); tfNumberMistakes.setText (number_of_mistakes);
    // Check to see if there are any mistakes if (no_of_mistakes> 0) {
    // From the retrieved document summary, // identify the array of wrongly spelled words, if any:
    final List <com.cdyne.ws.Words> allwrongwords = doc.getMisspelledWord ();
    // Get the first wrong word String firstwrongword = allwrongwords.get (0) .getWord ();
    // Build a string of all wrong words separated by commas, then display this in tfWrongWords
    StringBuilder wrongwordsbuilder = new StringBuilder (firstwrongword); for (int i = 1; i <allwrongwords.size (); i ++) {String onewrongword = allwrongwords.get (i) .getWord (); wrongwordsbuilder.append ( ","); wrongwordsbuilder.append (onewrongword); } String wrongwords = wrongwordsbuilder.toString (); tfWrongWords.setText (wrongwords);
    // Display the first wrong word tfWrongWord1.setText (firstwrongword);
    // See how many suggestions there are for the wrong word int onewordsuggestioncount = allwrongwords.get (0) .getSuggestionCount ();
    // Check to see if there are any suggestions. if (onewordsuggestioncount> 0) {
    // Make a list of all suggestions for correcting the first wrong word, and build them into a String. // Display the string of concactenated suggestions in the tfSuggestions1 text field
    List <String> allsuggestions = ((com.cdyne.ws.Words) allwrongwords.get (0)). GetSuggestions (); String firstsuggestion = allsuggestions.get (0); StringBuilder suggestionbuilder = new StringBuilder (firstsuggestion); for (int i = 1; i <onewordsuggestioncount; i ++) {String onesuggestion = allsuggestions.get (i); suggestionbuilder.append ( ","); suggestionbuilder.append (onesuggestion); } String onewordsuggestions = suggestionbuilder.toString (); tfSuggestions1.setText (onewordsuggestions); } Else {// No suggestions for this mistake tfSuggestions1.setText ( "No suggestions"); } BtNextWrongWord.setEnabled (true);
    // See if the ActionListener for getting the next wrong word and suggestions // has already been defined. Unregister it if it has, so only one action listener // will be registered at one time.
    if (nextWord! = null) {btNextWrongWord.removeActionListener (nextWord); }
    // Define the ActionListener (already instantiated as a private field) nextWord = new ActionListener () {
    // Initialize a variable to track the index of the allwrongwords list int wordnumber = 1; public void actionPerformed (ActionEvent e) {if (wordnumber <no_of_mistakes) {
    // get wrong word in index position wordnumber in allwrongwords String onewrongword = allwrongwords.get (wordnumber) .getWord ();
    // next part is same as code for first wrong word
    tfWrongWord1.setText (onewrongword); int onewordsuggestioncount = allwrongwords.get (wordnumber) .getSuggestionCount (); if (onewordsuggestioncount> 0) {List <String> allsuggestions = allwrongwords.get (wordnumber) .getSuggestions (); String firstsuggestion = allsuggestions.get (0); StringBuilder suggestionbuilder = new StringBuilder (firstsuggestion); for (int j = 1; j <onewordsuggestioncount; j ++) {String onesuggestion = allsuggestions.get (j); suggestionbuilder.append ( ","); suggestionbuilder.append (onesuggestion); } String onewordsuggestions = suggestionbuilder.toString (); tfSuggestions1.setText (onewordsuggestions); } Else {tfSuggestions1.setText ( "No suggestions"); }
    // increase i by 1 wordnumber ++;
    } Else {// No more wrong words! Disable next word button // Enable Check button btNextWrongWord.setEnabled (false); btCheck.setEnabled (true); }}};
    // Register the ActionListener btNextWrongWord.addActionListener (nextWord);
    } Else {// The text has no mistakes // Enable Check button tfWrongWords.setText ( "No wrong words"); tfSuggestions1.setText ( "No suggestions"); tfWrongWord1.setText ( "-"); btCheck.setEnabled (true); }} Catch (Exception ex) {ex.printStackTrace (); }
    // Clear the progress bar pbProgress.setIndeterminate (false); pbProgress.setString ( ""); }}); }}; java.util.concurrent.Future result = port.checkTextBodyV2Async (bodyText, asyncHandler); while (! result.isDone ()) {try {
    // Display a message that the application is waiting for a response from the server tfWrongWords.setText ( "Waiting ..."); Thread.sleep (100); } Catch (InterruptedException ex) {Logger.getLogger (MainForm.class.getName ()). Log (Level.SEVERE, null, ex); }}}
  8. Натисніть Ctrl-Shift-I (⌘-Shift-I в Mac) і виправте вираження імпорту. Це призведе до додавання наступних операторів імпорту: import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.SwingUtilities;

Тепер додаток можна зібрати і запустити. Цілком ймовірно, однак, встежити за подіями протягом очікування відповіді від сервера не вдасться, оскільки служба працює досить швидко.

Закріплення матеріалу на практиці

Тепер, після завершення створення клієнта веб-служби в середовищі IDE, прийшов час придбати додаткові навички і зробити з програми то, заради чого вона задумувалася. Нижче наведено дві відповідні для початку завдання.

  • Додавання в сервлет коду обробки помилок.
  • Переробка клієнта таким чином, щоб користувач міг взаємодіяти з повернутими з веб-служби даними ..


додаткові відомості

Додаткові відомості про використання IDE NetBeans для розробки додатків Java EE см. Такі ресурси:

Для відправки коментарів та пропозицій, отримання підтримки і новин про останні розробки, пов'язаних з Java EE IDE NetBeans приєднуйтесь до списку розсилки .

Asmx?
Asmx?
Asmx?
Future <?

Дополнительная информация

rss
Карта