<?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>
JSF-CDI-EJB
Aplicação simples que contém um CDI managed bean CalculatorBean
,
que usa o EJB Calculator
para adicionar dois números e mostrar os resultados para o usuário. O EJB é injetado no managed bean usando a anotação
@Inject.
Você poderia executar isso no último Apache TomEE snapshot
O código completo está abaixo, mas vamos quebrá-lo para olhar para alguns trechos menores e ver como ele funciona.
Uma pequena nota sobre a configuração:
Quanto as bibliotecas, myfaces-api e myfaces-impl são fornecidas em tomee/lib e, portanto não devem ser parte do war. Nos termos do Maven, eles estariam com o escopo `provided'
Observe também que nós usamos a declaração servlet 2.5 no web.xml
E nós usamos a versão 2.0 do faces-config
Para tornar este em um cdi-aware-archive (ou seja, arquivo Bean) um beans.xml vazio é adicionado no WEB-INF
Nós primeiro vamos declarar o FacesServlet no web.xml
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>jakarta.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
FacesServlet atua como o controlador mestre.
Em seguida criaremos o arquivo calculator.xhtml.
<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"/>
Observe como usamos o bean aqui. Por padrão, o nome do bean seria o nome simples da classe bean com a primeira letra minúscula
Nós temos o CalculatorBean
anotado com @RequestScoped
. Então quando uma requisição vem, o bean é instanciado e colocado no escopo da requisição.
Aqui, o método getX() do calculatorBean é invocado e valor do resultado é apresentado. x sendo um Double, nós devemos ver justamente 0.0 sendo exibido.
Quando você modifica o valor e submete o formulário, esses valores inseridos são vinculados no bean usando os setters e então o método commandButton-action é invocado.
Neste caso, CalculatorBean#add() é invocado.
Calculator#add() delega o trabalho para o ejb, obtém o resultado, armazena-o e, em seguida, retorna qual view deve ser processada.
O valor de retorno success
é verificado no faces-config
navigation-rules e a respectiva página é renderizada.
No nosso caso, a página result.xhtml
é renderizada onde usar EL e mostra o resultado do request-scoped calculatorBean
.
Código-fonte
CalculatorBean
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Named;
import jakarta.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
package org.superbiz.jsf;
import jakarta.ejb.Stateless;
@Stateless
public class Calculator{
public double add(double x, double y) {
return x + y;
}
}
#web.xml
MyProject web.xml
Faces Servlet jakarta.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''>
<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