[RESOLVIDO]JSF + Applet: Garantir recarga do applet ao navegar da página do applet para ela própria

4 respostas
Mantu

Olá pessoal!

Tenho uma página jsf que contém um applet que lê um xml e faz o que tem que fazer. Para criar esse xml dinamicamente, há uma url para um servlet, o qual gera e grava no output stream do response o bendito xml.

Dentro do applet, há alguns desenhos com links que acessam o tal servlet e que transformam a aparencia do que é exibido pelo applet.

Nesta página há também um menu comum a todas as páginas (não pertencente ao applet), e um dos itens deste menu leva o usuário à página deste applet.

O usuário acessa a página, brinca com o applet e resolve então voltar o applet ao estado inicial. Ele então clica no item de menu mencionado acima.

Problema: O usuário percebe que a página é recarregada, porém o applet não! Ele mantém a aparência anterior ao clique no item do menu.
Debugando, notei que o servlet que monta o xml não é executado quando você navega desta página para ela mesma. Para recarregar, eu preciso sair para uma outra página e voltar para aquela do applet.

A seguir, o fonte da página e explicações mais detalhadas:

Fonte do conteúdo da página:
<?xml version="1.0" encoding="UTF-8"?>

<ui:composition template="/templates/page.jspx"
	xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:jsp="http://java.sun.com/JSP/Page"
	xmlns:ice="http://www.icesoft.com/icefaces/component">

	<ui:define name="content">
		<ui:decorate template="/templates/panel.jspx">
			<ui:define name="panelContent">
				<ice:form>
						<applet id="hg" class="sitemap"
							code="a.b.c.Applet"
							name="testApplet" archive="myApplet.jar"
							codebase="localhost:8080/ctx/resources/applet/"
							width="98%" height="460" align="middle">
							<param name="url" value="localhost:8080/ctx/XMLServlet?f=yes" />
							<param name="properties" value="localhost:8080/ctx/resources/applet/myApplet.props" />
						</applet>
		
				</ice:form>
			</ui:define>
		</ui:decorate>
	</ui:define>
</ui:composition>
Fonte do menu:
<?xml version="1.0" encoding="UTF-8"?>

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ice="http://www.icesoft.com/icefaces/component">

<div>

	<ice:form>

	<div style="color: white; padding: 1px; height: 20px; margin-left: 30px; margin-top: -5px;">
		<ice:commandLink value="#{ui['menu.projeto.explorar']}" action="elemento.explorar" actionListener="#{elementoBean.iniciarPagina}"/>
	</div>
	
	<div style="color: white; padding: 1px; height: 20px; ">
		<ice:commandLink value="#{ui['menu.projeto.funcional']}" action="funcional.explorar" actionListener="#{funcionalBean.iniciarPagina}"/>
	</div>
	
	<div style="color: white; padding: 1px; height: 20px; margin-left: 40px; margin-top: -15px"></div>
		<ice:commandLink value="#{ui['menu.projeto.carga']}" onclick="alert('Carga on-line não está disponível nesta versão'); return false;"/>
	</ice:form>

</div>

</ui:composition>
O item do menu em questão é o link de action funcional.explorar.

XMLServlet é o servlet que gera e grava o xml utilizado pelo applet no response.

Quando o usuário está em uma página diferente da postada acima, e clica no menu funcional.explorar, o método service(HttpServletRequest, HttpServletResponse) do XMLServlet é executado.
Agora, se o usuário já está na página em questão e clica no menu funcional.explorar, a página é recarregada (O actionListener do menu é executado), porém o o método service(HttpServletRequest, HttpServletResponse) do XMLServlet não é executado. Go figure...

Obrigado no mínimo pela paciência de ter chegado até aqui... :lol:

4 Respostas

sr.sucesso

Verifique se a URL que é passada no param é a mesma que está entrando no applet. Talvez o applet esteja recebendo pela JVM do browser a URL antiga.

Trabalhar com JSF e Applets é algo de difícil a impossível… o que você fez para conseguir essa magia?

:roll:

ViniGodoy

Ele ainda vive! :-o

Fernando_H_Gomes

não tem como voce chamar uma função ajax que chame o servlet e faça a re-renderização do applet?

Mantu

Soterrado no trabalho, mas ainda respirando, kkkk :lol:

De fato, o que o sr.sucesso falou acima se verifica.
A solução que ele me sugeriu funcionou: “Enganar” o browser para que ele penseque, cada vez que a página é carregada, seu fonte está diferente, forçando que ele recarrege a página e, consequentemente, execute o servlet amarrado no applet .

Para isso, um pequeno pog dentro da tag do applet bastou:

&lt;param name="dummy" value="#{someBean.time}" /&gt;

É um parâmetro que eu não uso para nada e que recebe do método getTime() da classe SomeBean um new Date().getTime(). Isso só pra garantir que sempre que a página seja recarregada, o browser não utilize nenhum tipo de “cache”.

Thanks sr.sucesso.

Criado 17 de março de 2010
Ultima resposta 18 de mar. de 2010
Respostas 4
Participantes 4