!!Sorgenti del corso
[{TableOfContents }]
%%tabbedSection 
%%tab-Requisiti
!!Requisiti
;IDE:Netbeans 6.9 oppure Eclipse 3.5.2 con Server Adapter "Glassfish v3 JavaEE6"
;Application Server: Glassfish v3 (Java EE6)

/%
%%tab-Step1
!!Step 1

!Navigazione

!index.html
%%prettify 
{{{
<?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
%%prettify 
{{{
<!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>
}}}
/%

/%
%%tab-Step2

!!Step 2
Logo [scarica|../cartella/sottocartella/header_logo.gif]
[{Image src='./cartella/sottocartella/header_logo.gif'}]

!masterLayout.xhtml
%%prettify 
{{{
<!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
%%prettify 
{{{
<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
%%prettify 
{{{
<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
%%prettify 
{{{
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;
}
}}}
/%

/%
%%tab-Step3

!!Step 3
!ApplicationController.java
%%prettify 
{{{
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)
%%prettify 
{{{
[...]
JSF Sample Application #{applicationController.numeroRandom}
[...]
}}}
/%

!index.xhtml (porzione)
%%prettify 
{{{
[...]
 <ui:define name="content">
        <h:commandButton action="#{applicationController.paginaLista}" value="Entra"/>
 </ui:define>
[...]
}}}
/%

/%
%%tab-Step4

!!Step 4
!Camera.java
%%prettify 
{{{
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
%%prettify 
{{{
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
%%prettify 
{{{
/*
 * 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
%%prettify 
{{{
<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
%%prettify 
{{{
<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
%%prettify 
{{{
<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)
%%prettify 
{{{
[...]
    <h3>
        <h:outputText value="#{titolo}"/>
    </h3>
    <h3>
        <h:outputText style="display:block" value="Nessuna camera trovata"
                        rendered="#{empty listController.camere}"/>
    </h3>
[...]
}}}
/%


!tabellaCamere.xhtml (porzione)
%%prettify 
{{{
[...]
   <h:dataTable styleClass="lista" value="#{listController.camere}"
            var="camera" rendered="#{!empty listController.camere}">
[...]
}}}
/%
/%

%%tab-Step5

!!Step 5
!camera.xhtml
%%prettify 
{{{
<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)
%%prettify 
{{{
   /*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;
    }
}}}
/%

/%
%%tab-Step6
!!Step 6

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


!ListController.java (porzione)
%%prettify 
{{{

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

}}}
/%

/%
%%tab-Step7
!!Step 7

!prenotazione.xhtml
%%prettify 
{{{
<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
%%prettify 
{{{

    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)
%%prettify 
{{{

[...]
    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)
%%prettify 
{{{
[...]      
        <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)
%%prettify 
{{{
[...]      
    @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)
%%prettify 
{{{

[...]      

 @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;
    }
    
    [...]      
    
}}}
/%

/%
%%tab-Step8
!!Step 8

!camera.xhtml (porzione)
%%prettify
{{{
    
    [...]      
    
<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)
%%prettify 
{{{
    
    [...]      
    /*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"));
        }
    }
    
    [...]      
    
}}}
/%

/%
%%tab-Step9
!!Step 9

!masterLayout.xhtml (porzione)
%%prettify
{{{
    
    [...]      
    
<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)
%%prettify 
{{{
    
    [...]      
    
<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)
%%prettify 
{{{
    
    [...]      
    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
%%prettify 
{{{
/*
 * 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;

/**
 *
 * @author mauro
 */
@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)
%%prettify 
{{{

[...]

<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>

[...]

}}}
/%

/%
%%tab-Downloads
!!Downloads

||Descrizione||File
| Sorgenti dell'esempio completo | [Corso JSF/SmeaCrud-src.zip]
| War dell'applicazione web | [Corso JSF/SmeaCrud.war]



/%
/%