blob: 4f64a80fd397ac7d58f011f0a236dc7d492abb49 [file] [log] [blame]
:index-group: Misc
:jbake-type: page
:jbake-status: status=published
= JSF Application that uses managed-bean and ejb
This is a simple web-app showing how to use dependency injection in JSF
managed beans using TomEE.
It contains a Local Stateless session bean `CalculatorImpl` which adds
two numbers and returns the result. The application also contains a JSF
managed bean `CalculatorBean`, which uses the EJB to add two numbers and
display the results to the user. The EJB is injected in the managed bean
using `@EJB` annotation.
== A little note on the setup:
You could run this in the latest Apache TomEE
https://repository.apache.org/content/repositories/snapshots/org/apache/tomee/apache-tomee/[snapshot]
As for the libraries, myfaces-api and myfaces-impl are provided in
tomee/lib and hence they should not be a part of the war. In maven
terms, they would be with scope `provided'
Also note that we use servlet 2.5 declaration in web.xml
[source,xml]
----
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
----
And we use 2.0 version of faces-config
The complete source code is provided below but let’s break down to look
at some smaller snippets and see how it works.
We’ll first declare the `FacesServlet` in the `web.xml`
[source,java]
----
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
----
`FacesServlet` acts as the master controller.
We’ll then create the `calculator.xhtml` file.
[source,java]
----
<h:outputText value='Enter first number'/>
<h:inputText value='#{calculatorBean.x}'/>
<h:outputText value='Enter second number'/>
<h:inputText value='#{calculatorBean.y}'/>
<h:commandButton action="#{calculatorBean.add}" value="Add"/>
----
Notice how we’ve use the bean here. By default it is the simple class
name of the managed bean.
When a request comes in, the bean is instantiated and placed in the
appropriate scope. By default, the bean is placed in the request scope.
[source,java]
----
<h:inputText value='#{calculatorBean.x}'/>
----
Here, getX() method of calculatorBean is invoked and the resulting value
is displayed. x being a Double, we rightly should see 0.0 displayed.
When you change the value and submit the form, these entered values are
bound using the setters in the bean and then the commandButton-action
method is invoked.
In this case, `CalculatorBean#add()` is invoked.
`Calculator#add()` delegates the work to the ejb, gets the result,
stores it and then instructs what view is to be rendered.
Youre right. The return value ``success'' is checked up in faces-config
navigation-rules and the respective page is rendered.
In our case, `result.xhtml` page is rendered.
The request scoped `calculatorBean` is available here, and we use EL to
display the values.
== Source
== Calculator
[source,java]
----
package org.superbiz.jsf;
import javax.ejb.Local;
@Local
public interface Calculator {
public double add(double x, double y);
}
----
== CalculatorBean
[source,java]
----
package org.superbiz.jsf;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
@ManagedBean
public class CalculatorBean {
@EJB
Calculator calculator;
private double x;
private double y;
private double result;
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
public double getResult() {
return result;
}
public void setResult(double result) {
this.result = result;
}
public String add() {
result = calculator.add(x, y);
return "success";
}
}
----
== CalculatorImpl
[source,java]
----
package org.superbiz.jsf;
import javax.ejb.Stateless;
@Stateless
public class CalculatorImpl implements Calculator {
public double add(double x, double y) {
return x + y;
}
}
----
== web.xml
[source,xml]
----
<?xml version="1.0"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<description>MyProject web.xml</description>
<!-- Faces Servlet -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Faces Servlet Mapping -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<!-- Welcome files -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
----
== Calculator.xhtml
[source,xml]
----
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:body bgcolor="white">
<f:view>
<h:form>
<h:panelGrid columns="2">
<h:outputText value='Enter first number'/>
<h:inputText value='#{calculatorBean.x}'/>
<h:outputText value='Enter second number'/>
<h:inputText value='#{calculatorBean.y}'/>
<h:commandButton action="#{calculatorBean.add}" value="Add"/>
</h:panelGrid>
</h:form>
</f:view>
</h:body>
</html>
----
== Result.xhtml
[source,xml]
----
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:body>
<f:view>
<h:form id="mainForm">
<h2><h:outputText value="Result of adding #{calculatorBean.x} and #{calculatorBean.y} is #{calculatorBean.result }"/></h2>
<h:commandLink action="back">
<h:outputText value="Home"/>
</h:commandLink>
</h:form>
</f:view>
</h:body>
</html>
----
== faces-config.xml
[source,xml]
----
<?xml version="1.0"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
<navigation-rule>
<from-view-id>/calculator.xhtml</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/result.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/result.xhtml</from-view-id>
<navigation-case>
<from-outcome>back</from-outcome>
<to-view-id>/calculator.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
----