Documente Academic
Documente Profesional
Documente Cultură
TUTORIAL Eclipse
Java Server Faces: Form Simplu Starter
SGBD: PostgreSQL 12
Driver JDBC: posgresql-42.x.jdbc
Plan
● 1. Verificare infrastructură necesară
◦ Biblioteci suport: MyFaces
◦ Proiect suport JPA
◦ Server Tomcat
● 2. Creare formular start
◦ Creare sursă de date formular simplu
◦ Creare fişier-pagină gazdă formular simplu
◦ Creare butoane de navigare formular
◦ Creare rubrici formular
◦ Creare butoane tranzacționale formular
◦ 3. Test formular start JSF
1. Verificare infrastructură necesară
Biblioteci kit
JSF2/
Apache MyFaces 2.2
1.2 Creare proiect JSF
1. Creare proiect tip DynamicWebProject
● adăugare dependenţă server de aplicaţii web Apache
Tomcat
5. Verificare configuraţie:
JSF Facet versiunea 2.2
Adăugare
dependenţă către
proiectul JPA în
Deployment
Assembly pentru
proiectul JSF
(ProduseJSF)
2. Creare formular start
● 2.1 Creare sursă de date formular simplu
● 2.2 Creare fişier gazdă formular simplu
○ Creare fişier XHTML
○ Creare form JSF cu rubrici legate la sursa de date
○ Creare butoane de navigare
○ Creare butoane tranzacționale
● 2.3 Test formular simplu JSF
2.1 Creare structuri model în
controler formular simplu
● Creare clasă suport <managed-bean> FormClienti din secţiunea
Java Resource: src a perspectivei JavaEE sau Web
● Codificarea clasei FormClienti
○ Marcarea clasei drept componentă “managed” pentru a putea fi
invocată din contextul aplicaţiei (în special de cadrul binding care
o va lega de componentele grafice)
■ @ManagedBean @SessionScoped
○ Definirea modelului de date
■ Atribut pentru entitatea curentă
■ Colecţie pentru entităţile accesibile
○ Constructorul implicit (fără parametri)
■ Invocarea suportului de persistenţă pentru a iniţializa modelul
de date
Controler: Definire Model
Model de date
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.comenzi.model.Client;
@ManagedBean @SessionScoped
public class FormClienti
{
// Declaratii Model
// Initializare Model
// Actiuni de navigare Model
// Actiuni Tranzactionale
}
Controller: Implementare Structuri Model
package org.comenzi.forms;
import …;
@ManagedBean @SessionScoped
public class FormClienti
{
// Declaratii Model
private List<Client> clienti = new ArrayList<Client>();
private Client client;
Fereastra de proprietăţi
2.2.2 Structură formular
● Formularele JSF vor fi definite în fișiere XML specifice cu extensia XHTML
și având un antet care să menționeze spațiile de nume JSF pentru importul
corect al tag-urilor necesare definirii componentelor JSF:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"httf://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<body>
<!-- Continut cu tag-uri JSF-->
</body>
</html>
Structura finală a formularului
Definire tag JSF pentru formular
<h:form id="formClientiForm"> Tag start formular
</h:panelGrid>
</h:panelGrid>
</h:form>
Legare (binding) acțiuni de navigare
● Legare componentă <h:commandButton> la
metodă-controller prin expresia JSF.EL:
○ actionListener="#{formClienti.previousClient}"
■ #{...} notație JSF Expression Language evaluată
(dinamic) la runtime în:
■ formClienti - nume instanță din clasa FormClienti
etichetată @ManagedBean (implicit, numele instanței
derivă din numele clasei de origine, dar cu
minusculă);
■ previousClient - nume metodă din controller
public void previousClient(ActionEvent
evt){...} cu parametru de tip
javax.faces.event.ActionEvent
Definire rubrici formular:
<h:form id="formClientiForm"> Tag start formular
<h:panelGrid columns="2" id="p1" border="1"> Tag panou principal
... ...
<h:outputText value="Nume:"/> Panou principal: Coloana 1,
linia 2: etichetă-text
<h:inputText id="client_nume"
value="#{formClienti.client.nume}"/> Panou principal: Coloana 2,
linia 2: input-text pentru
afișare-editare câmp nume
client
<h:outputText value="Id:"/>
Panou principal: Coloana 1,
<h:inputText id="client_id" linia 3: etichetă-text
value="#{formClienti.client.id}"/>
Panou principal: Coloana 2,
... ...
linia 3: input-text pentru
afișare-editare câmp id client
</h:panelGrid>
</h:form>
Legare (binding) rubrici formular
● Legare componentelor de tip <h:inputText> la
proprietăți ale structurilor de date din modelul
gestionat de componenta-controller FormClienti
se face prin expresii de tip JSF.EL:
○ value="#{formClienti.client.id}"
■ #{...} notație JSF Expression Language evaluată
(dinamic) la runtime în:
■ formClienti.client - numele proprietății din clasa
FormClienti corespunzătoare metodei accessor
getClient();
■ formClienti.client.id - numele proprietății
getId() din entitatea Client ce corespunde tipului
proprietății desemnate prin getClient();
Definire secțiune tranzacțională (1)
Panou Adaugare + Stergere
<h:form id="formClientiForm"> Tag start formular
<h:panelGrid columns="2" id="p1" border="1"> Tag panou principal
... ...
</h:panelGrid>
... ...
</h:form>
Definire secțiune tranzacțională (2)
Panou Abandon + Salvare
<h:form id="formClientiForm"> Tag start formular
<h:panelGrid columns="2" id="p1" border="1"> Tag panou principal
... ...
</h:panelGrid>
... ...
</h:form>
Legare (binding) acțiuni tranzacționale
<h:outputLabel value="Navigare"/>
<h:panelGrid border="1" columns="2" id="p2">
<h:commandButton id="cmdPrevious" value="Previous"
actionListener="#{formClienti.previousClient}"/>
<h:commandButton id="cmdNext" value="Next"
actionListener="#{formClienti.nextClient}"/>
</h:panelGrid>
<context-param>
<param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
<param-value>0</param-value>
</context-param>
Tomcat Debug Mode
(2) Start ApacheTomcat in Debug Mode