Facelets + JSF - Como trabalhar com os dois

15 respostas
rmomogi

Olá, estou com problemas… procurei na web e vi a solução do facelets para templates no entanto notei que o template precisa ser feito no xhtml. Mas ao colocar o comando:

<ui:composition template="layout/template.xhtml">
        <ui:define name="body">

faces-config.xml

<application>
        <view-handler> com.sun.facelets.FaceletViewHandler </view-handler>
    </application>

web.xml

<context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.xhtml</param-value>
    </context-param>

Não funciona… não renderiza o template… e nem mostra o meu conteúdo do JSF. Dá o error 404.
O que estou fazendo de errado?

15 Respostas

fontoura

Eu acho que vc deve estar pecando na hora de chamar a url, da uma olhada no post abaixo e veja como ela deve ser chamada.

http://www.fernandofontoura.com.br/2009/08/10/facelets-jsf/

rmomogi

Estou chamando com o nome do arquivo .jsf… está errado?

Pois no web.xml está assim:

<servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
fontoura

Erro 404 também acontece quando ele naum acha o template no endereço que vc passou.

Veja se o endereço está correto

<ui:composition template="<endereço_correto>">

rmomogi

Está correto pois o arquivo existe... testei com um xhtml em vez de um jsp e coloquei esse código e funciona...
só quando coloco isso num jsp para renderizar o template que não funciona...

<ui:composition template="layout/template.xhtml">
Para ajudar abaixo o código do JSP
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@taglib uri="http://richfaces.org/rich" prefix="rich"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">

<html xmlns:ui="http://java.sun.com/jsf/facelets">    
    <ui:composition template="layout/template.xhtml">
        <ui:define name="body">
            <div class="rbroundbox" style="width:225px;">
                <div class="rbtop"><div></div></div>
                <div class="rbcontent">
                    <div id="login" class="login">
                        <f:view>
                            <rich:messages>
                                <f:facet name="passedMarker">
                                    <h:graphicImage  value="/images/ajax/passed.gif" />
                                </f:facet>
                                <f:facet name="errorMarker">
                                    <h:graphicImage value="/images/ajax/error.gif" />
                                </f:facet>
                            </rich:messages>

                            <h:outputLabel id="destaque" value=".:: Acesso Restrito ::."/>
                            <h:panelGrid columns="2">
                                <h:outputLabel value="Email:"  />
                                <h:inputText id="email" value="#{LoginBean.userVO.email}"/>

                                <h:outputLabel value="Senha:" />
                                <h:inputSecret id="senha" value="#{LoginBean.userVO.senha}"/>

                                <a4j:commandButton value="OK" action="#{LoginBean.validate}"/>
                                <a4j:commandButton value="Limpar"/>
                            </h:panelGrid>
                        </f:view>
                    </div>
                </div>
                <div class="rbbot"><div></div></div>
            </div>
        </ui:define>
    </ui:composition>
</body>
</html>
fontoura

mas o seu template está dentro da pasta layout mesmo?

rmomogi

Sim, está…

Abaixo estou mandando um print …

fontoura

eu acho que falta uma barra antes do nome da pasta layout.
Outra coisa qual o arquivo vc está chamando o index.xhtml? Caso positivo vc deve chamar, no seu caso, index.jsf.

rmomogi

O arquivo index.xhtml eu fiz para testar… e funciona
Eu quero adicionar o template no teste.jsp…
Este que não funciona… ou estou errado que o template funciona somente nos arquivos xhtml…

Se for estou com outro problema, executo um a4j:commandButton para uma função do meu EJB e dá erro no javascript e não executa…

fontoura

é verdade como vc colocou .xhtml todas as páginas para usarem o Facelets terão que ter a extensão .xhtml

O Problema do botão vc terá que detalhar um pouco melhor… qual o erro de javascritp? qual a ação? enfim …

rmomogi

Eu tenho instalado o Firefox com FireBug…
e mostra o erro…

this._form is null
anonymous("_viewRoot", Object name=form)3_3_0.GA...cript.jsf (linha 187)
anonymous("_viewRoot", Object name=formId, Object originalTarget=input#j_id11 target=input#j_id11, Object similarityGroupingId=j_id11 parameters=Object)3_3_0.GA...cript.jsf (linha 154)
anonymous("_viewRoot", Object name=formId, click clientX=557, clientY=245, Object similarityGroupingId=j_id11 parameters=Object)3_3_0.GA...cript.jsf (linha 156)
function onclick(event) { A4J.AJAX.Submit("_viewRoot", null, event, {similarityGroupingId: "j_id11", parameters: {j_id11: "j_id11"}, actionUrl: "/cvh/index.jsf"}); return false; }(click clientX=557, clientY=245)1 (linha 2)
[Break on this error] elem=document.getElementById(targetID+"....._query[cname]){this._query[cname]=[];}\n

Acontece quando eu aperto o botão:

<a4j:commandButton value="OK" action="#{LoginBean.validate}"/>
fontoura

Pode postar o código completo da pagina?

rmomogi

Descobri o erro… era que não coloquei o <h:form> na tela …
Agora deu certo…
Mas o ruim é ficar sem o auto-complete do netbeans… eu uso richfaces e não funciona o auto-complete…
tem que ficar olhando a documentação… e para quem está começando fica dificil…
O que posso fazer?

fontoura

é só vc usar o seguinte

Coloque todas as definições dos namespaces dentro da tag html igual ao código abaixo.

rmomogi

eu até coloquei assim:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:c="http://java.sun.com/jstl/core"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:rich="http://richfaces.org/rich">

mas no NetBeans o auto-complete que facilita a digitação do código não funciona.
O que eu faço?

Tchello

Cara isso é um bug num arquivo xml do richfaces, ainda não se tem solução definitiva, só uns workarounds sugeridos na rede.
Abraços.

Criado 10 de agosto de 2009
Ultima resposta 11 de ago. de 2009
Respostas 15
Participantes 3