- створення клієнта
- Розробка клієнта
- Написання коду веб-сторінки
- Створення та написання коду для сервлета
- розгортання клієнта
- Асинхронні клієнти веб-служб
- Створення форми Swing
- Включення асинхронних клієнтів
- Додавання коду асинхронного клієнта
- Закріплення матеріалу на практиці
- додаткові відомості
У цьому навчальному курсі використовуються функції веб-служб, надані 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 веб-служби.
- Виберіть 'Файл'> 'Створити проект' (Ctrl-Shift-N в Windows і Linux, ⌘-Shift-N в ОС Mac). У розділі "Категорії" виберіть "Java Web". В області "Проекти" виберіть "Веб-додаток". Натисніть кнопку "Далі". Назвіть проект SpellCheckService і переконайтеся, що в якості цільового сервера вказаний відповідний сервер. (Зверніться до розділу "Початок роботи" для отримання додаткових відомостей). Залиште значення інших параметрів за замовчуванням і натисніть кнопку "Готово".
- У вікні 'Проекти' клацніть правою кнопкою миші вузол проекту SpellCheckService і виберіть Створити> Інші, потім виберіть 'Клієнт веб-служби' в категорії 'Веб-служби' майстра створення файлів. Натисніть кнопку "Далі".
- Виберіть 'URL-адресу WSDL' і вкажіть наступний URL-адресу веб-служби:
asmx?wsdl> http://wsf.cdyne.com/SpellChecker/check.asmx?wsdl
Якщо комп'ютер захищений брандмауером, то може знадобитися вказати проксі-сервер, тому що в іншому випадку завантажити файл WSDL буде неможливо. Щоб вказати проксі-сервер, натисніть в майстра кнопку "Налаштувати проксі". Відкривається вікно налаштувань середовища IDE, в якому можна вказати загальний проксі-сервер для середовища IDE.
- Назва пакета вказувати не слід. За замовчуванням ім'я пакета класу клієнта береться з WSDL. В даному випадку це com.cdyne.ws. Натисніть 'Готово'.
- У вікні "Проекти" в вузлі "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 як сторінки індексу для додатка.
- У вікні 'Проекти' розгорніть вузол 'Веб-сторінки' проекту SpellCheckService і двічі клацніть сторінку індексу (index.html або index.jsp), щоб відкрити відповідний файл в редакторі вихідного коду.
- Скопіюйте наступний код і вставте його на сторінку індексу поверх тегів <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. В результаті необхідно працювати тільки з бізнес-логікою, тобто з підготовкою переданого тексту і обробкою результату.
- Клацніть правою кнопкою миші вузол проекту SpellCheckService в вікні "Проекти", виберіть команду "Створити> Інше", а потім "Веб> Сервлет". Натисніть 'Далі', щоб відкрити майстер створення сервлетів.
- Назвіть сервлет SpellCheckServlet і введіть clientservlet в списку "Пакет". Натисніть 'Далі'.
- Зверніть увагу, що зіставлення URL-адреси на панелі 'Налаштування розгортання сервлету' для даного сервлету має значення / SpellCheckServlet. Прийміть параметри за замовчуванням і натисніть кнопку "Готово". Сервлет відкривається в редакторі вихідного коду.
- Помістіть покажчик миші в тіло методу processRequest в проекті SpellCheckServlet.java і додайте кілька нових рядків прямо у верхній частині методу.
- Клацніть правою кнопкою миші область, створену в попередньому дії, і виберіть "Вставити код> Дзвонити операцію веб-служби". Виберіть операцію 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; - Замініть блок 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>"); } - З'являться панелі помилок і попереджуючі значки, що вказують на класи, які не знайдені. Щоб виправити вираження імпорту після вставки коду натисніть 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 на основі параметрів, зазначених при створенні проекту. Можна налаштувати ці параметри в діалоговому вікні 'Властивості проекту' (клацніть правою кнопкою миші вузол проекту у вікні 'Проекти' і виберіть 'Властивості').
- Клацніть правою кнопкою миші вузол проекту і виберіть "Виконати". Через деякий час програма має розгорнути і відобразити веб-сторінку, код якої був написаний за інструкціями в попередньому розділі.
- Введіть довільний текст, переконавшись, що частина тексту написана з помилками:
- Натисніть кнопку "Перевірка орфографії" і подивіться результат:
Асинхронні клієнти веб-служб
За замовчуванням клієнти JAX-WS, створювані IDE NetBeans є синхронізованими. Синхронні клієнти надсилають запит в веб-службу і потім припиняють обробку до отримання відповіді. Однак в деяких випадках необхідно продовжити виконання будь-яких інших дій, а не чекати відповіді. Наприклад, в деяких випадках для обробки запиту службою потрібно чимало часу. Клієнти веб-служб, які продовжують роботу без очікування відповіді служби, називаються "асинхронними".
Асинхронні клієнти ініціюють запит служби і негайно продовжують роботу, не чекаючи отримання відповіді. Службою обробляється запит клієнта, і після закінчення деякого часу вирушає відповідь, який потім обробляється клієнтом.
Асинхронні клієнти використовують веб-служби як в режимі опитування, так і в режимі зворотного виклику. При використанні методу опитування відбувається виклик методу веб-служби та багаторазово запитується результат. Опитування займає потік виклику і тим самим блокує роботу, що робить небажаним його використання в додатках з графічним інтерфейсом користувача. У режимі зворотного виклику в момент виклику методу веб-служби в веб-службу передається обробник зворотного виклику. Після отримання результату викликається метод обробника handleResponse (). Даний режим підходить для додатків з графічним інтерфейсом користувача, оскільки при цьому немає необхідності чекати відповіді. Наприклад, якщо виклик здійснюється з обробника подій графічного інтерфейсу користувача, то управління негайно повертається з додатком, що дозволяє запобігти "зависання" інтерфейсу користувача. Недоліком методу опитування є той факт, що навіть якщо відповідь використовується після отримання, необхідно запросити його і дізнатися, що він отриманий.
В IDE NetBeans додається підтримка для асинхронних клієнтів до клієнтського додатку веб-служб шляхом установки прапорця в розділі редагування GUI атрибутів веб-служб для посилань на веб-служби. Всі інші аспекти розробки клієнтів збігаються з випадком синхронних клієнтів, за винятком наявності методів опитування веб-служб і методів зворотного виклику з очікуванням результату.
В іншій частині даного розділу детально описується створення графічних інтерфейсів Swing і впровадження в них асинхронних клієнтів JAX-WS.
Створення форми Swing
У цьому розділі описується створення додатка Swing. Можна не виконувати розробку графічного інтерфейсу Swing самостійно, а просто завантажити попередньо розроблену форму JFrame і перейти до розділу Створення асинхронного клієнта .
У клієнт Swing передається набирається на клавіатурі текст, який потім відправляється в службу, яка в свою чергу повертає кількість помилок і список всіх слів з помилками. Крім того, цей клієнт також виводить кожне неправильно написане слово і пропонує варіанти його заміни (слова з помилками обробляються по одному).
Створення клієнта Swing:
- Створіть новий проект програми Java. Назвіть його AsynchSpellCheckClient НЕ створюйте клас Main для проекту.
- У поданні 'Проекти' клацніть правою кнопкою миші вузол проекту AsynchSpellCheckClient і виберіть 'Створити'> 'Форма JFrame ...'
- Дайте формі ім'я MainForm і розмістіть її в пакеті org.me.forms.
- Після створення форми JFrame відкрийте властивості проекту. У категорії "Виконати" вкажіть MainForm в якості головного класу.
- Відкрийте режим проектування для MainForm.java в редакторі. Перетягніть з палітри три елементи "панель прокрутки" на MainForm. Задайте положення і розмір панелей прокрутки. У них будуть розміщені поля з набирається текстом, який потрібно перевірити, слова з помилками і пропозиції по заміні чергового неправильно написаного слова.
- Перетягніть п'ять текстових полів на форму MainForm. Три з них розмістіть на панелях прокрутки. Змініть їх наступним чином: tfYourText Так Так tfNumberMistakes Ні Ні tfWrongWords Так Ні tfWrongWord1 Ні Ні tfSuggestions1 Так Ні
- Перетягніть індикатор виконання на MainForm. Назвіть змінну pbProgress.
- Перетягніть дві Кнопки на MainForm. Назвіть першу кнопку btCheck і замініть її текст на "Перевірити текст" або "Перевірити правопис". Назвіть другу кнопку btNextWrongWord, змініть її текст на "Наступне слово з помилкою" і зробіть її неактивною.
- Перетягніть кілька Ярликів на MainForm, щоб озаглавити ваше додаток і описати текстові поля.
Налаштуйте зовнішній вигляд JFrame відповідно до вподобань і збережіть його. Потім додайте функціональні можливості клієнта веб-служби.
Включення асинхронних клієнтів
Додайте посилання на веб-службу, як описано в розділі створення клієнта . Потім змініть атрибути веб-служб для включення асинхронних клієнтів.
- У вікні 'Проекти', клацніть правою кнопкою миші вузол проекту AsynchSpellCheckClient і виберіть 'Створити'> 'Інші'. У майстра створення файлу виберіть "Веб-служби"> "Клієнт веб-служби". У майстра "Клієнт веб-служби" вкажіть URL-адресу веб-служби:
asmx?wsdl> http://wsf.cdyne.com/SpellChecker/check.asmx?wsdl . Прийміть параметри за замовчуванням і натисніть кнопку "Готово". Зробіть все те саме, що і в розділі створення клієнта , Починаючи з пункту 2.
- Розгорніть 'посилання на агентство веб-служби' і клацніть правою кнопкою міші службу check. Відкріється контекстне меню.
- У контекстного меню віберіть "Правка атрібутів веб-служби". Відкріється діалогове вікно "Атрибути веб-служби".
- Перейдіть на вкладку "Налаштування WSDL".
- Розгорніть вузол "Операції типу порту". Розгорніть вузол first CheckTextBodyV2 и віберіть пункт "Включити асинхронний клієнт".
- Натісніть кнопку "ОК". Діалогове вікно закріється, и появится попередження про ті, что зміна атрібутів веб-служби прізведе до оновлення Вузли клієнта.
- Натисніть кнопку "ОК". Вікно попередження закриється, і вузол клієнта буде оновлено. Якщо розгорнути вузол check в вузлі "Посилання на веб-служби", з'являться два варіанти роботи CheckTextBody: "Опитування" і "Як передзвонити".
Тепер для додатка включені асинхронні клієнти веб-служби SpellCheck.
Додавання коду асинхронного клієнта
Тепер, коли є асинхронні операції веб-служб, додайте асинхронну операцію до MainForm.java.
Додавання коду асинхронного клієнта
- У MainForm перейдіть до подання вихідного коду і додайте наступний метод перед остаточною закриває дужкою.
public void callAsyncCallback (String text) {} - У вікні 'Проекти' розгорніть вузол 'Посилання на веб-служби' AsynchSpellCheckClient і знайдіть операцію checkSoap.CheckTextBodyV2 [Asynch Callback].
- Перетягніть операцію 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 перевіряє, чи був повернутий результат, і призупиняє роботу потоку до отримання результату.
- Перейдіть назад до подання проектування. Двічі натисніть кнопку "Перевірити правопис". При цьому до кнопки автоматично додається дію ActionListener, і виконується перехід до вистави "Вихідний код", причому курсор встановлюється в порожнє тіло методу btCheckActionPerformed.
- Додайте наступний код до тіла методу 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); }
- На початку класу MainForm використовуйте закрите поле ActionListener з ім'ям nextWord. Даний ActionListener призначене для кнопки "Наступне слово з помилкою", яка додає одне слово в список неправильно написаних слів і відображає можливі варіанти його виправлення. Створюється приватне поле, тому якщо дія ActionListener вже було визначено, можна скасувати його реєстрацію. В іншому випадку кожен раз при перевірці нового тексту потрібно додавати додатковий прослуховує процес, що в свою чергу призведе до багаторазового виклику actionPerformed (). Додаток буде працювати некоректно. public class MainForm extends javax.swing.JFrame {private ActionListener nextWord; ...
- Замініть весь метод 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); }}} - Натисніть 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 <?