1
resposta

Java e JSF I: Sua aplicação web com JSF2 Duvida em criar o Templates

Boa noite, estou conseguindo acompanhar e entender passo a passo sobre o curso do java jsf. Só que cheguei nesssa parte de Templates é me "perdi" na explição, alias na teoria mesmo, porque vendo a video aula fico muito claro, porem com algumas duvidas. Com relação ao meu Template tudo certo, e aqui surge umas duvidas.

    <div id="titulo">
        <h:graphicImage library="img" name="logo.png"/>
        <h1><ui:insert name="titulo"></ui:insert></h1>
    </div>

Dentro do meu titulo está a minha imagem com o diretório dela e o nome, agora olhando na linha de baixo o meu ui:insert está dentro do minha tag h1, que sentido ela estaria ali dentro? e logo depois no meu outro xhtml temos o seguintes exemplo.

<ui:composition template="_template.xhtml">
        <ui:define name="titulo">
            Novo Livro
        </ui:define>

aqui é uma outra duvida que eu tava relacionada quase a mesma da primeira, o meu "Novo Livro" está sem a tag h1. e mesmo assim roda, seria a parte da minha primeira duvida? é por isso que o meu ui:insert está dentro da tag h1? para "evitar" usar a tag h1 toda vez em uma pagina? ou teria outro sentido? Depois temos a outra parte

<div id="conteudo">
        <ui:insert name="conteudo">
        </ui:insert>
    </div>

aqui tudo bem sem nenhuma duvida, porem quando eu coloquei apenas a tag do titulo assim

<?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"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:ui="http://java.sun.com/jsf/facelets">


    <ui:composition template="_template.xhtml">
        <ui:define name="titulo">
            Novo Livro
        </ui:define>



        <h:form>

            <h:messages id="messages"/>

            <fieldset>
                <legend>Dados do Livro</legend>
                <h:panelGrid columns="2">

                    <h:outputLabel value="Titulo:" for="titulo" />
                    <h:inputText id="titulo" value="#{livroBean.livro.titulo}" required="true" 
                        requiredMessage="Título obrigatório" validatorMessage="Título não pode ser superior a 40">
                        <f:validateLength maximum="40" />
                        <f:ajax event="blur" render="messages"/>
                    </h:inputText>

                    <h:outputLabel value="ISBN:" for="isbn" />
                    <h:inputText id="isbn" value="#{livroBean.livro.isbn}" validator="#{livroBean.comecaComDigitoUm}"/>

                    <h:outputLabel value="Preço:" for="preco" />
                    <h:inputText id="preco" value="#{livroBean.livro.preco}"/>

                    <h:outputLabel value="Data de Lançamento:" for="dataLancamento" />
                    <h:inputText id="dataLancamento" value="#{livroBean.livro.dataLancamento.time}">
                        <f:convertDateTime pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo" />
                    </h:inputText>

                </h:panelGrid>
            </fieldset>

            <fieldset>
                <legend>Dados do Autor</legend>

                    <h:outputLabel value="Selecione Autor:" for="autor"/>
                    <h:selectOneMenu value="#{livroBean.autorId}" id="autor">
                        <f:selectItems value="#{livroBean.autores}" var="autor" 
                                itemLabel="#{autor.nome}" itemValue="#{autor.id}"/>
                    </h:selectOneMenu>

                    <h:commandButton value="Gravar Autor" action="#{livroBean.gravarAutor}" >
                        <f:ajax execute="autor" render="tabelaAutores"/>
                    </h:commandButton>

                    <br />

                    <h:commandLink value="Cadastrar novo autor" action="#{livroBean.formAutor}" immediate="true"/>

                    <h:dataTable value="#{livroBean.autoresDoLivro}" var="autor" id="tabelaAutores">
                        <h:column>
                            <h:outputText value="#{autor.nome}"/>
                        </h:column>
                    </h:dataTable>
            </fieldset>

            <h:commandButton value="Gravar" action="#{livroBean.gravar}" >
                <f:ajax execute="@form" render="@form :tabelaLivros"/>
            </h:commandButton>

        </h:form>

        <h:dataTable value="#{livroBean.livros}" var="livro" id="tabelaLivros">
            <h:column>
                <f:facet name="header">Título</f:facet>
                <h:outputText value="#{livro.titulo}"/>                
            </h:column>

            <h:column>
                <f:facet name="header">ISBN</f:facet>
                <h:outputText value="#{livro.isbn}"/>                
            </h:column>

            <h:column>
                <f:facet name="header">Preço</f:facet>
                <h:outputText value="#{livro.preco}">
                    <f:convertNumber type="currency" pattern="R$ #0.00" currencySymbol="R$" locale="pt_BR" />
                </h:outputText>                
            </h:column>

            <h:column>
                <f:facet name="header">Data</f:facet>
                <h:outputText value="#{livro.dataLancamento.time}">
                    <f:convertDateTime pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo" />
                </h:outputText>                
            </h:column>

        </h:dataTable>
    </ui:composition>

</html>

Quando coloquei assim sem o meu templat do conteudo cliquei para rodar e subir o servidor e tive uma surpresa, oque estava na página só era o meu logo da CAELUM e o meu Novo Livro, como e porque não rodou o restante do meu conteudo? e depois acrescentei o restante do ui:define do conteudo e apareceu o restante.

1 resposta

Acho que o resultado tentou dar uma dica para você... No template você decide quais blocos precisam ser preenchidos pelo arquivo que vai usar o template em si. O template usa o h1 apenas para indicar que ali vai entrar o título mais importante da página... Como quem precisa definir isso é o arquivo que vai usar o template, ele usou o um insert para esperar por esse argumento.