Знакомство с Seam Remoting

11 Май
2012

Seam Framework — это RoR* подобный фреймворк для Java, позволяет быстро разрабатывать web приложения с поддержкой Ajax,JSF,Hibernate, Maven, Ant и.т.д. и.т.п. На Seam-е есть альтернатива Ajax-а называемая — Seam Remoting. Так как это мой первый пост на Блоге, далее попытаюсь объяснить на примере:

Пример:

	@Entity
	@Name("bloguser")
	public class BlogUser() implements Serializable{
	
	@Id @GeneratedValue
	private Long id;
	private String userName;
	private Date registerDate;
	private Boolean active;
	
		public Long getId() {
			return id;
		}
		public void setId(Long id) {
			this.id = id;
		}
		public Date getRegisterDate() {
			return registerDate;
		}
		public void setRegisterDate(Date registerDate) {
			this.registerDate = registerDate;
		}
		public String getUserName() {
			return userName;
		}
		public void setUserName(String userName) {
			this.userName = userName;
		}
		public Boolean getActive() {
			return active;
		}
		public void setActive(Boolean active) {
			this.active = active;
		}
	}

@ — Java 5 annotation;
@Entity — ассоциирует таблицу в базе данных с таким же названием;
@Name — Seam аннотация регистрирует данный класс как Seam component;
@Id — Приватный ключ в базе данных
@GeneratedValue — автоматический генерирует surrogate key в базе данных;
@In — биекция;
@WebRemote — делает компоненту доступный к JavaScript-у;

	@Name("management")
	public class UserManager{
		@In("entityManager")
		EntityManager em;
		
		public String addUser(BlogUser user){
			BlogUser exists = em.find(BlogUser.class, user.getId());
			if(exists != null){
				em.merge(user);
			}else if(exists == null){
				user.setActive(false);
				em.persist(user);
			}
			return "Bloguser was saved in DB"; 
		}
		
		@WebRemote
		public String activateUser(String name){
                        String result = " ";
			BlogUser tempUser = (BlogUser) em.createQuery("select u from BlogUser u where u.userName = :name")
               .setParameter("name", name)
               .getSingleResult();
                       if(tempUser != null){
				tempUser.setActive(true);
				em.merge(tempUser);
	                        result = "Bloguser was successfully activated!";
                       } else if (tempUser == null){
                 result = "user with userName: " + name + " not found in DB! ";
		}
                return result;
	}


Клиентская часть:

<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:s="http://jboss.com/products/seam/taglib"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:rich="http://richfaces.org/rich"
	xmlns:a="http://richfaces.org/a4j"
	xmlns:c="http://java.sun.com/jstl/core"
	template="/layout/template.xhtml">

	<ui:define name="body">
		<script src="./jquery-1.7.1.min.js"></script>
		<script src="./jquery-ui-1.8.18.custom.min.js"></script>
		<script type="text/javascript" src="../seam/resource/remoting/resource/remote.js"></script>
		<script type="text/javascript" src="../seam/resource/remoting/interface.js?bloguser"></script>
		<scipt type="text/javascript" language="JavaScript">
		
			function activateUserOnBrowser(){
				var id = jQuery("#userId").val();
				Seam.Components.getInstance("bloguser").activateUser(id, activateUserCallback);
			}
			
			function activateUserCallback(result1){
				alert(result1);
			}
			
		</scipt>
		<h:form>
			<rich:panel>
				<ui:define name="label">Имя пользователя:</ui:define>
				<h:inputText id="userId" value="#{bloguser.userName}" />
				<ui:define name="label">Дата регистрации:</ui:define>
				<rich:calendar datePattern="dd.MM.yyyy" value="#{bloguser.registerDate}" />
				<h:commandButton action="#{bloguser.addUser()}" >Добавить пользователя</h:commandButton>		
			</rich:panel>
			<rich:panel>
				<h:commandButton onclick="javascript:activateUserOnBrowser()" >Активировать пользователя</h:commandButton>
			</rich:panel>
		</h:form>
	</ui:define>
</ui:composition>

Можем создать юзера на браузере заполнив все поля и нажав на кнопку «Добавить пользователя». Id для данного пользователя в базе сгенерит Seam за нас. Дальше можем ввести в поле «имя пользователя» юзернэйм существующего пользователя и активировать нажатием кнопки «Активировать пользователя». Но что происходит когда нажимаем на эту кнопку.
1) вызывается javascript — activateUserOnBrowser().
2) эта функция создает переменную id и присваивает значение с помощью jquery данные из поля «имя пользователя».
3) Seam достает из сервера компоненту «bloguser» и вызывает метод activateUser(String name) с параметром, присвоив id как параметр.
4) После завершения метода activateUser() на клиентской части вызывается activateUserCallback(result1). result1 — это тот самый String result который возвратил метод — activateUser(). Вуаля, и вы теперь знакомы с Seam Remoting.

Хороший туториал можете наити здесь
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх