TOTD #93 showed how to get started with Java EE 6 using NetBeans 6.8 M1 and GlassFish v3 by building a simple Servlet 3.0 + JPA 2.0 web application. TOTD #94 built upon it by using Java Server Faces 2 instead of Servlet 3.0 for displaying the results. However we are still using a POJO for all the database interactions. This works fine if we are only reading values from the database but that’s not how a typical web application behaves. The web application would typically perform all CRUD operations. More typically they like to perform one or more CRUD operations within the context of a transaction. And how do you do transactions in the context of a web application ? Java EE 6 comes to your rescue.
The EJB 3.1 specification (another new specification in Java EE 6) allow POJO classes to be annotated with @EJB and bundled within WEB-INF/classes of a WAR file. And so you get all transactional capabilities in your web application very easily.
This Tip Of The Day (TOTD) shows how to enhance the application created in TOTD #94 and use EJB 3.1 instead of the JSF managed bean for performing the business logic. There are two ways to achieve this pattern as described below.
Lets call this TOTD #95.1
- The easiest way to back a JSF page with an EJB is to convert the managed bean into an EJB by adding @javax.ejb.Stateless annotation. So change the “StateList” class from TOTD #94 as shown below:
@javax.ejb.Stateless
@ManagedBean
public class StateList {
@PersistenceUnit
EntityManagerFactory emf;public List<States> getStates() {
return emf.createEntityManager().createNamedQuery(“States.findAll”).getResultList();
}
}The change is highlighted in bold, and that’s it!
Because of “Deploy-on-save” feature in NetBeans and GlassFish v3, the application is autodeployed. Otherwise right-click on the project and select Run (default shortcut “F6″). As earlier, the results can be seen at “http://localhost:8080/HelloEclipseLink/forwardToJSF.jsp” or “http://localhost:8080/HelloEclipseLink/faces/template-client.xhtml” and looks like:
The big difference this time is that the business logic is executed by an EJB in a fully transactional manner. Even though the logic in this case is a single read-only operation to the database, but you get the idea
Alternatively, you can use the delegate pattern in the managed bean as described below. Lets call this #95.2.
- Right-click on the project, select “New”, “Session Bean …” and create a stateless session bean by selecting the options as shown below:
This creates a stateless session with the name “StateBeanBean” (bug #170392 for redundant “Bean” in the name).
- Simplify your managed bean by refactoring all the business logic to the EJB as shown below:
@Stateless
public class StateBeanBean {
@PersistenceUnit
EntityManagerFactory emf;
public List<States> getStates() {
return emf.createEntityManager().createNamedQuery(“States.findAll”).getResultList();
}
}and
@ManagedBean
public class StateList {
@EJB StateBeanBean bean;public List<States> getStates() {
return bean.getStates();
}
}
In fact the EJB code can be further simplified to:
@Stateless
public class StateBeanBean {
@PersistenceContext
EntityManager em;
public List<States> getStates() {
return em.createNamedQuery(“States.findAll”).getResultList();
}
}
The changes are highlighted in bold.
If the application is already running then Deploy-on-Save would have automatically deployed the entire application. Otherwise right-click on the project and select Run (default shortcut “F6″). Again, the results can be seen at “http://localhost:8080/HelloEclipseLink/forwardToJSF.jsp” or “http://localhost:8080/HelloEclipseLink/faces/template-client.xhtml” and are displayed as shown in the screenshot above.
The updated directory structure looks like:
The important point to note is that our EJB is bundled in the WAR file and no additional deployment descriptors were added or existing ones modified to achieve that. Now, that’s really clean
The next blog in this series will show how managed beans can be replaced with WebBeans, err JCDI.
Also refer to other Java EE 6 blog entries.
Please leave suggestions on other TOTD that you’d like to see. A complete archive of all the tips is available here.
Technorati: totd glassfish v3 mysql javaee6 javaserverfaces jpa2 ejb netbeans
Related posts:- TOTD #94: A simple Java Server Faces 2.0 + JPA 2.0 application – Getting Started with Java EE 6 using NetBeans 6.8 M1 & GlassFish v3
- TOTD #108: Java EE 6 web application (JSF 2.0 + JPA 2.0 + EJB 3.1) using Oracle, NetBeans, and GlassFish
- TOTD #82: Getting Started with Servlet 3.0 and EJB 3.1 in Java EE 6 using NetBeans 6.7
- TOTD #109: How to convert a JSF managed bean to JSR 299 bean (Web Beans) ?
- TOTD #147: Java Server Faces 2.0 Composite Components using NetBeans – DRY your code
Thanks for the great series. I’m really looking forwards for the WebBeans article. The various annotations are very unclear to me at the moment.
Comment by Ilmari Vacklin — August 31, 2009 @ 12:12 pm
Wow, I just downloaded NB6.8 M2 and I discovered there are facelets generator in this version. They even generate JSF beans with the @ManagedBean annotation. Only one feature is lacking on the facelets side : collections are not presented in the edit and view pages. Congratulations to the NetBean Team, this feature is a real time saver.
Comment by mini sd 8gb — January 7, 2010 @ 9:44 am