Include Dinâmico - JSF

22 respostas
R

Olá javanianos,

Gostaria que me ajudassem com o seguinte:
Estou fazendo uma aplicação e preciso fazer include de páginas na minha página principal.

A minha página principal possui:

  • Menu Superior (sempre no topo)
  • Menu Lateral (sempre no topo e abaixo do menu)
  • Conteúdo (no centro, ao lado do Menu Lateral e expansível conforme o conteúdo)
  • Rodapé (sempre em bottom)

Me proporam colocar vários includes nas minhas páginas de Conteúdo cada um chamando o Menu Superior, Menu Lateral e Rodapé. Mas eu não queria fazer assim.

Eu recorri à alguns posts sobre include mas não sanaram minhas dúvidas.

Gostaria de uma página principal que inicializasse no Conteúdo com uma página home.jsp, caso eu selecione algum link, esta deve trocar o include da home.jsp, em Conteúdo, pela página que eu solicitei.

Espero ter ficado claro. Qualquer coisa perguntem.

22 Respostas

R

Boa Tarde,

Vc pode usar o a4j do JSF para isso (no caso usaria o include do a4j e esse include apontaria para uma url dinâmica informada por uma classe ou script auxiliar).
Com jquery também seria fácil utilizando a função load para carregar as páginas numa div ou algo parecido.

T+.

S

use o Facelets que vem com o JSF 2.0 se não for 2.0 usa o FACELETS separadamente.

Abraço

R

Então, precisava de ajuda mais com o código. Estou fazendo algo assim. Mas não consigo atualizar a próxima página. Eu criei um link de teste mas não funciona.

JSP
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link rel="stylesheet" type="text/css" href="css/padrao.css" />
<title>Richfaces</title>
</head>
<body>
<f:view>

	<h:form id="formIndex">
		<center><h:panelGrid cellspacing="0" cellpadding="0"
			styleClass="gridPrincipal" columns="3">

			<a4j:include id="ajaxMenu"
				viewId="#{navigationHandler.navigationBean.currentPage}" />

		</h:panelGrid></center>
	</h:form>

</f:view>
</body>
</html>
Bean
package br.com.navigation.bean;

public class NavigationBean {
	
	private String currentPage = "menu.jsp";

	public String getCurrentPage() {
		return currentPage;
	}

	public void setCurrentPage(String currentPage) {
		this.currentPage = currentPage;
	}

}
Handler
package br.com.navigation.handler;

import br.com.navigation.bean.NavigationBean;

public class NavigationHandler {
	
	private NavigationBean navigationBean = new NavigationBean();

	public NavigationBean getNavigationBean() {
		return navigationBean;
	}

	public void setNavigationBean(NavigationBean navigationBean) {
		this.navigationBean = navigationBean;
	}

}
S

se não me engano dessa forma que você está facendo sem o uso do facelets, mais com o uso do richfaces você deve colocar o a4j:include dentro de um a4j:form faça um teste.

R

Não foi amigo. Tem algum problema de colocar form dentro de form?

Esse é o código como que está ficando. Mas ainda não vai.

Index - Essa página inclui as outras. Ela nunca muda.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%>
<%@taglib uri="http://java.sun.com/jstl/core" prefix="c"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link rel="stylesheet" type="text/css" href="css/padrao.css" />
<title>Include</title>
</head>
<body>
<f:view>
	<h:form id="formIndex"><center>
	
		<h:panelGrid cellspacing="0" cellpadding="0"
			styleClass="gridPrincipal" columns="3">

			<h:panelGrid cellspacing="0" cellpadding="0" styleClass="gridInterna"
				columns="1">
				<h:panelGroup>
					<h:outputLabel value="Essa é a currentPage: " />
					<h:outputLabel id="currentPage"
						value="#{navigationHandler.navigationBean.currentPage}"></h:outputLabel>
				</h:panelGroup>
			</h:panelGrid>

		</h:panelGrid>
	
		<h:panelGrid cellspacing="0" cellpadding="0"
			styleClass="gridPrincipal" columns="3">

			<c:import url="menu.jsp" />

		</h:panelGrid>
		
		<h:panelGrid cellspacing="0" cellpadding="0"
			styleClass="gridPrincipal" columns="3">

			<a4j:include id="ajaxHome"
				viewId="#{navigationHandler.navigationBean.currentPage }" />

		</h:panelGrid>
		
	</center></h:form>

</f:view>
</body>
</html>
Home - Existe uma página chamada Menu com o mesmo código que a Home (Só para testar, nomenclaturas é o de menos)
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%>

<a4j:form id="home">

	<h:panelGrid cellspacing="0" cellpadding="0"
		styleClass="gridSecundaria" columns="1">

		<h:panelGrid cellspacing="0" cellpadding="0" styleClass="gridExterna"
			columns="3">

			<h:panelGrid cellspacing="0" cellpadding="0" styleClass="gridInterna"
				columns="1">
					<h:outputLabel value="Essa é a Home!" />
			</h:panelGrid>

		</h:panelGrid>

		<h:panelGrid cellspacing="0" cellpadding="0" styleClass="gridExterna"
			columns="2">

			<h:panelGrid cellspacing="0" cellpadding="0" styleClass="gridInterna"
				columns="1">
				<h:commandLink immediate="true" id="iniciarHome"
					value="Mudar essa página para Home" action="#{navigationHandler.iniciarHome}">
				</h:commandLink>
			</h:panelGrid>
			
			<h:panelGrid cellspacing="0" cellpadding="0" styleClass="gridInterna"
				columns="1">
				<h:commandLink immediate="true" id="iniciarMenu"
					value="Mudar essa página para Menu" action="#{navigationHandler.iniciarMenu}">
				</h:commandLink>
			</h:panelGrid>

		</h:panelGrid>

	</h:panelGrid>

</a4j:form>
Método que retorna as páginas que quero
public String iniciarHome () {
		navigationBean.setCurrentPage("home.jsp");
		return "";
	}
S

tenta colocar no a4j:include ajaxRendered=“true”

S

tenta fazer o seguinte tambem …

<a4j:include viewId=“home.jsp”/>

R

Ainda não funcionou.

Será que tem que re-renderizar a página incluída?

Eu tentei com a tag abaixo e não rolou =/

<h:panelGrid cellspacing="0" cellpadding="0" styleClass="gridInterna" columns="1"> <h:commandLink immediate="true" id="iniciarHome" value="Mudar essa página para Home" action="#{navigationHandler.iniciarHome}"> <a4j:support reRender="ajaxHome" ajaxSingle="true" event="onclick"></a4j:support> </h:commandLink> </h:panelGrid>

S

cara você pode tentar entao colocar o a4j:include ajaxsingle=“true” no componente pra ver oque acontece. Era pra ter funcionado

R

Não rolou também.

Eu vi pela internet afora que não é possível re-renderizar uma página num include. É verdade?

S

rolderoak:
Olá javanianos,

Gostaria que me ajudassem com o seguinte:
Estou fazendo uma aplicação e preciso fazer include de páginas na minha página principal.

A minha página principal possui:

  • Menu Superior (sempre no topo)
  • Menu Lateral (sempre no topo e abaixo do menu)
  • Conteúdo (no centro, ao lado do Menu Lateral e expansível conforme o conteúdo)
  • Rodapé (sempre em bottom)

Me proporam colocar vários includes nas minhas páginas de Conteúdo cada um chamando o Menu Superior, Menu Lateral e Rodapé. Mas eu não queria fazer assim.

Eu recorri à alguns posts sobre include mas não sanaram minhas dúvidas.

Gostaria de uma página principal que inicializasse no Conteúdo com uma página home.jsp, caso eu selecione algum link, esta deve trocar o include da home.jsp, em Conteúdo, pela página que eu solicitei.

Espero ter ficado claro. Qualquer coisa perguntem.

É só o conteúdo da sua página que está mudando?
Que versão do JSF vc está usando?

R

Então, eu faço o include inicial, que está na minha variavel currentPage, que é inicialmente atribuido como home.jsp ou menu.jsp, indiferente. Depois quando eu clico em um link / botão qualquer, a variavel que é do include tem que mudar para outraPagina.jsp. Só que essa parte não funciona.
Estou usando JSF 1.2.

S

cara acho que você terá que usar o facelets para fazer isso mesmo… com ele eu tenho certeza que vc consegue atraves de um botao alterar a parte que vc quer tramquilamente. Você já uso ele ?

R

Ainda não!
Tipo, eu meio que consegui cmo jsp:include.
Mas ta com um erro bizarro. Ou é bug ou sei la.
Eu estou tentando fazer compativel com o IE, FF e Chrome.

No FF pega 100%.
O conteúdo vem inicialmente como Home e conforme eu clico em outros botões ele muda o conteúdo

No Chrome não funiona.

No IE funciona mas é bizarro.
Eu inicio na Home. Aí clico no Menu, blz, vai para o Menu. Eu clico na Home novamente e ele deixa a Home e o Menu.

R

Ahh o código ficou assim:

Index (onde há o conteúdo dinâmico)

<f:view>

	<center><h:panelGrid cellspacing="0" cellpadding="0"
		styleClass="gridPrincipal" columns="1">

		<h:panelGrid cellspacing="0" cellpadding="0"
			styleClass="gridSecundaria" columns="1">

			<h:panelGrid cellspacing="0" cellpadding="0" styleClass="gridExterna"
				columns="1">

				<h:panelGrid cellspacing="0" cellpadding="0"
					styleClass="gridInterna" columns="1">
					<h:panelGroup>
						<h:outputLabel value="Essa é a currentPage: " />
						<h:outputLabel id="currentPageName"
							value="#{navigationHandler.navigationBean.currentPage}"></h:outputLabel>
					</h:panelGroup>
				</h:panelGrid>

			</h:panelGrid>

		</h:panelGrid>

	</h:panelGrid> <h:panelGrid cellspacing="0" cellpadding="0"
		styleClass="gridPrincipal" columns="1">

		<f:subview id="currentPage">
			<jsp:include page="#{navigationHandler.navigationBean.currentPage}"></jsp:include>
		</f:subview>

	</h:panelGrid></center>

</f:view>

Home e Menu (a mesma coisa só muda IDs e outputslabel pra eu saber onde estou.

<h:form id="home">

	<h:panelGrid cellspacing="0" cellpadding="0"
		styleClass="gridSecundaria" columns="1">

		<h:panelGrid cellspacing="0" cellpadding="0" styleClass="gridExterna"
			columns="3">
			<h:panelGrid cellspacing="0" cellpadding="0" styleClass="gridInterna"
				columns="1">
				<h:outputLabel value="Essa é a Home!" />
			</h:panelGrid>
		</h:panelGrid>

		<h:panelGrid cellspacing="0" cellpadding="0" styleClass="gridExterna"
			columns="2">

			<h:panelGrid cellspacing="0" cellpadding="0" styleClass="gridInterna"
				columns="1">
				<h:commandButton id="iniciarHome" styleClass="botao"
					value="Home" onclick="submit();"
					actionListener="#{navigationHandler.iniciarHome}">
				</h:commandButton>
			</h:panelGrid>

			<h:panelGrid cellspacing="0" cellpadding="0" styleClass="gridInterna"
				columns="1">
				<h:commandButton id="iniciarMenu" styleClass="botao"
					value="Menu" onclick="submit();"
					actionListener="#{navigationHandler.iniciarMenu}">
				</h:commandButton>
			</h:panelGrid>

		</h:panelGrid>

	</h:panelGrid>
	
</h:form>
NavigationBean
public class NavigationBean {
	
	private String currentPage = "home.jsp";

	public String getCurrentPage() {
		return currentPage;
	}

	public void setCurrentPage(String currentPage) {
		this.currentPage = currentPage;
	}

}

NavigationHandler

import javax.faces.event.ActionEvent;

import br.com.navigation.bean.NavigationBean;

public class NavigationHandler {
	
	private NavigationBean navigationBean = new NavigationBean();

	public NavigationBean getNavigationBean() {
		return navigationBean;
	}

	public void setNavigationBean(NavigationBean navigationBean) {
		this.navigationBean = navigationBean;
	}
	
	public void iniciarHome(ActionEvent event) {
		navigationBean.setCurrentPage("home.jsp");
	}
	
	public void iniciarMenu(ActionEvent event) {
		navigationBean.setCurrentPage("menu.jsp");
	}

}

Se alguém conseguir resolver, ficarei muito grato.

E no IE apenas, dá esse erro no Console:

23/12/2010 10:36:23 com.sun.faces.lifecycle.LifecycleImpl phase
WARNING: executePhase(RENDER_RESPONSE 6,com.sun.faces.context.FacesContextImpl@186f3b3) threw exception
javax.faces.FacesException
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:135)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error
	at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:319)
	at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:288)
	at org.apache.catalina.connector.Response.flushBuffer(Response.java:548)
	at org.apache.catalina.connector.ResponseFacade.flushBuffer(ResponseFacade.java:279)
	at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:203)
	at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)
	at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
	... 15 more
Caused by: java.net.SocketException: Connection reset by peer: socket write error
	at java.net.SocketOutputStream.socketWrite0(Native Method)
	at java.net.SocketOutputStream.socketWrite(Unknown Source)
	at java.net.SocketOutputStream.write(Unknown Source)
	at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:741)
	at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:434)
	at org.apache.coyote.http11.InternalOutputBuffer.flush(InternalOutputBuffer.java:299)
	at org.apache.coyote.http11.Http11Processor.action(Http11Processor.java:976)
	at org.apache.coyote.Response.action(Response.java:183)
	at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:314)
	... 22 more
S

realmente cara … esses erros acontecem muito de navegador pra navegador, todos nos programadores temos esses problemas. Infelizmente eu não sei um solução para isso tambem…
Aqui nos sistema nos usamos muito o facelets ele é muito bom e tambem é 50 % mais rapido que as páginas .jsp, talvez você poderia fazer um teste mais tarde e ver se gosta.

mas qual foi a sua solução para o problema do include ?

S

cara tive um ideia meio tosca… veja se você entende:

<a4j:outputpanel rendered="#{NavigationBean.currentPage == “home.jsp”}">
sua página home
</a4j:outputpanel>

<a4j:outputpanel rendered="#{NavigationBean.currentPage == “index.jsp”}"">
sua página index
</a4j:outputpanel>

ou seja depenendo do seu resultado da seu metodo String ele apresenta um bloco, sei que é tosco mais…

R

surfzera:
realmente cara … esses erros acontecem muito de navegador pra navegador, todos nos programadores temos esses problemas. Infelizmente eu não sei um solução para isso tambem…
Aqui nos sistema nos usamos muito o facelets ele é muito bom e tambem é 50 % mais rapido que as páginas .jsp, talvez você poderia fazer um teste mais tarde e ver se gosta.

mas qual foi a sua solução para o problema do include ?

A solução foi não usar ajax, ele não re-renderiza. Nos últimos códigos que mandei ta funcionando blz no FF, mas não tem como deixar o IE de lado.

R

surfzera:
cara tive um ideia meio tosca… veja se você entende:

<a4j:outputpanel rendered="#{NavigationBean.currentPage == “home.jsp”}">
sua página home
</a4j:outputpanel>

<a4j:outputpanel rendered="#{NavigationBean.currentPage == “index.jsp”}"">
sua página index
</a4j:outputpanel>

ou seja depenendo do seu resultado da seu metodo String ele apresenta um bloco, sei que é tosco mais…

Interessante essa ideia, mas não rolou. A tag pensa que fechou aspas quando eu abri aspa em “home.jsp” e ele não reconhece.

S

desculpe coloque aspas simples ’ ’

R

Não rolou também.

Se liga, olha o que ta acontecendo. Só pra relembrar, não estou usando nada de ajax. E o CSS ficou até que bom, só o botão que não aplica no IE.

FF - Funcionando perfeitamente

Começa assim.
http://img130.imageshack.us/i/ff01u.jpg
Quando clico em Menu vai para esse.
http://img256.imageshack.us/i/ff02d.jpg

IE
Começa assim.
http://img573.imageshack.us/i/ie01.jpg
Quando clico em Menu vai para esse.
http://img189.imageshack.us/i/ie02.jpg
Quando clico pra voltar pra Home, depois de clicar no Menu caga de vez! Olha la embaixo, está duplicado.
http://img692.imageshack.us/i/ie03.jpg
Agora clico no Menu denovo e volta ao normal. Mas caga se eu clicar na Home.
http://img43.imageshack.us/i/ie04.jpg

Chrome - Não funciona nada!
http://img524.imageshack.us/i/cr01.jpg

R

Olha, deu certo aqui. Consegui implementar! Só falta implementar a sessão no projeto. Quem quizer baixar o arquivo pra dar um olhada está em anexo. Só não coloquei as libs. Para dar certo o include dinâmico, os pacotes tem que estar no padrão do projeto. O include é da seguinte forma:

Se você tiver um pacote:
br.com.principal.contato.handler.ContatoHandler

Você deve colocar a página nas pasta:
content/principal/contato.jsp

Quando for entrar em uma página você coloca o método do NavigationBean.
Ou seja, principal_contatoHandler.metodoDoNavigationBean e a página abre. Mas nunca sai da index.jsp.

O próprio método busca o endereco da sua página.

Criado 20 de dezembro de 2010
Ultima resposta 3 de jan. de 2011
Respostas 22
Participantes 4