JavaServer Faces (JSF)

Olá…

Estou iniciando com JSF…
E gostaria de saber como mapeamos o local onde as páginas JSF ficaram…

Por exemplo:


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

Quando utilizo isto informo que todas minhas páginas que terminam com .jspx serão minhas páginas JSF…
Em Spring, informa-se também o PREFIX, onde eu costumo colocar em …"/WEB-INF/views/"…
Gostaria de fazer o mesmo em JSF…

Como faço para mapear para que minha aplicação identifique as páginas JSF que ficaram na pasta /WEB-INF/views/ … ??
O padrão é ler o diretório raiz, webapp …

Valeu!!!

A ideia seria encurtar a URL…

Tem este link de um outro colega do GUJ … http://www.guj.com.br/posts/list/89957.java
que esta com o mesmo problema…

Obrigado!

Vc não configura nada neste sentido com JSF. Vc será capaz de acessar quaisquer páginas q estiverem na raiz do seu projeto (web no netbeans, WebContent no Eclipse). Mas vc precisa configurar a FacesServlet:

<servlet>
    <servlet-name>FacesServlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>FacesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

O servlet-mapping determina como vc deve acessar as suas páginas JSF, pois se a url não casar com este pattern a FacesServlet não será executada. O uso do pattern *.xhtml ainda ajuda pelo fato de evitar q os usuários acessem os códigos fonte das páginas q tb devem ser xhtml. Mas esse pattern pde ser qualquer um outro q possa ser configurado ali. Por padrão o JSF2 procura por páginas com extensão xhtml, eu seja mesmo o pattern configurado seja *.jspx ele vai procurar p/ arquivos .xhtml na raiz do projeto. O JSF1.x por padrão procura p/ páginas .jsp.

Certo…

Então por exemplo…

<servlet> <servlet-name>FacesServlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>FacesServlet</servlet-name> <url-pattern>/WEB-INF/views/*</url-pattern> </servlet-mapping>

é possível?

E acessar a URL … http://…/NomeDoPrj/pagina.xhtml

Sendo que a estrutura do meu diretório com as páginas JSF é:

src/main/webapp/web-inf/views/

Valeu dev.rafael!

Não! O servidor torna o diretório /WEB-INF e todo o seu conteúdo invisível, não sendo possível acessar urls como /WEB-INF/views/index.xhtml. Alguns framewors como o VRaptor usam colocar suas views dentro de desse diretório, mas isso um recurso específico do framework e não vai funcionar no JSF. O pattern especificado no servlet-mapping serve apenas p/ ativar o JSF. Por exemplo, digamos q vc configurou o seu servlet-mapping como este…

<servlet-mapping>    
     <servlet-name>FacesServlet</servlet-name>    
     <url-pattern>/faces/*</url-pattern>    
</servlet-mapping>  

… isso significa q toda página JSF deve ser acessada como prefixo faces. Ou seja, se vc acessar a página index.xhtml pela url http://meusite.com/meuprog/faces/index.xhtml, o JSF não vai procurar por um arquivo index.xhtml dentro de um diretório faces, ele vai procurar por esse arquivo na raiz do projeto. Isso pq a parte /faces/ só está ali p/ ativar o JSF. Vc ainda pode acessar o arquivo index.xhtml pela url http://meusite.com/meuprog/index.xhtml mas neste caso o servidor vai devolver o arquivo sem processar as tags do JSF. O mesmo vale p/…

<servlet-mapping>    
     <servlet-name>FacesServlet</servlet-name>    
     <url-pattern>*.wow</url-pattern>    
</servlet-mapping>  

… o servidor não vai procurar por arquivos com a extensão .wow ele ainda vai procurar p/ arquivos com extensão .xhtml. Mesmo assim quando vc for acessar o arquivo index.xhtml vc precisará usar a url http://meusite.com/meuprog/index.wow p/ q o JSF seja executado. A url http://meusite.com/meuprog/index.xhtml continua sendo válida mas não executa o JSF. O mapeamento…

<servlet-mapping>    
     <servlet-name>FacesServlet</servlet-name>    
     <url-pattern>*.xhtml</url-pattern>    
</servlet-mapping>  

Apenas resolve isso fazendo com q o JSF seja executado através da url q vc normalmente usaria p/ acessar aquele arquivo, além de impedir q o arquivo possa ser acessado de um modo q ele não seja processado pelo JSF, o q resultaria na apresentação do código-fonte desse arquivo ao usuário final e a uma possível brecha na segurança do seu aplicativo.

Entendido…

Então, não é possível eu colocar arquivos JSF no diretório src/main/webapp/WEB-INF/views
E acessar via URL: http://xxx/MeuPrj/página.jsf
Via alguma configuração JSF … ?

Pelo SPRING utilizo assim:

    [code]<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
	<property name="viewResolvers">
		<list>
			<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
				<property name="prefix" value="/WEB-INF/views/"/>
				<property name="suffix" value=".jsp"/>
		    </bean>
		</list>
	</property>
</bean>[/code]

Obrigado !!

Não, os seus arquivo não podem estar dentro do diretório /WEB-INF. Eles devem estar em src/main/webapp/. Apartir dai vc é livre p/ criar qualquer estrutura de diretórios q vc quizer mas não pode colocar as suas views dentro de /WEB-INF. Se fize-lo o JSF não encontrará as suas views.

perfeito!

Valeu dev.rafael !!