Using ZK JndiVariableResolver - Retrieve Session Beans and EntityManagerFactory

Jeff Liu, Engineer, Potix Corporation
November 29, 2007

Version

Applicable to ZK 3.0.1 Freshly (zk-3.0.1-FL-2007-12-07 and later)

Applicable to JBoss AS 4.0.5.GA

Introduction

Java Platform, Enterprise Edition (Java EE) is the industry standard for developing portable, robust, scalable and secure server-side Java applications. Enterprise JavaBeans (EJB) technology is the server-side component architecture for Java Platform, Enterprise Edition (Java EE). EJB technology enables rapid and simplified development of distributed, transactional, secure and portable applications based on Java technology.


By bundling ZK into a JavaEE application server (JBoss is used in this tutorial) and using ZK JndiVariableResolver, ZK developers are now able to combine EJB into ZK application easily.

If you are not familiar with EJB, here is a comprehensive EJB tutorial http://www.laliluna.de/ejb-3-tutorial-jboss.html

Retrieving Session Beans and EntityManagerFactory from ZK

Following I am going to present you an example on how to use ZK JndiVariableResolver to retrieve session beans and entityManagerFactory

Add JndiVariabelResolver to Page

Using ZK JndiVariableResolver, session beans and entityManagerFactory can be retrieved by JNDI binding. First, Declare the directive

Using Default Constructor

<?variable-resolver class="org.zkoss.zkplus.jndi.JndiVariableResolver" ?>
<window>
...
</window>

Also, JndiVariableResolver constructor can take two extra agruments for special JNDI patterns.

  1. prepend - The prepended part of JNDI name
    Ex: "prepend/ejbBean/local"
  2. mapping - The key-value pairs for JNDI name and its corresponding variable name
    Ex:"a=custom/MySession,b=custom/MySession2,emf=java:/EntityManagerFactory"
/*
	arg0 is first argument of variable-resolver constructor
	arg1 is second argument of variable-resolver constructor
*/
<?variable-resolver class="org.zkoss.zkplus.jndi.JndiVariableResolver" agr0="ZkEJB3Demo"
arg1="mail=java:comp/env/mailing,sec=java:comp/security/module" ?>
<window>
...
</window>

JndiVariableResolver will resolve variable in following order:

  1. java:comp/env
  2. java:comp
  3. java:
  4. The variable will be look up as a session beans with prepend.
  5. The key-value pairs which is defined by mapping

Retrieve session beans

Since the session bean is bound to the java:comp/env by the configuration in jboss-web.xml and web.xml, the session bean can be easily retrieved by using JndiVariableResolver.

Declaring an EJB reference in jboss-web.xml and web.xml

jboss-web.xml

<ejb-local-ref>
	<ejb-ref-name>personLocalBean</ejb-ref-name>
	<ejb-ref-type>Session</ejb-ref-type>
	<local>demo.PersonBeanLocal</local>
	<local-jndi-name>ZkEJB3Demo/PersonBean/local</local-jndi-name>
</ejb-local-ref>

web.xml

<ejb-local-ref>
	<ejb-ref-name>personLocalBean</ejb-ref-name>
	<ejb-ref-type>Session</ejb-ref-type>
	<local-home>demo.PersonBeanLocal</local-home>
	<local>demo.PersonBeanLocal</local>
</ejb-local-ref>

person.zul

<?variable-resolver class="org.zkoss.zkplus.jndi.JndiVariableResolver" ?>
<window>
	<zscript>
		//Use session bean simply by its name "personLocalBean"
		personLocalBean.createDemoData();
		List t = personLocalBean.getAllPersons();
	</zscript>
	<listbox width="600px">
	<listhead sizable="true">
		<listheader label="name" sort="auto"/>
		<listheader label="email" sort="auto"/>
	</listhead>
	<listitem forEach="${t}">
		<listcell label="${each.name}"/>
		<listcell label="${each.email}"/>
	</listitem>
	</listbox>
</window>

Snapshot:

Retrieve EntityManagerFactory

Persistence units are not bound into JNDI by default, we define JBoss specific properties in persistence.xml to bind them into JNDI. As a result, we are able to retrieve the entity manager factory by JndiVariableResolver

persistence.xml

...
  <properties>
     <property name="jboss.entity.manager.factory.jndi.name" value="java:comp/entityManagerFactory"/>
  </properties>
</persistence-unit>
...

person2.zul

<?variable-resolver class="org.zkoss.zkplus.jndi.JndiVariableResolver" ?>
<window>
	<zscript>
		import javax.persistence.EntityManager;
		//Use EntityManagerFactory simply by its name "entityManagerFactory"
		EntityManager em = entityManagerFactory.createEntityManager();
		List persons= em.createQuery("from Person").getResultList();
		em.close();
	</zscript>
	<listbox width="600px">
	<listhead sizable="true">
		<listheader label="name" sort="auto"/>
		<listheader label="email" sort="auto"/>
	</listhead>
	<listitem forEach="${persons}">
		<listcell label="${each.name}"/>
		<listcell label="${each.email}"/>
	</listitem>
	</listbox>
</window>

Bundle ZK into JBoss by Eclipse

Step by Step

  • Create a Dynamic Web Project and bundle ZK to it, refer to ZK Quick Start Guide
  • Create an EJB3 Project
  • Create a JavaEE- Enterprise Application Project and setup the module dependencies for the dynamic web project and EJB3 project in previous steps

After the steps above, the Deployment Descriptor(application.xml) should be look like this:

<?xml version="1.0" encoding="UTF-8"?>
<application id="Application_ID" version="1.4" ...>
	<display-name>
	ZkEJB3Demo</display-name>
	<module>
		<web>
			<web-uri>DemoWeb.war</web-uri>
			<context-root>DemoWeb</context-root>
		</web>
	</module>
	<module >
		<ejb>DemoEJB3.jar</ejb>
	</module>
</application>

Download

Deploy ZkEJB3Demo.ear

Notice: before deploy the demo project, please make sure that the JBoss AS datasource is setup correctly. Refer to http://wiki.jboss.org/wiki/Wiki.jsp?page=ConfigDataSources
  • Stop JBoss Application Server
  • Copy ZkEJB3Demo.ear to JBOSS_HOME\server\default\deploy\
  • Start JBoss Application Server

Conclusion

ZK developres should have a general idea of ZK JndiVariableResolver now. Using JndiVariableResolver, ZK developers can retrieve any JNDI env variables, not only EJB3 variables. For example: If you have a mailing java object which is bound to java:comp/env/mail, ZK developers can retrieve it easily by JndiVariableResolver. If you have futher question, feel free to leave comment here.

Comments
 
Julio Monteiro
2008-01-03

Thanks for the wonderful smalltalk!

Just a small typo:
In the first section after the Introduction, in the example code, you mispelled <?variable-resolver>.

Cheers and Happy New Year!
Julio Monteiro

Jeff Liu
2008-01-04

Thank you for inform. It is corrected. Thank you!

Ayman Elgharabawy
2008-02-13

i am so exciting about it but

i am just asking about if there any example using ejb3

with oc4j 10.1.3 ??

Ayman Elgharabawy
2008-02-13

is there any example for applying it on oc4j 10.1.3???

 
 
Leave a Reply
 
Name (required)
Mail (will not be published) (required)
Website
(Case Insensitive)
Bold textItalic textUnderLine textSource CodeHorizontal rulerExternal Link