This is version . It is not the current version, and thus it cannot be edited.
[Back to current version]   [Restore this version]

Risorse del Corso JSF 2.0 Base#

Requisiti#

IDE
Netbeans 6.9 versione Java Web oppure Eclipse 3.5.2 con Server Adapter "Glassfish v3 JavaEE6"
Application Server
Glassfish v3 (Java EE6)

Step 1: La navigazione#

index.html#

<?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:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Pagina Iniziale</title>
    </h:head>
    <h:body>
        <h:form>
            <h:commandButton action="views/list" value="Entra"/>
        </h:form>
    </h:body>
</html>

list.xhtml#

<!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:h="http://java.sun.com/jsf/html"
   xmlns:ui="http://java.sun.com/jsf/facelets">

    <h:head>
        <title>Pagina Iniziale</title>
    </h:head>
    <h:body>
        <h1><h:outputText value="Hello World"/></h1>
    </h:body>

</html>

Step 2: Facelets templating#

Logo per l'header#

salva con nome...(info)

masterLayout.xhtml#

<!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:h="http://java.sun.com/jsf/html"
   xmlns:ui="http://java.sun.com/jsf/facelets">

    <h:head>
        <title>Pagina Iniziale</title>
    </h:head>
    <h:body>
        <div id="header">
            <h:graphicImage library="images" name="header_logo.gif"/>
            JSF Sample Application
        </div>
        <h:form>
            <ui:insert name="content"/>
        </h:form>
    </h:body>

    <h:outputStylesheet library="css" name="style.css"/>
</html>

index.xhtml#

<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                template="/template/masterLayout.xhtml">

    <ui:define name="content">
        <h:commandButton action="views/list" value="Entra"/>
    </ui:define>

</ui:composition>

list.xhtml#

<ui:composition
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                template="/template/masterLayout.xhtml">

    <ui:define name="content">
        <h1>
            <h:outputText value="Hello World!!!"/>
        </h1>
    </ui:define>

</ui:composition>

style.css#

body {
    font-family: Verdana,Arial,Helvetica,sans-serif;
    font-size: 11px;
    margin: 0px;
    padding: 0px;
}

#header {
    width: 100%;
    margin-bottom: 10px;
    border-bottom: 2px solid #999;
    color:#000066;
    font-size: 30px;
}

Step 3: i Managed Baen e lo scope#

ApplicationController.java#

package corsojsf.managedbeans;

import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.SessionScoped;

@ManagedBean
@RequestScoped
public class ApplicationController {

    private int random=-1;

    public String paginaLista(){
        return "views/list";
    }

    public int getNumeroRandom(){
        if (random==-1)
            random= (int)(Math.random()*100);
        return random;
    }

}

marsterLayout.xhtml (porzione)#

[...]
JSF Sample Application #{applicationController.numeroRandom}
[...]

index.xhtml (porzione)#

[...]
 <ui:define name="content">
        <h:commandButton action="#{applicationController.paginaLista}" value="Entra"/>
 </ui:define>
[...]

Step 4: inclusione con facelets e i componenti tabella#

Camera.java#

package corsojsf.model;

import java.math.BigDecimal;

public class Camera {

     private String nome;
     private Integer numeroPosti;
     private BigDecimal prezzo;
 
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public Integer getNumeroPosti() {
        return numeroPosti;
    }
    public void setNumeroPosti(Integer numeroPosti) {
        this.numeroPosti = numeroPosti;
    }
    public BigDecimal getPrezzo() {
        return prezzo;
    }
    public void setPrezzo(BigDecimal prezzo) {
        this.prezzo = prezzo;
    }

}

Prenotazione.java#

package corsojsf.model;

import java.util.Date;

public class Prenotazione {

    private String cliente;
    private Date dataInizio;
    private Date dataFine;
    private Camera camera;

    public Camera getCamera() {
        return camera;
    }
    public void setCamera(Camera camera) {
        this.camera = camera;
    }
    public String getCliente() {
        return cliente;
    }
    public void setCliente(String cliente) {
        this.cliente = cliente;
    }
    public Date getDataFine() {
        return dataFine;
    }
    public void setDataFine(Date dataFine) {
        this.dataFine = dataFine;
    }
    public Date getDataInizio() {
        return dataInizio;
    }
    public void setDataInizio(Date dataInizio) {
        this.dataInizio = dataInizio;
    }
}

ListController.java#

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package corsojsf.managedbeans;

import corsojsf.model.Camera;
import corsojsf.model.Prenotazione;
import java.util.LinkedList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class ListController {

    private List<Camera> camere = new LinkedList<Camera>();
    private List<Prenotazione> prenotazioni = new LinkedList<Prenotazione>();
    private Camera camera = new Camera();
    private Prenotazione prenotazione = new Prenotazione();

    public List<Camera> getCamere() {
        return camere;
    }

    public List<Prenotazione> getPrenotazioni() {
        return prenotazioni;
    }

    public Camera getCamera() {
        return camera;
    }

    public void setCamera(Camera camera) {
        this.camera = camera;
    }

    public Prenotazione getPrenotazione() {
        return prenotazione;
    }

    public void setPrenotazione(Prenotazione prenotazione) {
        this.prenotazione = prenotazione;
    }
}

list.xhtml#

<ui:composition
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                template="/template/masterLayout.xhtml"
                xmlns:f="http://java.sun.com/jsf/core">
                
    <ui:define name="content">
        <ui:include src="/sections/list/intestazioneCamere.xhtml">
            <ui:param name="titolo" value="Lista Camere"/>
        </ui:include>
        <ui:include src="/sections/list/tabellaCamere.xhtml"/>
    </ui:define>

</ui:composition>

tabellaCamere.xhtml#

<ui:composition
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core">

    <h:dataTable styleClass="lista" value="#{listController.camere}" var="camera">
            <h:column>
                <f:facet name="header">
                    <h:outputText value="nome"/>
                 </f:facet>
                <h:outputText value="#{camera.nome}"/>
            </h:column>
            <h:column>
                <f:facet name="header">
                    <h:outputText value="n.posti"/>
                 </f:facet>
                <h:outputText value="#{camera.numeroPosti}"/>
            </h:column>
            <h:column>
                <f:facet name="header">
                    <h:outputText value="prezzo"/>
                 </f:facet>
                <h:outputText value="#{camera.prezzo}"/>
            </h:column>
            <h:column>
                <h:outputLink value="Edit"/>
                #160;
                <h:outputLink value="Del"/>
            </h:column>
         </h:dataTable>

</ui:composition>

intestazioneCamere.xhtml#

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core">
        <h3>
            <h:outputText value="Lista Camere"/>
        </h3>
        <h:commandLink action="#{listController.nuovaCamera}" value="Nuova"/>
</ui:composition>

intestazioneCamere.xhtml (porzione)#

[...]
    <h3>
        <h:outputText value="#{titolo}"/>
    </h3>
    <h3>
        <h:outputText style="display:block" value="Nessuna camera trovata"
                        rendered="#{empty listController.camere}"/>
    </h3>
[...]

tabellaCamere.xhtml (porzione)#

[...]
   <h:dataTable styleClass="lista" value="#{listController.camere}"
            var="camera" rendered="#{!empty listController.camere}">
[...]

Step 5: form di inserimento, componenti I/O e metodi action.#

camera.xhtml#

<ui:composition
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                template="/template/masterLayout.xhtml"
                xmlns:f="http://java.sun.com/jsf/core">

    <ui:define name="content">
        <h:panelGrid columns="2">
            <h:outputLabel for="nome" value="nome camera"/>
            <h:inputText id="nome" value="#{listController.camera.nome}"/>
            <h:outputLabel for="posti" value="posti letto"/>
            <h:inputText id="posti" value="#{listController.camera.numeroPosti}"/>
            <h:outputLabel for="prezzo" value="prezzo"/>
            <h:inputText id="prezzo" value="#{listController.camera.prezzo}"/>
            <h:commandButton value="annulla" action="/views/list" immediate="true"/>
            <h:commandButton value="salva" action="#{listController.salvaCamera}"/>
        </h:panelGrid>
    </ui:define>

</ui:composition>

ListController.java (porzione)#

   /*Azioni*/
    public String nuovaCamera() {
        setCamera(new Camera());
        return "/views/camera";
    }

        public String salvaCamera() {
        Camera daSalvare = getCamera();
        if (getCamere() == null) {
            this.camere = new LinkedList<Camera>();
        }
        if (estraiCamera(daSalvare.getNome()) != null) {
            getCamere().remove(estraiCamera(daSalvare.getNome()));
        }
        getCamere().add(daSalvare);
        setCamera(null);
        return "/views/list";
    }

    private Camera estraiCamera(String nome) {
        for (Camera c : camere) {
            if (c.getNome().equalsIgnoreCase(nome)) {
                return c;
            }
        }
        return null;
    }

Step 6: metodi action con parametro#

list.xhtml (porzione)#

        <h:column>
           <h:commandLink value="Edit" action="#{listController.modificaCamera(camera)}"/>
             -
            <h:commandLink value="Del" action="#{listController.eliminaCamera(camera)}"/>
        </h:column>

ListController.java (porzione)#


   public String modificaCamera(Camera camera) {
        setCamera(camera);
        return "/views/camera";
    }
    
    
    public void eliminaCamera(Camera camera)
    {
        getCamere().remove(camera);
    }

Step 7: i convertitori e i componenti "select"#

prenotazione.xhtml#

<ui:composition
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    template="/template/masterLayout.xhtml"
    xmlns:f="http://java.sun.com/jsf/core">

    <ui:define name="content">
        <h:panelGrid columns="2">
            <h:outputLabel for="camera" value="camera"/>
            <h:selectOneMenu id="camera" value="#{listController.prenotazione.camera}">
                <f:selectItems value="#{listController.camere}" var="camera" itemValue="#{camera}" itemLabel="#{camera.nome}"/>
            </h:selectOneMenu>
            <h:outputLabel for="cliente" value="cliente"/>
            <h:inputText id="cliente" value="#{listController.prenotazione.cliente}" required="true">
            </h:inputText>
            <h:outputLabel for="dal" value="Dal"/>
            <h:inputText id="dal" value="#{listController.prenotazione.dataInizio}" required="true">
                <f:convertDateTime pattern="yyyymmdd" />
            </h:inputText>
            <h:outputLabel for="al" value="Al"/>
            <h:inputText id="al" value="#{listController.prenotazione.dataFine}" required="true">
                <f:convertDateTime pattern="yyyymmdd" />
            </h:inputText>
            <h:commandButton value="annulla" action="/views/list" immediate="true"/>
            <h:commandButton value="salva" action="#{listController.salvaPrenotazione}"/>
        </h:panelGrid>
    </ui:define>
</ui:composition>

CameraConverter.java#


    package corsojsf.managedbeans;

    import corsojsf.model.Camera;
    import java.util.List;
    import javax.faces.component.UIComponent;
    import javax.faces.component.UISelectItems;
    import javax.faces.context.FacesContext;
    import javax.faces.convert.Converter;
    import javax.faces.convert.ConverterException;
    import javax.faces.convert.FacesConverter;

    @FacesConverter(forClass=Camera.class)
    public class CameraConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        List<Camera> items = (List<Camera>) ((UISelectItems) component.getChildren().get(0)).getValue();
        for (Camera camera : items) {
            if (camera.getNome().equals(value)) {
                return camera;
            }
        }
        throw new ConverterException("Impossibile convertire " + value);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if (value instanceof Camera) {
            return ((Camera) value).getNome();
        } else {
            throw new IllegalArgumentException("Impossibile convertire oggetti " + value.getClass().getCanonicalName());
        }
    }
}


ListController.java (porzione)#


[...]
    public String nuovaPrenotazione() {
        setPrenotazione(new Prenotazione());
        return "/views/prenotazione";
    }

    public String modificaPrenotazione(Prenotazione prenotazione) {
        setPrenotazione(prenotazione);
        return "/views/prenotazione";
    }


     public void eliminaPrenotazione(Prenotazione prenotazione)
    {
        getPrenotazioni().remove(prenotazione);
    }

    public String salvaPrenotazione() {
        Prenotazione daSavlare = getPrenotazione();
        if (getPrenotazioni() == null) {
            this.prenotazioni = new LinkedList<Prenotazione>();
        }
        if (this.prenotazioni.contains(daSavlare)) {
            getPrenotazioni().remove(daSavlare);
        }
        getPrenotazioni().add(daSavlare);
        setPrenotazione(new Prenotazione());
        return "/views/list";
    }
[...]      

tabellaPrenotazione.xhtml (porzione)#

[...]      
        <h:column>
            <f:facet name="header">
                <h:outputText value="Dal"/>
            </f:facet>
            <h:outputText value="#{prenotazione.dataInizio}">
                <f:convertDateTime pattern="dd/mm/yyyy"/>
            </h:outputText>
        </h:column>
        <h:column>
            <f:facet name="header">
                <h:outputText value="al"/>
            </f:facet>
            <h:outputText value="#{prenotazione.dataFine}">
                <f:convertDateTime pattern="dd/mm/yyyy"/>
            </h:outputText>
        </h:column>
[...]      

Camera.java (porzione)#

[...]      
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Camera other = (Camera) obj;
        if ((this.nome == null) ? (other.nome != null) : !this.nome.equals(other.nome)) {
            return false;
        }
        return true;
    }
[...]      

Prenotazione.java (porzione)#


[...]      

 @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Prenotazione other = (Prenotazione) obj;
        if ((this.cliente == null) ? (other.cliente != null) : !this.cliente.equals(other.cliente)) {
            return false;
        }
        if (this.dataInizio != other.dataInizio && (this.dataInizio == null || !this.dataInizio.equals(other.dataInizio))) {
            return false;
        }
        if (this.dataFine != other.dataFine && (this.dataFine == null || !this.dataFine.equals(other.dataFine))) {
            return false;
        }
        if (this.camera != other.camera && (this.camera == null || !this.camera.equals(other.camera))) {
            return false;
        }
        return true;
    }
    
    [...]      
    

Step 8: validazione standard e metodi di validazione#

camera.xhtml (porzione)#

    
    [...]      
    
<h:outputLabel for="posti" value="posti letto"/>
<h:inputText id="posti" value="#{listController.camera.numeroPosti}" 
             validatorMessage="Il numero di posti deve essere compreso tra 1 e 5">
    <f:validateLongRange minimum="1" maximum="5"/>
</h:inputText>
<h:outputLabel for="prezzo" value="prezzo"/>
<h:inputText id="prezzo" value="#{listController.camera.prezzo}" 
             validator="#{listController.validatePrezzo}"/>
    
    [...]      
    

ListController.java (porzione)#

    
    [...]      
    /*validator*/
    public void validatePrezzo(FacesContext context, UIComponent component, Object enteredValue) throws ValidatorException {
        BigDecimal prezzo=(BigDecimal)enteredValue;
        if (prezzo.intValue()%2!=0){
            throw new ValidatorException(
                new FacesMessage("Errore di validazione: la parte intera del prezzo deve essere pari"));
        }
    }
    
    [...]      
    

Step 9: messaggi, validazione "domain-level" e classi Validator#

masterLayout.xhtml (porzione)#

    
    [...]      
    
<div id="header">
     <h:graphicImage library="images" name="header_logo.gif"/>
      JSF Sample Application #{applicationController.numeroRandom}
     <div style="color:#770000;">
         <h:messages showDetail="false" globalOnly="true"/>
     </div>
</div>
    
    [...]      
    

camera.xhtml (porzione)#

    
    [...]      
    
<h:message for="posti" style="color:red" />
    <h:panelGrid columns="2">
            <h:outputLabel for="nome" value="nome camera"/>
            <h:inputText id="nome" value="#{listController.camera.nome}"/>
            <h:outputLabel for="posti" value="posti letto"/>
            <h:inputText id="posti" value="#{listController.camera.numeroPosti}" 
                validatorMessage="Il numero di posti deve essere compreso tra 1 e 5">
                <f:validateLongRange minimum="1" maximum="5"/>
            </h:inputText>
      
    
 

ListController.java (porzione)#

    
    [...]      
    public String salvaPrenotazione() {
        Prenotazione daSalvare = getPrenotazione();
    [...]      
        if (!verificaDisponibilita(daSalvare)) {
            FacesContext.getCurrentInstance().addMessage(null, 
            new FacesMessage(FacesMessage.SEVERITY_ERROR, "Errore, la stanza non è disponibile nel periodo indicato",""));
            return null;
        }
    [...]      
    }
    
    [...]      
    
    private boolean verificaDisponibilita(Prenotazione daSalvare) {
        boolean intersezione = false;
        for (Prenotazione pre : prenotazioni) {
            if (pre.getCamera().equals(daSalvare.getCamera())) {
                if (pre.getDataFine().before(daSalvare.getDataInizio())) {
                    continue;
                } else if (pre.getDataInizio().after(daSalvare.getDataFine())) {
                    continue;
                } else {
                    intersezione = true;
                }
            }
        }
        return !intersezione;
    }
    
    [...]      
    

CameraValidator.java#

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package corsojsf.managedbeans;

import corsojsf.model.Camera;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

@FacesValidator(value="cameraValidator")
public class CameraValidator implements Validator{

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        if (!(value instanceof Camera))
            throw new ValidatorException(
            new FacesMessage("L'oggetto da passare a CameraValidator deve essere una camera"));
        Camera camera= (Camera)value;
        if (camera.getNumeroPosti()>2 && camera.getPrezzo().intValue() < 50)
            throw new ValidatorException(
            new FacesMessage("Le camere con più di 2 posti devono avere un prezzo > di 50"));
    }

}


prenotazione.xtml (porzione)#


[...]

<h:selectOneMenu id="camera" value="#{listController.prenotazione.camera}">
   <f:selectItems value="#{listController.camere}" var="camera" itemValue="#{camera}" itemLabel="#{camera.nome}"/>
     <f:validator validatorId="cameraValidator"/>
</h:selectOneMenu>

[...]

Questionario#

Q: In quale fase vengono passati i valori ai Managed Bean

IDDescrizione
1 Apply Request Values
2 Update Model
3 Invoke Application

Q: I metodi getter nel Managed Bean vengono chiamati nella fase

IDDescrizione
1 Render Response
2 Update Model
3 Tutte/Indefinito

Q: L'ordine relativo di Conversione e Validazione è:

IDDescrizione
1 Conversione, Validazione
2 Validazione, Conversione
3 Indefinito

Q: Nel caso venga visualizzato il messaggio "Unable to find matching navigation case with from-view-id '/views/camera.xhtml' for action '/views/lista' with outcome '/views/lista'"

IDDescrizione
1 Controllare web.xml
2 Cercare un metodo action che ritorni "/views/lista" e modificare il ritorno in "/views/lista.xhtml"
3 Verificare se esiste il file /views/lista.hxtml
4 Cercare un metodo action che ritorni "/views/lista" e modificare il ritorno in "lista"

Q: La URL dei namespace definiti nelle pagine, ad esempio

xmlns:h="http://java.sun.com/jsf/html"                
serve a:
IDDescrizione
1 Identificare un TLD nel classpath per la validazione
2 Scaricare un TLD da internet
3 Non serve

Add new attachment

Only authorized users are allowed to upload new attachments.

List of attachments

Kind Attachment Name Size Version Date Modified Author Change note
ppt
Corso JSF.ppt 783.9 kB 1 02-Sep-2010 07:52 m.sanfilippo
zip
SmeaCrud-src.zip 31.7 kB 1 31-Aug-2010 16:02 Administrator
war
SmeaCrud.war 30.9 kB 1 31-Aug-2010 16:02 Administrator
gif
jsf.gif 5.7 kB 1 23-Aug-2010 19:42 Administrator
« This particular version was published on 01-Sep-2010 16:52 by Administrator.