JavaScript EE Част 2

като

Серия съдържание:

Очаквайте нови статии от тази серия.

Разработване на JVM приложение за наблюдение

Примерното приложение за тази статия използва API за управление на Java, за да наблюдава JVM, изпълняващ Java EE сървъра, който изпълнява приложението. Потребителският интерфейс се състои от една уеб страница, която показва различни индикатори, като например броя на класовете на Java, потреблението на ресурси от паметта, дейността на събирача на отпадъци и броя на нишките.

Тази информация се извлича чрез Ajax и се въвежда в HTML таблица. За да стане по-интересно, уеб страницата съдържа формуляр, който ви позволява да разпределите известно количество памет за определен брой секунди. Можете също така да активирате колектора за боклук (GC) на JVM.

Фигура 1. Пример за приложение

списък

списък

Създаване на уеб страница

Списък 1. MonitorPage.jsp HTML

Функцията allocMem() използва атрибута валидатор за валидиране на въведеното от потребителя. Ако някой от двата параметъра valid() върне false, дистанционното повикване се отменя и се появява предупредително съобщение. Функцията gc() чака отговор, преди да се върне, тъй като async е false в този случай. Функцията init() извиква getInfo(), за да инициализира потребителския интерфейс, и предава същата функция setInterval(), така че да се извиква всяка секунда, за да актуализира информацията на уеб страницата.

Списък 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 Wrapper

Заявка за инициализация

Конструкторът XHR() (виж листинг 7) приема три параметъра (метод, url и async) и ги съхранява като свойства. Методът newRequest() прекъсва предишната заявка, ако все още е активна, освобождава паметта с оператора за изтриване и създава нов екземпляр на 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 EE. Обикновено се дефинират една или повече скриптови роли в зависимост от ограниченията за сигурност, посочени във файла web.xml.

Листинг 13. Клас AuthorizedCalls
Листинг 14. Authorize.tag файл
Списък 15. Използване в MonitorPage.jsp

Друга JSP променлива с име paramList съдържа списък с параметри, които се предават през атрибута на функцията между ( и ). Например, ако функцията е allocMem(размер, секунди), тогава променливата paramList ще съдържа списък с размер, секунди.

Списък 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().

Активиране на функцията скрипт

Всеки път, когато генерираната функция се извика в уеб браузъра, се изпраща Ajax заявка през XHR обекта, като URL адресът завършва на .jss. В допълнение, подписът на функцията, която трябва да бъде извикана, се предава като HTTP заглавка, наречена Ajax-Call. .jss заявките се обработват от сървлет с име JSServlet, който е описан в първата част на тази серия.

Листинг 19. Файлът init.jss
Списък 20. finalize.jss файл

Безопасно е да използвате eval() за изпълнение на функция, тъй като заглавката на Ajax-Call се проверява с authorizedCalls.contains().

Заключение

Изтегляне на ресурси

  • това съдържание в PDF
  • Примерно приложение за тази статия (jsee_part2_src.zip 23 KB)

Свързани теми

Коментари