JavaScript EE Частина 2

частина

Серія контенту:

Слідкуйте за виходом нових статей цієї серії.

Розробка програми моніторингу JVM

Приклад програми цієї статті використовує API Java Management для моніторингу JVM, що виконує сервер Java ЇЇ, на якому працює програма. Інтерфейс користувача складається з однієї Web-сторінки, на якій відображаються різні індикатори, такі як кількість класів Java, споживання ресурсів пам'яті, активність збирача сміття та кількість потоків.

Ця інформація отримується за допомогою Ajax і заноситься в таблицю HTML. Щоб було цікавіше, Web-сторінка містить форму, яка дозволяє виділити певний обсяг пам'яті на задану кількість секунд. Крім того, можна активізувати збирач сміття (garbage collector – GC) JVM.

Рисунок 1. Приклад програми

запит

запит

Створення Web-сторінки

Лістинг 1. HTML-код MonitorPage.jsp

Функція allocMem() використовує атрибут validator, щоб перевірити введення користувача. Якщо для будь-якого з двох параметрів функція valid() повертає значення false , віддалений виклик скасовується та з'являється попереджувальне повідомлення. Функція gc() чекає відповіді, перш ніж повернути керування, тому що async в даному випадку дорівнює false . Функція init() викликає getInfo() , щоб ініціалізувати інтерфейс користувача, і передає ту ж функцію setInterval() , так що та викликається кожну секунду для оновлення інформації Web-сторінки.

У лістингу 3 міститься код, отриманий за допомогою спеціального тега, який реалізований як тег-файл з ім'ям rpc.tag. Кожна функція, що згенерована, використовує об'єкт XHR , прототип якого можна знайти у файлі xhr.js, який MonitorPage.jsp імпортує в свій заголовок. Вихідний код обох файлів rpc.tag та xhr.js будепредставлений нижче у цій статті.

Складання сценарію для сервера

Лістинг 4. Функція getInfo()MonitorScript.jss
Лістинг 5. Функція allocMem() MonitorScript.jss

У лістингу 6 показано функцію gc() , яка активізує збирач сміття JVM.

Лістинг 6. Функція gc() із MonitorScript.jss

Побудова пакувальника XMLHttpRequest

Ініціалізація запитів

Конструктор XHR() (див. листинг 7) бере три параметри ( method , url і async ) і зберігає їх як властивості. Метод newRequest() перериває попередній запит, якщо він все ще активний, звільняє пам'ять за допомогою оператора delete та створює новий екземпляр XMLHttpRequest . Така поведінка підходить для програм, що використовують Ajax для зв'язку з каналом передачі даних або для збереження введення користувача. У типовому випадку інтерес представляє завантаження або збереження лише останніх даних.

Лістинг 7. Функції XHR() та newRequest()конструктора xhr.js

У лістингу 8 показані методи addParam() і addHeader() , які дозволяють додати параметри запиту та заголовки, включені до запиту HTTP під час його надсилання. Ці методи можна використовувати одразу, як тільки створено новий запит. Функція checkRequest() видасть попередження, якщо об'єкт XMLHttpRequest не був створений або якщо запит уже було надіслано.

Лістинг 8. Функції xhr.js checkRequest(), addParam() та addHeader()

Надсилання запитів

Функція sendRequest() (див. список 9) кодує параметри, відкриває запит, додає заголовки, встановлює зворотний виклик Ajax, якщо async дорівнює true , а потім надсилає запит HTTP. Якщо async дорівнює false, зворотній виклик активізується після send().

Лістинг 9. Функція xhr.js sendRequest()

У зворотному дзвінку Ajax можна використовуватиisCompleted() (див. листинг 10) для перевірки статусу запиту.

Лістинг 10. Функція xhr.js isCompleted()

Повідомлення про помилки

У разі помилки на стороні сервера isCompleted() викликає функцію showRequestInfo() (див. листинг 11). Ця функція відкриває вікно та друкує інформацію запиту: метод HTTP, URL, параметри, заголовки та відповідь.

Лістинг 11. Функція xhr.js showRequestInfo()
Дозвіл window.focus() у Firefox

Щоб вирішити ці проблеми, функція showRequestInfo() додає кнопку, яка встановлює змінну під назвою _freeze . Якщо значення _freeze дорівнює true, інформація про запити не оновлюється. Крім того, вікно помилок більше не відкривається, якщо користувач закрив. Після внесення змін до коду можна просто оновити сторінку програми, щоб перевірити, чи залишилася помилка чи виправилася.

Функція htmlEncode() (див. листинг 12) бере параметр рядка та замінює символи & , та > відповідно символами & , < та > .

Лістинг 12. Функція xhr.js htmlEncode()

Авторизація виклику функцій

Сценарії на сервері можна розглядати як звичайні ресурси, і доступ до них можна обмежити із застосуванням стандартних процедур безпеки Java ЇЇ. Зазвичай визначають одну або кілька ролей, які мають права доступу до сценаріїв залежно від обмежень безпеки, прописаних у файлі web.xml.

Лістинг 13. Клас AuthorizedCalls
Лістинг 14. Файл authorize.tag
Лістинг 15. Використання в MonitorPage.jsp

Інша змінна JSP з ім'ям paramList зберігає список параметрів, які передаються через атрибут функції між ( і ) . Наприклад, якщо function - це allocMem(size, seconds) , то змінна paramList зберігатиме список size, seconds .

Лістинг 16. Файл rpc.tag
Лістинг 17. Згенерована функція allocMem()

Після ініціалізації об'єкта XHR файл rpc.tag генерує зворотний виклик Ajax з ім'ям processResponse(). Ця функція перевіряє, чи скомпільовано запит Ajax, і аналізує відповідь, якщо є атрибут jsonVar .

Те, що розташоване на сторінці JSP між і , включається в зворотний виклик Ajax за допомогою . Наприклад, елемент MonitorPage .jsp містить showInfo(json, "info"); для обробки відповіді JSON. У лістингу 18 показано, де код розміщується всередині функції getInfo() , генерованої за допомогою rpc.tag.

Лістинг 18. Згенерована функція getInfo()

Активізація функції сценарію

Щоразу, коли у Web-браузері викликається згенерована функція, через об'єкт XHR надсилається запит Ajax, URL якого закінчується .jss. На додаток до цього, як заголовок HTTP з ім'ям Ajax-Call передається сигнатура функції, яка повинна активізуватися. Запитами .jss керує сервлет з ім'ям JSServlet, який описаний у першій частині цієї серії.

Лістинг 19. Файл init.jss
Лістинг 20. Файл finalize.jss

Використовувати eval() для виконання функції безпечно, оскільки заголовок Ajax-Call перевірено за допомогою authorizedCalls.contains() .

Висновок

Ресурси для скачування

  • цей контент у PDF
  • Приклад програми цієї статті (jsee_part2_src.zip 23 КБ)

Схожі теми

Коментарі