| :index-group: Misc |
| :jbake-type: page |
| :jbake-status: status=published |
| = JSF-CDI-EJB |
| |
| The simple application contains a CDI managed bean `CalculatorBean`, |
| which uses the `Calculator` EJB to add two numbers and display the |
| results to the user. The EJB is injected in the managed bean using |
| @Inject annotation. |
| |
| You could run this in the latest Apache TomEE |
| https://repository.apache.org/content/repositories/snapshots/org/apache/openejb/apache-tomee/[snapshot] |
| |
| The complete source code is below but lets break down to look at some |
| smaller snippets and see how it works. |
| |
| A little note on the setup: |
| |
| 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 |
| |
| And we use 2.0 version of faces-config |
| |
| To make this a cdi-aware-archive (i.e bean archive) an empty beans.xml |
| is added in WEB-INF |
| |
| [source,java] |
| ---- |
| <?xml version="1.0" encoding="UTF-8"?> |
| |
| <beans 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/beans_1_0.xsd"> |
| </beans> |
| ---- |
| |
| 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 used the bean here. By default, the bean name would be |
| the simple name of the bean class with the first letter in lower case. |
| |
| We’ve annotated the `CalculatorBean` with `@RequestScoped`. So when a |
| request comes in, the bean is instantiated and placed in the request |
| scope. |
| |
| 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 returns what view is to be rendered. |
| |
| 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 where use EL and display |
| the result from the request-scoped `calculatorBean`. |
| |
| # Source Code |
| |
| == CalculatorBean |
| |
| [source,java] |
| ---- |
| import javax.enterprise.context.RequestScoped; |
| import javax.inject.Named; |
| import javax.inject.Inject; |
| |
| @RequestScoped |
| @Named |
| public class CalculatorBean { |
| @Inject |
| 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"; |
| } |
| } |
| ---- |
| |
| == Calculator |
| |
| [source,java] |
| ---- |
| package org.superbiz.jsf; |
| |
| import javax.ejb.Stateless; |
| |
| @Stateless |
| public class Calculator{ |
| |
| public double add(double x, double y) { |
| return x + y; |
| } |
| } |
| ---- |
| |
| #web.xml |
| |
| MyProject web.xml |
| |
| Faces Servlet javax.faces.webapp.FacesServlet 1 |
| |
| Faces Servlet *.jsf |
| |
| index.jsp index.html |
| |
| #Calculator.xhtml |
| |
| <!DOCTYPE html PUBLIC ``-//W3C//DTD XHTML 1.0 Transitional//EN'' |
| ``http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd''> |
| |
| #Result.xhtml |
| |
| <!DOCTYPE html PUBLIC ``-//W3C//DTD XHTML 1.0 Transitional//EN'' |
| ``http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd''> |
| |
| [source,java] |
| ---- |
| <h:commandLink action="back"> |
| <h:outputText value="Home"/> |
| </h:commandLink> |
| </h:form> |
| ---- |
| |
| #faces-config.xml |
| |
| /calculator.xhtml success /result.xhtml |
| |
| /result.xhtml back /calculator.xhtml |