Облако тегов
Последние записи
- Maven+Spring+Hibernate+dbunit
- Водяные знаки
- Ошибка при установке AIR - Error #2032
- Контекстное меню в AdvancedDataGrid
- Повышение производительности AS3 приложений
- AdvancedDataGrid cортировка
- Создание Flex-приложений c использованием Parsley. Часть 3, MVC
- Создание Flex-приложений c использованием Parsley. Часть 2, обмен данными
- Создание Flex-приложений c использованием Parsley. Часть 1, связывание
- Принципы организации выкладываемых примеров
Полезные ссылки
Большое спасибо
| Связываем Flex(Air) и Базу данных, используя RemoteObject, BlazeDS, Spring и Hibernate |
| 28.06.2009 22:57 | ||||||
|
В прошлой статье я описал настройку связи Java сервера и Flex (Air) келиента, используя BlazeDS под управлением Spring. В этой статье мы добавим связь с БД (Postgres 8.3) используя набор библиотек Hibernate3. В данной статье я не буду приводить все изменения в коде, но отмечу все основные моменты. В данном примере, мы на сервере добавим два метода:
- сохранить(добавить) объект.
- получить список объектов.
Шаг первый создадим доменный класс на стороне Java и на стороне Flex.
Java
package ru.gubber.elearning.domain;
import flex.messaging.annotations.IAnnotatedProxy; import flex.messaging.annotations.FlexClass; @FlexClass(classType = FlexClass.FlexClassType.RemoteObject) public class Student implements IAnnotatedProxy { private long id; private String login; private String firstName; private String lastName; private String patronomycName; private String password; public long getId() { return id; } public void setId(long id) { this.id = id; } .... } Flex package ru.gubber.domain {
//Указываем, что данный класс сереализуется и десериализуется из серверного класса ru.gubber.elearning.domain.Student.
[RemoteClass(alias="ru.gubber.elearning.domain.Student")] //Измененние любого свойства объектта этого класса ведёт к генерации события (CHANGE)
[] class Student { var id_:Number; var login_:String ; var firstName_:String ; var lastName_:String ; var patronomycName_:String ; var password_:String ; public function Student() { id_ = 0; } function id():Number { id_; } function id(val:Number):{ id_ = val; } ... } } В данном примере, я использую методы get и set как в серверной(Java) так и на клиентской(Flex) части. Во Flex части данного можно избежать, я просто так делаю в силу привычки (и идеалогических предпочтений).
Дальше нам надо связать наш teacherService через Spring и Hibernate с базой данных.
Изменения в файле applicationContext.xml
<!--Hibernate --> <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <bean name="studentDAO" class="ru.gubber.elearning.dao.StudentDAO"> <bean name="userProcessor" class="ru.gubber.elearning.business.UserProcessor"> <!-- FLEX --> <!-- Implementation of ProductDAO using low-level JDBC --> В данном случае я создал источник данных, связял с ним SessionFactory, на его основи созда hibernateTemplate, который уже использую в StudenDAO, для доступа к БД.
JAVA
package ru.gubber.elearning.dao;
import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.orm.hibernate3.HibernateCallback; import org.hibernate.Session; import org.hibernate.HibernateException; import ru.gubber.elearning.domain.Student; import java.sql.SQLException; import java.util.List; public class StudentDAO { private HibernateTemplate hibernateTemplate; public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } public void saveStudent(final Student student) { HibernateCallback callback = new HibernateCallback() { @Override public Object doInHibernate(Session session) throws HibernateException, SQLException { session.saveOrUpdate(student); return null; } }; hibernateTemplate.execute(callback); } public List HibernateCallback callback = new HibernateCallback() { @Override public Object doInHibernate(Session session) throws HibernateException, SQLException { List list = session.createCriteria(Student.class).list(); return list; } }; return (List) hibernateTemplate.execute(callback); } } Классы UserProcessor и UserListService, не делают ни каких действий, просто прокидывают вызовы в StudentDAO. Опять таки это сделано по идеалогическим причинам. Класс UserProcessor отвечает за обработку бизнес логики, когда она будет. Класс же UserListService получает запрос от клиентской части, передаёт запрос в уровень бизнес логики, преобразует результат к виду предназначенному для клиента и отдаёт преобразованный результат клиенту.
Flex
<?xml version="1.0" encoding="utf-8"?> ru.gubber.domain.Student; [] // вызов серверной функции function handleGetStudentListSuccess(event:ResultEvent):{ function handleSaveStudentError(event:FaultEvent):{ function handleSaveStudentSuccess(event:ResultEvent):{ ....... function saveUser(ev:Event):{ ]]> Результат, после запуска сервера и клиентского приложения должен выглядеть следующим образом
.Небольшие хотрости, которые были использованы при написании этой статьи. Что бы не писать два метода на сохранение и обновление информации о студенте, использовалось свойство Hibernate, когда указывается при каком значении id, счтитать, что запись новая. В нашем примере, значение id =0, говорит Hibernate, что надо сделать операцию Insert, а не Update. Именно по этому во Flex части приложения в конструкторе класса Student в поле id_, зписывается значение 0. В данном примере данные прочитанные из БД сериализуются для передачи на клиентскую часть, это не самая хорошая практика, лучше разделить доменные классы сервера и классы, которые передаются на клиента.
Обновление исходников можно сказать по ссылке (открывается в новом окне, весит 3,82 МБ):
Powered by !JoomlaComment 4.0alpha3
!joomlacomment 4.0 Copyright (C) 2009 Compojoom.com . All rights reserved." |
