Jboss Seam Remoting

Java dünyasında bir çok uygulama geliştirme çatısı mevcut. Bunların arasında en iyisi bana göre daha önce hakkında bir çok kez yazılar yazdığım Seam framework gelmekte. Daha önceki yazılarımda Seam kullanırken; Seam'i ortada bir anakart olarak düşünebilir, buna göre gösterim (view) katmanı, kalıcılık (persistance) katmanı vb. konularda istediğimiz farklı araçları kullanabiliriz demiştim.

Seam ile birlikte bir çok araç gelmekte. Bunlardan bir taneside Seam Remoting adı verdiğimiz api saysinde Seam Componentlerimizdeki (Managed Bean) istediğimiz fonksiyona client tarafında javascript yardımı ile erişebilmeği sağlayan yegane araçtır. Fonksiyonlara erişmekle kalmayıp, bu fonksiyonlardan dönen verileride rahatlıkla kullanabiliriz.

Bu işlemleri gerçekleştirmek için Seam Componentleri içerisinde Remote kullanımına açmak istediğimiz fonksiyonun başına @WebRemote annotation'ını yerleştirmemiz yeterli olacaktır. Seam bizim için gerekli olan tüm herşeyi bu annotation sayesinde oluşturacak ve client tarafına bu fonsiyonun prototipinde bir javascript fonsiyonu oluşturarak kullanımımıza sunacaktır.

Remote kullanmadan önce yapmamız gereken basit bir işlem var. İlk etapta web.xml dosyamızın içine aşağıdaki satırları eklememiz gerekiyor.

  <servlet>
    <servlet-name>Seam Remoting</servlet-name>
    <servlet-class>org.jboss.seam.remoting.SeamRemotingServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>Seam Remoting</servlet-name>
    <url-pattern>/seam/remoting/*</url-pattern>
  </servlet-mapping>

Yapmamız gereken konfigürasyon bu kadar. Artık özgürce remote apisini kullanabiliriz. Şimdi örnek bir Seam Componenti oluşturalım ve bu componente bir adet Merhaba Dünya fonksiyonu ekleyelim.

@Name("maqas")
@Scope(ScopeType.CONVERSATION)
public class Maqas {
   
	@WebRemote
	public String helloWorld() {
		return "Merhaba Dünya";
	}

}

Burada dikkat ettiğiniz gibi remote olarak erişmek istediğimiz fonksiyonun üzerine @WebRemote annotationını ekliyoruz. Artık bu fonksiyona client tarafından javascript yardımı ile ulaşabiliriz. Bunun için yapmamız gereken javascript fonksiyonunu kullanacağımız xhtml dosyamıza aşağıdaki tagı ekliyoruz.

<s:remote include="maqas"/>

Include ozelliğinin değeri olarak Seam componentimizin ismini veriyoruz. Bunu ekledikten sonra artık aşağıdaki örnekte olduğu şekilde helloword fonksiyonumuzu javascript yordamı ile kullanabiliriz.

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:s="http://jboss.com/products/seam/taglib"
	xmlns:a="http://richfaces.org/a4j"
	xmlns:rich="http://richfaces.org/rich">
	
	<head>
		<title>Seam Remoting</title>
		<s:remote include="maqas"/>
		
		<script type="text/javascript">
			jQuery(function() {
				Seam.Component.getInstance("maqas").helloWorld(function(result) {
					alert(result);
				});
			});
		</script>
	</head>
	<body>
	
	</body>
</html>

Burada fonsiyonumun sayfa yüklendikten hemen sonra çalışmasını sağlamak için sevgili dostum jQueryden ufak bir yardım aldım. Bu sayfayı tarayıcımızdan çağırdığımız taktirde, Tarayıcımız bize Merhaba Dünya yazılı bir uyarı mesajı gösterecektir.  Seam.Component.getInstance() fonksiyonu sayesinde Conversation scopunda duran maqas nesnemize ulaşıyoruz. Daha sonra WebRemote annotationı sayesinde remote kullanıma açtığımız helloword fonksiyonunu çağırıyoruz. Bu fonksiyon sonrasında geriye dönen değerleri almak içinde içerisinde ayrı bir fonksiyon tanımlayarak yaptığı geri bildirimleri result referansına parametre olarak göndermesini sağlıyoruz.  Başka bir örnek ile devam edelim. Bu sefer fonksiyona gönderdiğimiz parametreye göre bize liste döndüren bir webremote fonksiyonu yazalım.

@Name("maqas")
@Scope(ScopeType.CONVERSATION)
public class Maqas {
   
    List<String> yaz = new ArrayList();
	List<String> kis = new ArrayList();
	
	public Maqas() {
		yaz.add("Kiraz");
		yaz.add("Karpuz");
		kis.add("Portakal");
		kis.add("Mandalina");
	}
   
	@WebRemote
	public List<String> meyveler(String mevsim) {
		if(mevsim =="yaz") {
			return yaz;
		}
		
		return kis;
	}

}

Yaz ve Kış olmak üzere iki tane meyve listem var. Meyveler ismindede bir adet geriye Liste döndüren fonksiyonum var. Ayrıca bu fonksiyon String türünde hangi listeyi döndürmek istediğimizi belirmek amacı ile mevsim isminde bir parametre almakta.


<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:s="http://jboss.com/products/seam/taglib"
	xmlns:a="http://richfaces.org/a4j"
	xmlns:rich="http://richfaces.org/rich">
	
	<head>
		<title>Seam Remoting</title>
		<s:remote include="maqas"/>
		
		<script type="text/javascript">
			jQuery(function() {
				Seam.Component.getInstance("maqas").meyveler("yaz",function(result) {
					jQuery.each(result, function(key, value) {
						alert("Meyve Adi:" + value);
					});
				});
			});
		</script>
	</head>
	<body>
	
	</body>
</html>

Bu sefer meyveler javascript fonksiyonuna ekstra olarak string tipinde "yaz" parametresini gönderiyoruz. Result'ta ise bize bir array değişkeni dönüyor. Bu değişkeni jquery yardımı ile döngüye sokarak yaz meyvelerini uyarı mesajı şeklinde vermesini sağlıyoruz.

Seam remote ile ilgili şimdilik bu kadar. İleri zamanlarda daha detaya inebilriz.

Kamil Örs
Software Developer







0.000169992446899 | 3.5