[ERRO] Netbeans com JSF e Facelets

8 respostas
edu_fernandes

Boa tarde a todos.

Estou com o seguinte problema e não consigo encontrar o erro.

Criei um layout modelo usando facelets, e um outro que ‘extende’ este modelo.

Estes modelos estão na pasta tamplate, fora de resource.

Usando o Primefaces eu criei a seguinte url:

<p:menuitem value="Novo lead" url="tamplate/novoLead.xhtml"/>

O seguinte erro me é mostrado na tela:

O documento XML não está associado a estilos. A estrutura do documento é representada abaixo.

E me é exibido todo o xml do documento.

Estou usando a versão 7.0.1 do Netbeans.

Agradeço a todos que responderem.

Obrigado.

8 Respostas

E

acho que a url não deveria ser .xhtml, vc colocou para o faces mapear que extensão na url? xhtml mesmo? ou html? etc…

edu_fernandes

No web.xml está assim.

/faces/*

Devo inserir o .xhtml?

E

creio que na url do menu deveria ficar assim então:

“/faces/tamplate/novoLead”

Só para você entender, o erro que está dando é que você está acessando pelo seu navegador diretamente o .xhtml e no web.xml você não colocou um mapeamento para processar esse tipo de arquivo. Se você não coloca um mapeamento, ele manda tal qual está gravado no disco (com o mimetype que está gravado no disco) para o seu navegador. Como você mapeou para ele processar os arquivos xhtml através do padrão /faces/*, todas as páginas, para serem processadas precisam ter na url, logo depois do caminho do contexto, o /faces/, e depois do /faces/ seria o endereço da página xhtml (sem o .xhtml) dentro do contexto.

edu_fernandes

evefuji:
creio que na url do menu deveria ficar assim então:

“/faces/tamplate/novoLead”

Só para você entender, o erro que está dando é que você está acessando pelo seu navegador diretamente o .xhtml e no web.xml você não colocou um mapeamento para processar esse tipo de arquivo. Se você não coloca um mapeamento, ele manda tal qual está gravado no disco (com o mimetype que está gravado no disco) para o seu navegador. Como você mapeou para ele processar os arquivos xhtml através do padrão /faces/*, todas as páginas, para serem processadas precisam ter na url, logo depois do caminho do contexto, o /faces/, e depois do /faces/ seria o endereço da página xhtml (sem o .xhtml) dentro do contexto.

Infelizmente isso não funcionou.

Inseri o seguinte…

/faces/tamplate/*

E não funcionou.

Erro 404.

Estranho isso.

edu_fernandes

Tentei deixar fora da pasta tamplates mas não deu certo também.

O mesmo erro me é emitido.

O documento XML não está associado a estilos. A estrutura do documento é representada abaixo.


      <ui:composition template="./home.xhtml"><ui:define name="content"><h:form><p:panel id="painelLead" header="Novo lead" style="margin-bottom: 10px;"><h:outputLabel value="Nome:"/><p:inputText id="nome" value="#{leadBean.nome}" required="true" label="nome"><f:validateLength minimum="3"/></p:inputText><p:message for="nome"/><h:outputLabel value="Sobrenome:"/><p:inputText id="sobrenome" value="#{leadBean.sobrenome}" required="true" label="sobrenome"><f:validateLength minimum="2"/></p:inputText><p:message for="sobrenome"/><h:outputLabel value="Tipo de registro:"/><p:inputText id="tipoRegistro" value="#{leadBean.tipoRegistro}" required="false" label="tipoRegistro"><f:validateLength minimum="2"/></p:inputText><p:message for="tipoRegistro"/><h:outputLabel value="Empresa:"/><p:inputText id="empresa" value="#{leadBean.empresa}" required="false" label="empresa"><f:validateLength minimum="1"/></p:inputText><p:message for="empresa"/><h:outputLabel value="Formação:"/><p:inputText id="formacao" value="#{leadBean.formacao}" required="false" label="formacao"><f:validateLength minimum="2"/></p:inputText><p:message for="formacao"/><h:outputLabel value="Cargo:"/><p:inputText id="cargo" value="#{leadBean.cargo}" required="false" label="cargo"/><h:outputLabel value="Data comemorativa da categoria:"/><p:calendar effect="drop" locale="pt-BR"/><h:outputLabel value="Data de nascimento:"/><p:calendar effect="drop" locale="pt-BR"/><h:outputLabel value="Sexo:"/><h:outputLabel value="Status do lead:"/><h:outputLabel value="Telefone:"/><p:inputText id="telefone" value="#{leadBean.telefone}" required="false" label="telefone"/><h:outputLabel value="Ramal"/><p:inputText id="ramal" value="#{leadBean.ramal}" required="false" label="ramal"/><h:outputLabel value="Fax:"/><p:inputText id="fax" value="#{leadBean.fax}" required="false" label="fax"/><h:outputLabel value="Celular:"/><p:inputText id="celular" value="#{leadBean.celular}" required="false" label="celular"/><h:outputLabel value="Celular alternativo:"/><p:inputText id="celularAlternativo" value="#{leadBean.celularAlternativo}" required="false" label="celularAlternativo"/><h:outputLabel value="Email:"/><p:inputText id="email" value="#{leadBean.email}" required="false" label="email"/><h:outputLabel value="Email alternativo:"/><p:inputText id="emailAlternativo" value="#{leadBean.emailAlternativo}" required="false" label="emailAlternativo"/><h:outputLabel value="MSN:"/><p:inputText id="msn" value="#{leadBean.msn}" required="false" label="msn"/><h:outputLabel value="Skype:"/><p:inputText id="skype" value="#{leadBean.skype}" required="false" label="skype"/><h:outputLabel value="Outros mensageiros:"/><p:inputTextarea id="outrosMensageiros" value="#{leadBean.outrosMensageiros}" required="false" label="outrosMensageiros" rows="3"/><h:outputLabel value="Origem lead:"/></p:panel></h:form></ui:define></ui:composition>
E

não é estranho, você não está mandando o servidor processar o xhtml(não está dizendo como processar).

Assim, dá uma olhada no seu web.xml:

<servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>

Se você tem isso no seu web.xml, você está dizendo para o seu servlet container que somente serão processadas como JSF as urls que tiverem o formato EnderecoDoContexto/faces/*, ou seja, se vc tem enderecodocontexto/template/arquivo.xhtml, você acessará como http://enderecodocontexto/faces/template/arquivo

edu_fernandes

Então.

No NB esse faces não representa uma pasta, não sei se sabe disso.

É um padrão, meio estranho aqui, mas não mudei por enquanto.

Como disse, eu tentei fazer o teste tirando da pasta tamplate.

O mesmo erro foi retornado.

Fiz o seguinte, criei uma .xhtml de teste baseada no modelo e ela funcionou, porém ela não era chamada atraves de um botão.

Portanto eu acredito que o erro, talvez, seja na forma como a estou chamando.

Veja o código:

<p:menubar autoSubmenuDisplay="true" style="border: 0px;">
			<p:submenu label="Lead">
				<p:menuitem value="Novo lead" url="./novoLead.xhtml"/>
				<p:menuitem value="Pesquisar lead"/>
			</p:submenu>
[...]

Lembro ainda que neste exemplo as páginas estão fora da pasta tamplate.

Vou postar aqui o código do modelo e do xhtml baseado nele.

Modelo:

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

    <h:head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <link href="./../resources/css/default.css" rel="stylesheet" type="text/css" />
        <link href="./../resources/css/cssLayout.css" rel="stylesheet" type="text/css" />
        <title>CRM - FATEC Ourinhos</title>
    </h:head>

    <h:body>

        <div id="top">
            <ui:insert name="top">
                <h:form>
                    <p:menubar autoSubmenuDisplay="true" style="border: 0px;">
			<p:submenu label="Lead">
				<p:menuitem value="Novo lead" url="./novoLead.xhtml"/>
				<p:menuitem value="Pesquisar lead"/>
			</p:submenu>
			<p:submenu label="Conta">
				<p:menuitem value="Nova conta"/>
				<p:menuitem value="Pesquisar conta"/>
			</p:submenu>
			<p:submenu label="Contato">
				<p:menuitem value="Novo contato"/>
				<p:menuitem value="Pesquisar contato"/>
			</p:submenu>
			<p:submenu label="Oportunidade">
				<p:menuitem value="Nova oportunidade"/>
				<p:menuitem value="Pesquisar oportunidade"/>
			</p:submenu>
			<p:submenu label="Produtos">
				<p:menuitem value="Novo produto"/>
				<p:menuitem value="Pesquisar produto"/>
			</p:submenu>
			<p:submenu label="Nome usuário">
				<p:menuitem value="Sair"></p:menuitem>
			</p:submenu>
		</p:menubar>			
	</h:form>
            </ui:insert>
        </div>

        <div id="content" class="center_content">
            <ui:insert name="content">Content</ui:insert>
        </div>

        <div id="bottom">
            <ui:insert name="bottom">Bottom</ui:insert>
        </div>

    </h:body>

</html>

xhtm, basedo no tamplate:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition template="./home.xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:p="http://primefaces.prime.com.tr/ui"
                xmlns:f="http://java.sun.com/jsf/core"
                >

    <ui:define name="content">
        <h:form>
            <p:panel id="painelLead" header="Novo lead" style="margin-bottom: 10px;">
                <h:outputLabel value="Nome:"/>
                <p:inputText id="nome" value="#{leadBean.nome}" required="true" label="nome">
                    <f:validateLength minimum="3"/>
                </p:inputText>
                <p:message for="nome"/>
                
                <h:outputLabel value="Sobrenome:"/>
                <p:inputText id="sobrenome" value="#{leadBean.sobrenome}" required="true" label="sobrenome">
                    <f:validateLength minimum="2"/>
                </p:inputText>
                <p:message for="sobrenome"/>
                
                <h:outputLabel value="Tipo de registro:"/>
                <p:inputText id="tipoRegistro" value="#{leadBean.tipoRegistro}" required="false" label="tipoRegistro">
                    <f:validateLength minimum="2"/>
                </p:inputText>
                <p:message for="tipoRegistro"/>
                
                <h:outputLabel value="Empresa:"/>
                <p:inputText id="empresa" value="#{leadBean.empresa}" required="false" label="empresa">
                    <f:validateLength minimum="1"/>
                </p:inputText>
                <p:message for="empresa"/>
                
                <h:outputLabel value="Formação:"/>
                <p:inputText id="formacao" value="#{leadBean.formacao}" required="false" label="formacao">
                    <f:validateLength minimum="2"/>
                </p:inputText>
                <p:message for="formacao"/>
                
                <h:outputLabel value="Cargo:"/>
                <p:inputText id="cargo" value="#{leadBean.cargo}" required="false" label="cargo"/>
                
                <h:outputLabel value="Data comemorativa da categoria:"/>
                <p:calendar effect="drop" locale="pt-BR"/>
                
                <h:outputLabel value="Data de nascimento:"/>
                <p:calendar effect="drop" locale="pt-BR" />
                
                <h:outputLabel value="Sexo:"/>
                
                
                <h:outputLabel value="Status do lead:"/>
                
                <h:outputLabel value="Telefone:"/>
                <p:inputText id="telefone" value="#{leadBean.telefone}" required="false" label="telefone"/>
                
                <h:outputLabel value="Ramal"/>
                <p:inputText id="ramal" value="#{leadBean.ramal}" required="false" label="ramal"/>
                
                <h:outputLabel value="Fax:"/>
                <p:inputText id="fax" value="#{leadBean.fax}" required="false" label="fax"/>
                
                <h:outputLabel value="Celular:"/>
                <p:inputText id="celular" value="#{leadBean.celular}" required="false" label="celular"/>
                
                <h:outputLabel value="Celular alternativo:"/>
                <p:inputText id="celularAlternativo" value="#{leadBean.celularAlternativo}" required="false" label="celularAlternativo"/>
                
                <h:outputLabel value="Email:"/>
                <p:inputText id="email" value="#{leadBean.email}" required="false" label="email"/>
                
                <h:outputLabel value="Email alternativo:"/>
                <p:inputText id="emailAlternativo" value="#{leadBean.emailAlternativo}" required="false" label="emailAlternativo"/>
                
                <h:outputLabel value="MSN:"/>
                <p:inputText id="msn" value="#{leadBean.msn}" required="false" label="msn"/>
                
                <h:outputLabel value="Skype:"/>
                <p:inputText id="skype" value="#{leadBean.skype}" required="false" label="skype"/>
                
                <h:outputLabel value="Outros mensageiros:"/>
                <p:inputTextarea id="outrosMensageiros" value="#{leadBean.outrosMensageiros}" required="false" label="outrosMensageiros" rows="3"/>
                
                <h:outputLabel value="Origem lead:"/>
               
            </p:panel>
        </h:form>
    </ui:define>

</ui:composition>

Agradeço as respostas.

E

vamos colocar exemplos mais claros então.

Supomos que sua pasta de trabalho (o contexto do projeto) é C:\projetos\projeto1.
Supomos também que quando você acessa a home do projeto (faz o deploy no glassfish, o netbeans faz isso automaticamente para você), você acessa com a url http://localhost:8080/projeto1/

Agora, vamos considerar que dentro da pasta do projeto, o seu arquivo index.xhtml é C:\projetos\projeto1\web\index.xhtml e um arquivo pagina1.xhtml que está em C:\projetos\projeto1\web\pagina1.xhtml

Se você tem no seu web.xml, esse servlet mapping:

<servlet-mapping>  
    <servlet-name>Faces Servlet</servlet-name>  
    <url-pattern>/faces/*</url-pattern>  
</servlet-mapping>

Você deve acessar a página1.xhtml assim: http://localhost:8080/projeto1/faces/pagina1

Se você tem no seu web.xml, esse servlet mapping:

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

Você deve acessar a página1.xhtml assim: http://localhost:8080/projeto1/pagina1.html

Se você tem no seu web.xml, esse servlet mapping:

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

Você deve acessar a página1.xhtml assim: http://localhost:8080/projeto1/pagina1.jsf

Então, na url do menu, você não deve colocar url="./novoLead.xhtml" mas url=“novoLead” (se estiver na home), ou para ser mais preciso, no caso do exemplo que eu dei: url=“http://localhost:8080/projeto1/faces/novoLead.xhtml

Criado 29 de outubro de 2011
Ultima resposta 29 de out. de 2011
Respostas 8
Participantes 2