<
  • Главная
Статьи

Створення Web-додатків на базі Flex 4 і Java

  1. Часто використовувані скорочення
  2. приклад програми
  3. Малюнок 1. Додаток Contacts
  4. Серверна частина програми
  5. Анотації бізнес-об'єкта
  6. Лістинг 1. Java-клас Contact
  7. Бізнес-сервіс: зв'язок з базою даних
  8. Лістинг 2. Клас ContactsService
  9. Випробуйте безкоштовну версію сервера баз даних DB2 Express 9
  10. Клієнтська частина програми
  11. MXML
  12. Лістинг 3. Клас ContactsApp
  13. ActionScript
  14. Лістинг 4. ActionScript-клас Contact
  15. налаштування програми
  16. Налаштування Hibernate
  17. Лістинг 5. Конфігураційний файл persistence.xml
  18. Налаштування BlazeDS
  19. Лістинг 6. Конфігураційний файл services-config.xml
  20. Лістинг 7. Конфігураційний файл remoting-config.xml
  21. Ресурси для скачування
  22. Схожі тими

Вчимося застосовувати віддалене взаємодія об'єктів

До сучасних Web-додатків пред'являються все більш високі вимоги. Вони повинні вміти працювати з обліковими даними користувачів, забезпечувати завантаження контенту і потокового відео. Ці завдання вимагають використання технологій, що прискорюють процес розробки і в той же час забезпечують підтримку всіх найбільш затребуваних функцій. Розробники додатків RIA повинні вміти правильно вибирати комплекси технологій, що дозволяють найкращим чином вирішувати поставлені завдання.

Часто використовувані скорочення
  • AMF: Action Message Format - формат повідомлень про дії
  • API: Application programming interface - інтерфейс програмування додатка
  • CSS: Cascading stylesheet - каскадний таблиця стилів
  • GUI: Graphical user interface - графічний інтерфейс користувача
  • HTTP: Hypertext Transfer Protocol - протокол передачі гіпертексту
  • JAR: Java archive - архів Java
  • POJO: Plain old Java object - простий Java-об'єкт в старому стилі
  • RIA: Rich Internet Application - насичене Інтернет-додаток
  • RPC: Remote procedure call - віддалений виклик процедури
  • SDK: Software development kit - набір інструментальних засобів розробки програмного забезпечення
  • SQL: Structured Query Language - мова структурованих запитів
  • UI: User interface - призначений для користувача інтерфейс
  • WAR: Web archive - Web-архів
  • XML: Extensible Markup Language - розширювана мова розмітки

Adobe Flex - це технологія, яка працює на стороні клієнта і дозволяє розробникам використовувати багатий набір API-викликів для створення графічних користувацьких інтерфейсів, виведення графіки, відтворення мультимедіа-вмісту та підключення до Web-сервісів. Технологія Java, що застосовується на стороні сервера, забезпечує такі можливості, як підключення до реляційних СУБД, багатопотокова обробка запитів на обслуговування і оптимальне масштабування у випадках збільшення навантаження. Спільне використання цих двох технологій дає потужну технічну основу для створення RIA-додатків.

У цій статті буде показано, як написати просте, але потужне RIA-додаток, що використовує технологію Flex на стороні клієнта, технологію Java на стороні сервера і СУБД MySQL в якості системи зберігання даних.

приклад програми

У нашому прикладі програми (див. Розділ Завантаження ) Є функціонально насичений користувальницький інтерфейс, що підтримує створення, читання, оновлення та видалення (функції CRUD - Create, Read, Update, Delete) інформації про контакт через додаток Adobe Flash® (SWF). на малюнку 1 зображена трирівнева Web-архітектура, в якій клієнтська частина представлена ​​SWF-файлом, вбудованим в Web-сторінку, серверна частина виконується всередині контейнера Java-сервлета (в нашому випадку це Apache Tomcat), а в якості бази даних використовується MySQL. Спільне використання цих трьох технологій дозволяє створити потужне розподілене додаток.

Малюнок 1. Додаток Contacts

Для забезпечення взаємодії між Flash-додатком і контейнером Java-сервлета інфраструктура BlazeDS надає в ваше розпорядження функцію віддаленого взаємодії з об'єктами - особливу форму віддаленого виклику процедур, що дозволяє об'єктам Adobe ActionScript ™ звертатися до об'єктів Java і навпаки. Взаємодією між додатком Java-сервера і реляційної базою даних управляє ORM-інфраструктура Hibernate, яка дозволяє перетворювати об'єкти Java в код SQL і навпаки.

Серверна частина програми

Спочатку ми створимо Java-клас, який містить всю інформацію, необхідну для зберігання даних про контакти. У нашому тестовому додатку реалізована проста модель, яка містить базову інформацію. В об'єктах Contact використовуються наступні атрибути і типи даних.

- String emailAddress
- String firstName
- long id
- String lastName
- String phoneNumber
- long serialVersionUID
+ Contact ()
+ Contact (String first, String last, String email, String number)
+ String getEmailAddress ()
+ String getFirstName ()
+ Long getId ()
+ String getLastName ()
+ String getPhoneNumber ()
+ Void setEmailAddress (String address)
+ Void setFirstName (String first)
+ Void setId (long newId)
+ Void setLastName (String last)
+ Void setPhoneNumber (String number)
+ StringtoString ()

Анотації бізнес-об'єкта

Java-клас Contact вважається класом POJO, виступаючим в ролі бізнес-об'єкта; це означає, що в ньому повинні бути реалізовані функції і методи конкретної бізнес-області. Дані всередині об'єктів класу Contact необхідно зберігати в базі даних. Рішенням цього завдання є використання інфраструктури об'єктно-реляційного відображення (ORM), такий як Hibernate, яка виконує всю основну роботу по перетворенню об'єктів в запису таблиць БД і назад. Якщо ви використовуєте анотації Java Persistence API (JPA), для реалізації ORM потрібно написати лише незначна кількість коду. В лістингу 1 представлена ​​анотація Java-класу Contact.

Лістинг 1. Java-клас Contact
package bcit.contacts; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.Table; @Entity @Table (name = "contact") @NamedQueries ({@NamedQuery (name = "contact.findAll", query = "from Contact"), @NamedQuery (name = "contact.getById", query = "select c from Contact c where c.id =: id ")}) public class Contact {private static final long serialVersionUID = 123456789L; public Contact () {firstName = "N / A"; lastName = "N / A"; emailAddress = "N / A"; phoneNumber = "N / A"; } Public Contact (String first, String last, String email, String number) {firstName = first; lastName = last; emailAddress = email; phoneNumber = number; } @Id @GeneratedValue (strategy = GenerationType.AUTO) @Column (name = "id", nullable = false, updatable = false) private long id; @Column (name = "lastName", nullable = false, unique = false) private String lastName; @Column (name = "firstName", nullable = false, unique = false) private String firstName; @Column (name = "emailAddress", nullable = false, unique = false) private String emailAddress; @Column (name = "phoneNumber", nullable = false, unique = false) private String phoneNumber; public void setPhoneNumber (String number) {phoneNumber = number; } Public String getPhoneNumber () {return phoneNumber; } Public String getEmailAddress () {return emailAddress; } Public void setEmailAddress (String address) {emailAddress = address; } Public String getFirstName () {return firstName; } Public void setFirstName (String first) {firstName = first; } Public String getLastName () {return lastName; } Public void setLastName (String last) {lastName = last; } Public long getId () {return id; } Public void setId (long newId) {id = newId; } @Override public String toString () {return id + "" + firstName + "" + lastName + "" + emailAddress + "" + phoneNumber; }}

Почнемо розгляд цього простого класу з використовуваних в ньому анотацій.

  • @Column: маркує властивість як стовпці бази даних, дозволяючи задавати для нього ім'я, визначати унікальність і можливість зберігати null-значення.
  • @Entity: оголошує клас як об'єкт entity bean; це означає, що даний клас є класом POJO, призначеним для збереження.
  • @GeneratedValue: визначає метод генерації первинних ключів; доступні значення AUTO, IDENTITY, SEQUENCE і TABLE
  • @Id: визначає властивість як унікального ідентифікатора (тобто первинного ключа) для кожного Java-об'єкта.
  • @NamedQueries: зберігає список іменованих запитів.
  • @NamedQuery: оголошує зумовлений запит в якості строкової константи; звернувшись до неї згодом, можна викликати запит на виконання.
  • @Table: оголошує Java-клас як таблиці бази даних.

Кожен раз, коли необхідно зберегти знаходиться в пам'яті Java-об'єкт, Hibernate перетворює інформацію про його стан в SQL-оператор UPDATE. Аналогічним чином SQL-оператори з їх повертаються наборами даних використовуються для формування Java-об'єктів. В результаті цих операцій всі об'єкти можуть зберігатися в базі даних у вигляді записів, а всі записи можуть бути вилучені з бази даних і перетворені назад в Java-об'єкти.

Анотації вказують Hibernate, які компоненти класу повинні вважатися зберігаються. Але це тільки частина картини.

Бізнес-сервіс: зв'язок з базою даних

Для звернень до бібліотеки Hibernate з метою виконання ORM-перетворень нам буде потрібно службовий клас. В лістингу 2 представлений код класу ContactsService, що виступає в ролі сервісу додатків.

Лістинг 2. Клас ContactsService
public class ContactsService {private static Logger logger = Logger.getLogger (ContactsService.class); private static final String PERSISTENCE_UNIT = "contacts"; private static EntityManagerFactory emf = null; static {logger.info ( "LOADING CONTACTSSERVICE CLASS."); emf = Persistence.createEntityManagerFactory (PERSISTENCE_UNIT); } Public ContactsService () {super (); } Public void addContact (Contact c) {if (c == null) {return; } EntityManager em = emf.createEntityManager (); logger.info ( "PERSISTENCE ENTITYMANAGER ACQUIRED."); logger.info ( "ABOUT TO ADD CONTACT: fName:" + c.getFirstName () + ", lName:" + c.getLastName () + ", email:" + c.getEmailAddress () + ", phone:" + c.getPhoneNumber ()); EntityTransaction tx = em.getTransaction (); try {tx.begin (); em.merge (c); tx.commit (); } Catch (Exception e) {logger.error ( "CONTACT APP PERSISTING ERROR:" + e.getMessage ()); tx.rollback (); } Finally {logger.info ( "CONTACT APP CLOSING ENTITY MANAGER."); em.close (); }} Public void editContact (Contact c) {logger.info ( "CONTACT TO UPDATE:" + c); addContact (c); } Public void deleteContact (Long id) {logger.info ( "ABOUT TO DELETE CONTACT"); EntityManager em = emf.createEntityManager (); logger.info ( "PERSISTENCE ENTITYMANAGER ACQUIRED."); Query contactByIdQuery = em.createNamedQuery ( "contact.getById"); contactByIdQuery.setParameter ( "id", id); Contact c = (Contact) contactByIdQuery.getSingleResult (); EntityTransaction tx = em.getTransaction (); try {tx.begin (); em.remove (c); tx.commit (); } Catch (Exception e) {logger.error ( "CONTACT APP PERSISTING ERROR:" + e.getMessage ()); tx.rollback (); } Finally {logger.info ( "CONTACT APP CLOSING ENTITY MANAGER."); em.close (); }} Public List <Contact> getContacts () {logger.info ( "ABOUT TO RETRIEVE CONTACTS"); EntityManager em = emf.createEntityManager (); logger.info ( "PERSISTENCE ENTITYMANAGER ACQUIRED."); Query findAllContactsQuery = em.createNamedQuery ( "contact.findAll"); List <Contact> contacts = findAllContactsQuery.getResultList (); if (contacts! = null) {logger.debug ( "CONTACT APP RETRIEVED:" + contacts.size () + "CONTACT (S)"); } Return contacts; }}

Кожен метод отримує посилання на клас EntityManager, який представляє собою зберігається в пам'яті кеш. Кешування - потужна технологія, що забезпечує ефективність роботи, оскільки запис і отримання інформації з бази даних можуть забирати багато ресурсів. З вашого боку потрібно лише забезпечити фіксацію або відкат (в разі необхідності) кожної транзакції для кешованих даних.

У JPA кеш представлений класом EntityManager, і для його для позначення використовується термін контекст зберігання. Кожен контекст зберігання управляє набором сутностей, які є Java-об'єктами, оголошеними за допомогою анотацій @Entity. Клас EntityManagerFactory є модуль зберігання, що відповідає за настройку підключень до сховища даних (наприклад, до реляційної БД), управління типами сутностей (тобто всіма класами зазначеного контексту, які необхідно перетворювати для розміщення в сховищі даних) і, нарешті, за надання доступу до екземплярам контексту зберігання (тобто класу EntityManager).

Випробуйте безкоштовну версію сервера баз даних DB2 Express 9

Безкоштовний, простий у використанні і розгортанні сервер DB2 Express-C налаштовується за лічені хвилини, містить функції самоврядування та всю базову функціональність СУБД DB2 для платформ Linux®, UNIX® і Windows®, включаючи підтримку pureXML ™. DB2 Express-C надає ті ж основні можливості, що і інші редакції DB2 Express, і є відмінною основою для створення і розгортання додатків, написаних на C / C ++, Java, .NET®, PHP, Ruby on Rails, Python та іншими мовами програмування .

На відміну від створення контексту зберігання, створення модуля зберігання може зайняти багато часу. Налагодження підключення до сховища даних, знаходження всіх класів, оголошених як сутності, і настройка логіки для прив'язки цих класів до сутностей сховища даних вимагають великих витрат. Тому створювати екземпляр класу EntityManagerFactory слід під час запуску програми. Що стосується контексту зберігання - необхідно подбати про те, щоб перед створенням кожного примірника EntityManager завжди знищувався попередній екземпляр. Інша важлива правило полягає в необхідності слідувати моделі entitymanager-per-request, яка групує звернення до бази даних (наприклад, запити та операції оновлення) таким чином, щоб всі вони передавалися одночасно. Така модель дозволяє використовувати всі переваги механізму кешування JPA.

Тепер перейдемо до написання клієнтської частини програми.

Клієнтська частина програми

Інфраструктура Flex дозволяє створювати додатки, які користувачі можуть відтворювати за допомогою Adobe Flash Player. Flex складається з наступних компонентів.

  • Заснований на XML декларативний мову опису інтерфейсів, відомий як MXML
  • Мова програмування ActionScript.
  • Бібліотеки часу виконання для створення користувацьких інтерфейсів, Web-з'єднань, а також для реалізації багатьох інших можливостей.
  • Інструменти для компіляції програм в SWF-файли.

У клієнтському додатку, розглянутому в цій статті, використовується інфраструктура Flex версії 4. Перш ніж перейти до клієнтського додатку, важливо зрозуміти, як створюються додатки Flex і як вони існують у формі виконуваних файлів всередині Flash Player.

Спочатку ви можете створити додаток, використовуючи комбінацію розмітки MXML і коду ActionScript. Загальна послідовність дій полягає в написанні GUI-інтерфейсу (рівень представлення) з використанням формату MXML і подальшому написанні коду ActionScript (бізнес-логіка і обробка подій). Оскільки робота з MXML і ActionScript відбувається в текстовому режимі, для створення Flash може знадобитись тільки текстовий редактор і інструментарій Flex SDK.

Після написання програми Flex його код компілюється за допомогою компілятора MXML. Компілятор MXML створює SWF-файли, які можуть бути запущені в Web-браузері (за допомогою плагіна Flash Player).

Нарешті, Flash-додатки виконуються всередині віртуальної машини ActionScript Virtual Machine 2 (AVM2) за принципом "тимчасової лінійки" (timeline). Відповідно до цього принципу виконання програми розбивається на кадри, подібно кінофільму. На етапі компіляції Flash-додатки ви задаєте для нього необхідну кількість кадрів в секунду. Крім того, виконання додатків Flash Player розбивається на ряд наступних завдань.

  • Події Flash Player, такі як таймер і події миші.
  • Призначений для користувача код.
  • Логіка попереднього рендеринга, на етапі якого Flash Player намагається визначити необхідність оновлення графічного інтерфейсу користувача внаслідок зміни вихідних значень.
  • Призначений для користувача код, пов'язаний зі зміною вихідних значень.
  • Візуалізація Flash Player.

Щоб здійснити рендеринг лише кількох кадрів в секунду, можна виконувати більше призначеного для користувача коду. Однак якщо необхідна частота кадрів висока (наприклад, 60 кадрів в секунду), Flash Player може не впоратися з обробкою великого обсягу призначеного для користувача коду, оскільки для його виконання може не вистачити відведеного часу. Про це важливо пам'ятати при написанні додатків для Flash Player.

MXML

MXML - це потужний декларативний XML-формат, який реалізує наступні можливості.

  • Мінімізація обсягу коду (в силу декларативною суті формату XML), необхідного для написання графічного інтерфейсу.
  • Спрощення коду графічного інтерфейсу завдяки чіткому розподілу логіки уявлення і логіки взаємодії.
  • Підтримка підходу до розробки ПЗ з використанням шаблонів проекту.

В лістингу 3 представлений код MXML-класу Application.

Лістинг 3. Клас ContactsApp
<Mx: Application xmlns: mx = "http://www.adobe.com/2006/mxml" xmlns: contact = "bcit.contacts. *" CreationComplete = "initPage ();" layout = "vertical" frameRate = "30" pageTitle = "Contacts Example" horizontalAlign = "center" verticalAlign = "middle" backgroundColor = "# A9C0E7"> <mx: Style> .mainBoxStyle {borderStyle: solid; paddingTop: 5px; paddingBottom: 5px; paddingLeft: 5px; paddingRight: 5px; } .TextMessages {fontWeight: bold; } </ Mx: Style> <mx: RemoteObject id = "remotingService" showBusyCursor = "false" destination = "contacts" fault = "handleFault (event);" result = "handleResult (event);" /> <mx: Script> <! [CDATA [import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; import mx.collections.ArrayCollection; import bcit.contacts.dto.Contact; [Bindable] private var contacts: ArrayCollection = new ArrayCollection (); // For more on the Bindable metadata tag, see the devguide_flex3.pdf // document, page +1249 (1257 in PDF page numbering) [Bindable] private var message: String = "Status: Ready"; private var contact: Contact; public function setControlBarValid (valid: Boolean): void {if (valid) {// if the selected item is -1, then no item is selected but at // the same time the fields are valid which means the user chose // to add a contact, not update one if (contactsDataGrid.selectedIndex == -1) {createButton.enabled = valid; } Else {editButton.enabled = valid; }} Else {// else nothing is valid createButton.enabled = false; editButton.enabled = false; }} Private function initPage (): void {editContactForm.setApp (this); contact = new Contact (); getAllContacts (); resetPage (); } Private function createContact (): void {contact = editContactForm.getContact (); remotingService.addContact (contact); message = "Status: Contact Added"; getAllContacts (); } Private function editContact (): void {var id: Number = contact.id; contact = editContactForm.getContact (); contact.id = id; remotingService.editContact (contact); message = "Status: Contact Edited"; getAllContacts (); } Private function deleteContact (): void {if (contactsDataGrid.selectedItem! = Null) {var c: Contact = contactsDataGrid.selectedItem as Contact; // no sense in sending the whole contact - just send the id // to cut down on bandwidth remotingService.deleteContact (c.id); message = "Status: Contact Deleted"; } GetAllContacts (); } Private function getAllContacts (): void {loadButton.enabled = false; remotingService.getContacts (); loadButton.enabled = true; resetPage (); } Private function populateFormWithContact (): void {contact = contactsDataGrid.selectedItem as Contact; editContactForm.setContact (contact); editButton.enabled = true; deleteButton.enabled = true; } Private function resetPage (): void {editContactForm.clearForm (); contact = new Contact (); createButton.enabled = false; editButton.enabled = false; deleteButton.enabled = false; contactsDataGrid.selectedIndex = -1; } Private function handleFault (e: FaultEvent): void {message = "Status: Error" + "\ nFault code:" + e.fault.faultCode + "\ nFault detail:" + e.fault.faultDetail + "\ nFault string : "+ e.fault.faultString; } Private function handleResult (e: ResultEvent): void {// can get the results by accessing e.result property //mx.controls.Alert.show (e.toString ()); contacts = e.result as ArrayCollection; var number: int = contacts.length; // if (number == 1) {// message = "Status: Retrieved 1 contact"; //} else {// message = "Status: Retrieved" + contacts.length + "contacts"; //}}]]> </ mx: Script> <mx: VBox styleName = "mainBoxStyle"> <mx: Text id = "titleText" text = "Single click to select a contact" /> <contact: ContactsDataGrid id = "contactsDataGrid" dataProvider = "{contacts}" itemClick = "populateFormWithContact ();" doubleClick = "populateFormWithContact ();" /> <contact: EditContactForm id = "editContactForm" /> <mx: ControlBar horizontalAlign = "center"> <mx: Button label = "List" id = "loadButton" click = "getAllContacts ( ) "toolTip =" Retrieve contacts from the server "/> <mx: Button label =" Add "id =" createButton "click =" createContact () "toolTip =" Create a new contact "/> <mx: Button label = "Update" id = "editButton" click = "editContact ()" toolTip = "Edit a selected contact" /> <mx: Button label = "Delete" id = "deleteButton" click = "deleteContact ()" toolTip = "Delete a selected contact "/> <mx: Button label =" Clear Form "id =" clearButton "click =" resetPage () "toolTip =" Clear the form "/> </ mx: ControlBar> <mx: TextArea text =" {message} "styleName =" textMessages "wordWrap =" true "verticalScrollPolicy =" auto "horizontalScrollPolicy =" off "editable =" false "width =" 100% "/> </ mx: VBox> </ mx: Application>

Зупинимося на розгляді найбільш важливих моментів лістингу 3 .

  • Коренєва елементом MXML-документа є підклас класу Application.
  • Елемент mx: Style дозволяє Задати Властивості CSS для локального оформлення компонентів для користувача інтерфейсу. Оформлення можна Задати с помощью локальних визначення (як це зроблено в лістінгу 3 ), Посилання на агентство Зовнішні табліці стілів, вказівки стілів Всередині компонентів, а такоже с помощью методу setStyle мови ActionScript.
  • Клас RemoteObject є об'єктом HTTP-сервісу, что Виконує операции віддаленого роботи з комерційними сервером.
  • Елемент mx: Script містить блоки коду ActionScript, укладені в розділ CDATA.
  • У коді присутня тільки одна компоновка (тобто клас VBox).
  • Кожен раз, коли в додатку оголошується компонент для користувача інтерфейсу (наприклад, TextArea), генерується змінна екземпляра, на яку згодом можна посилатися за допомогою атрибута компонента id.
  • Прив'язка даних здійснюється за допомогою фігурних дужок (наприклад, атрибут text елемента TextArea прив'язаний до змінної примірника мови ActionScript message).

ActionScript

Інтерфейс визначається за допомогою MXML, а мова ActionScript використовується для обробки подій, прив'язки даних (через тег метаданих [Bindable]) і звернення до віддалених сервісів. Всі методи в лістінгу 3 - createContact, editContact, deleteContact і getAllContacts - звертаються до віддалених методам на стороні сервера. При виклику віддалених методів ActionScript можна використовувати для обробки результатів (як успішних, так і невдалих) шляхом оголошення функцій зворотного виклику. Функція handleResult в лістінгу 3 отримує результат як об'єкт Object і передає його об'єкту ArrayCollection. BlazeDS перетворює об'єкт List в об'єкт ArrayCollection на стороні сервера.

В лістингу 4 представлений ActionScript-код класу Contact, який створюється для представлення об'єктів контакту на стороні Flash.

Лістинг 4. ActionScript-клас Contact
package bcit.contacts.dto {[RemoteClass (alias = "bcit.contacts.Contact")] public class Contact {public function Contact () {id = -1; } Public var id: Number; public var lastName: String; public var firstName: String; public var emailAddress: String; public var phoneNumber: String; public function toString (): String {return id + "," + firstName + "" + lastName + "" + emailAddress + "" + phoneNumber; }}}

Ці об'єкти ActionScript передаються на сторону сервера, де BlazeDS перетворює об'єкти ActionScript в об'єкти Java. ActionScript-клас Contact розглядається як об'єкт передачі даних (Data Transfer Object, DTO).

налаштування програми

Додаток, що розглядається в цій статті, використовує конфігураційні файли, що містять параметри сервера. Дві найважливіші області конфігурації - це Hibernate і BlazeDS.

Налаштування Hibernate

Параметри інфраструктури Hibernate можна налаштувати за допомогою стандартного конфігураційного файлу JPA persistence.xml, представленого в лістингу 5 .

Лістинг 5. Конфігураційний файл persistence.xml
<Persistence version = "1.0" xmlns = "http://java.sun.com/xml/ns/persistence" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation = "http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name = "contacts" transaction-type = "RESOURCE_LOCAL"> <properties> <property name = "hibernate.dialect" value = "org.hibernate.dialect.MySQLDialect" /> <property name = "hibernate.default_schema" value = "contacts" /> <property name = "hibernate.connection.driver_class" value = "com.mysql.jdbc.Driver" /> <property name = "hibernate.connection.url" value = "jdbc: mysql: // localhost: 3306 / contacts" /> <property name = "hibernate.archive.autodetection" value = "class, hbm" /> <property name = "hibernate.connection.username" value = "root" /> <property name = "hibernate.connection.password" value = " root "/> </ properties> </ persistence-unit> </ persistence>

Щоб забезпечити доступ до даних файлу persistence.xml в середовищі Hibernate, його необхідно помістити в папку Web-додатки WEB-INF / classes / META-INF. Після того як файл буде поміщений в зазначену папку, він повинен містити наступну інформацію.

  • Діалект бази даних (до якої саме базі даних відбуваються звернення, оскільки різні бази даних можуть мати різні SQL-діалекти).
  • Табличний простір, певне за допомогою схеми за замовчуванням.
  • Драйвер, що використовується для підключення до бази даних
  • URL-адресу бази даних.
  • Об'єкти для автоматичного виявлення (наприклад, анотовані класи, XML-файли зіставлень Hibernate і так далі).
  • Ім'я та пароль користувача.

Інші параметри можуть впливати на роботу Hibernate, але не є обов'язковими.

Налаштування BlazeDS

Інфраструктура BlazeDS налаштовується за допомогою чотирьох конфігураційних файлів.

  • messaging-config.xml: файл настройки схеми обміну повідомленнями "видавець-передплатник".
  • proxy-config.xml: файл вказати параметри проксі для HTTP- і Web-сервісів.
  • remoting-config.xml: файл настройки параметрів сервісів віддаленого взаємодії, таких як додаток, що розглядається в цій статті.
  • services-config.xml: конфігураційний файл верхнього рівня, що містить посилання на всі інші файли, а також налаштування безпеки, параметри каналів і журналирования.

В лістингу 6 показано вміст файлу services-config.xml. Зверніть увагу на те, що в нашому додатку використовується тільки один файл - remoting-config.xml, оскільки ми працюємо тільки з сервісом віддаленого взаємодії BlazeDS.

Лістинг 6. Конфігураційний файл services-config.xml
<? Xml version = "1.0&quot; encoding = "UTF-8"?> <Services-config> <services> <service-include file-path = "remoting-config.xml" /> <service-include file-path = "messaging-config.xml" /> <service-include file-path = "proxy-config.xml" /> <default-channels> <channel ref = "contacts-amf" /> </ default-channels> </ services> <channels> <channel-definition id = "contacts-amf" class = "mx.messaging.channels.AMFChannel"> <endpoint url = "http: // localhost: 8080 / contacts / messagebroker / amf" class = " flex.messaging.endpoints.AMFEndpoint "/> <properties> <polling-enabled> false </ polling-enabled> </ properties> </ channel-definition> </ channels> <logging> <target class =" flex.messaging .log.ConsoleTarget "level =" Error "> <properties> <prefix> [BlazeDS] </ prefix> <includeDate> false </ includeDate> <includeTime> false </ includeTime> <includeLevel> false </ includeLevel> <includeCategory > false </ includeCategory> </ properties> <filters> <pattern> Endpoint. * </ pattern> <pattern> Service. * </ pattern> <pattern> Configuration </ pattern> </ filters> </ target > </ Logging> </ services-config>

Конфігураційний файл services-config.xml посилається на інші конфігураційні файли (які повинні існувати), а також налаштовує систему журналирования BlazeDS і кілька каналів. Канал - це абстракція протоколу, використовуваного для взаємодії клієнта з сервером. У додатку цієї статті використовується стандартний протокол AMF без опитування. Опитування означає, що клієнти постійно взаємодіють з сервером з метою переконатися, що з'єднання не розірвано. У нашому додатку цього не потрібно.

За допомогою кінцевої точки каналу задається URL-адресу сервера. Для успішної компіляції проекту завжди повинна бути вказана кінцева точка; клієнтське Flash-додаток використовує її в якості жорстко заданого значення, що визначає сервер, до якого необхідно підключатися. На практиці URL-адресу кінцевої точки можна задати безпосередньо в коді MXML або ActionScript.

Нарешті, в файлі конфігурації remoting-config.xml ( лістінг 7 ) Вказується клас адаптера, необхідного для обробки операцій віддаленого взаємодії, а також класи, які відповідають на віддалені виклики (в нашому випадку класом, який відповідає на віддалені запити, є клас bcit.contacts.ContactsService).

Лістинг 7. Конфігураційний файл remoting-config.xml
<? Xml version = "1.0&quot; encoding = "UTF-8"?> <Service id = "remoting-service" class = "flex.messaging.services.RemotingService"> <adapters> <adapter-definition id = "java- object "default =" true "class =" flex.messaging.services.remoting.adapters.JavaAdapter "/> </ adapters> <default-channels> <channel ref =" contacts-amf "/> </ default-channels> <destination id = "contacts"> <properties> <source> bcit.contacts.ContactsService </ source> <! - <scope> application </ scope> -> </ properties> </ destination> </ service>

Висновок

У цій статті було продемонстровано, як написати Web-додаток, що працює на стороні Java-сервера під керуванням Tomcat і відповідає на запити для отримання контактної інформації. Ви також дізналися, як за допомогою MXML і ActionScript написати Flex-додаток, що працює на стороні клієнта. Як сховище даних ми використовували MySQL, а перетворення Java-об'єктів в SQL-запити здійснювалося за допомогою ORM-інфраструктури Hibernate. Нарешті, інфраструктура BlazeDS дозволяє Flash-додатків здійснювати віддалені виклики процедур і отримувати віддалений доступ до Web-додатків, запущеним на стороні Java-сервера.

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

  • цей контент в PDF
  • зразок коду (JEE-BlazeDS-Flex-contacts.zip | 7 МБ): У zip-архіві міститься весь вихідний код (Java, ActionScript 3, MXML) розглянутого проекту, build-файл Ant для генерації WAR, конфігураційні файли, а також сторонні бібліотеки ( у вигляді JAR-файлів), які були використані в цій статті.

Схожі тими

  • Оригінал статті: Create Flex 4 and Java Web applications (EN).
  • Дізнайтеся более про принципах JPA (EN) на Web-сайті Apache Software Foundation.
  • Навчіться працювати з сутностями, прочитавши навчальне керівництво по Java EE управління сутностями (EN).
  • Керівництво користувача Hibernate EntityManager (EN) - отримаєте всю необхідну інформацію для роботи з об'єктом інфраструктури Hibernate EntityManager.
  • Розуміння компонентів і життєвого циклу інфраструктури Flex 3 (Джеймс Поланко і Аарон Педерсен, DevelopmentArc) (EN) - дізнайтеся, як підвищити ефективність роботи з Flex.
  • Оновлені правила "Elastic Racetrack" для Flash 9 і AVM2 (Шон Крістманн) (EN) - дізнайтеся більше про правила оптимізації фреймів всередині Flash Player.
  • Дізнайтеся более про явних перетвореннях об'єктів ActionScript і Java (EN) з керівництва Adobe LiveCycle® Data Services Developer's Guide.
  • Створення декларативного мови опису призначеного для користувача інтерфейсу на базі XML (Аррон Фергюсон, developerWorks, вересень 2009 року) (EN) - дізнайтеся більше про декларативний описі призначених для користувача інтерфейсів на XML.
  • Створення компонентів Flex (Сандип Малик, developerWorks, липень 2009 року) (EN) - дізнайтеся про створення нової функціональності Flex з чистого аркуша.
  • Можливості Flex 4 для створення програмного забезпечення як послуги (Ден Орландо, developerWorks, липень 2009 року) (EN) - дізнайтеся, як використовувати Flex 4, щоб поліпшити взаємодію користувачів з RIA-додатками.
  • MySQL : Для роботи розглянутого в цій статті програми потрібен СУБД з відкритим вихідним кодом.
  • Apache Ant : Java-інструментарій для компонування проекту.
  • JDK : Для компіляції вихідного Java-коду необхідно використовувати набір засобів розробки Java SDK (JDK) версії 6.
  • Adobe Flex SDK : Для компіляції вихідного коду MXML і ActionScript необхідно використовувати набір засобів розробки Flex 4 SDK.
  • Apache Tomcat : Контейнер сервлетов, розроблений компанією Apache Software Foundation і представляє собою серверне середовище для виконання Web-додатків Java.
  • Adobe BlazeDS : Інфраструктура Adobe для зв'язування технології Flex з платформою Java Platform, Enterprise Edition (Java EE). Це програмне забезпечення вже включено до складу завантажується zip-архіву проекту, і його не потрібно завантажувати окремо.
  • Red Hat Middleware Hibernate : Розроблена компанією Red Hat ORM-інфраструктура, призначена для підтримки контейнерів Java EE Middleware. Це програмне забезпечення вже включено до складу завантажується zip-архіву проекту, і його не потрібно завантажувати окремо.

Підпішіть мене на ПОВІДОМЛЕННЯ до коментарів

Quot; encoding = "UTF-8"?
Quot; encoding = "UTF-8"?


Новости
  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью