Content available at http://blog.arungupta.me/2009/10/totd-109-how-to-convert-a-jsf-managed-bean-to-jsr-299-bean-web-beans/>.
PlanetMySQL Voting:
Vote UP /
Vote DOWN
Archive for the ‘javaserverfaces’ Category
TOTD #95: EJB 3.1 + Java Server Faces 2.0 + JPA 2.0 web application — Getting Started with Java EE 6 using NetBeans 6.8 M1 & GlassFish v3
Август 17th, 2009TOTD #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!

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.
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
PlanetMySQL Voting: Vote UP / Vote DOWN
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
Август 14th, 2009TOTD #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. JPA 2.0 + Eclipselink was used for the database connectivity and Servlet 3.0 was used for displaying the results to the user. The sample demonstrated how the two technologies can be mixed to create a simple web application. But Servlets are meant for server-side processing rather than displaying the results to end user. JavaServer Faces 2 (another new specification in Java EE 6) is designed to fulfill that purpose.
This Tip Of The Day (TOTD) shows how to enhance the application created in TOTD #93 and use JSF 2 for displaying the results.
- Right-click on the project, select "Properties", select
"Frameworks", click on "Add ..." as shown below:

Select "JavaServer Faces" and click on "OK". The following configuration screen is shown:

Click on "OK" to complete the dialog. This generates a whole bunch of files (7 to be accurate) in your project. Most of these files are leftover from previous version of NetBeans and will be cleaned up. For example, "faces-config.xml" is now optional and "forwardToJSF.jsp" is redundant. - Anyway, lets add a POJO class that will be our managed bean.
Right-click on "server" package and select "New", "Java Class ...",
give the name as "StateList". Change the class such that it looks like:
package server;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import states.States;
/**
* @author arungupta
*/
@ManagedBean
public class StateList {
@PersistenceUnit
EntityManagerFactory emf;
public List<States> getStates() {
return emf.createEntityManager().createNamedQuery("States.findAll").getResultList();
}
}
Here are the main characterisitcs of this class:
- This is a POJO class with @ManagedBean annotation. This annotation makes this class a managed bean that can be used in the JSF pages. As no other annotations or parameters are specified, this is a request-scoped managed bean with the name "stateList" and lazily initialized. More details about this annotation are available in the javadocs.
- The persistence unit created in TOTD #93 is injected using @PersistenceUnit annotation.
- The POJO has one getter method that queries the database
and return the list of all the states.
- In the generated file "template-client.xhtml", change the
"head" template to:
Show States
and "body" template to:
<h:dataTable var="state" value="#{stateList.states}" border="1">
<h:column><h:outputText value="#{state.abbrev}"/></h:column>
<h:column><h:outputText value="#{state.name}"/></h:column>
</h:dataTable>
This uses the standard JSF "dataTable", "column", and "outputText" tags and uses the value expression to fetch the values from the managed bean.

The updated directory structure looks like:

There were multiple files added by the JSF framework support in NetBeans. But as I said earlier, they will be cleaned up before the final release.
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 netbeans
PlanetMySQL Voting: Vote UP / Vote DOWN