a4j:commandbutton

7 respostas
Wolky

Bom dia pessoal, estou com um problema,
meu commandbutton não está renderizando como eu queria.
Tenho um botão logar, ao clicar nele manda um rerender na bean, e se estiver errado era para aparecer um painel, mas não está aparecendo, eu preciso da F5 na página ai sim aparece o painel, alguem pode ajuda, segue os codigos do faces-config e da página

faces-config
<?xml version="1.0" encoding="UTF-8"?>

<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
    version="1.2">
	
    <application>
		<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
	</application>
	
	<navigation-rule>
		<from-view-id>/pages/pedir-relatorio.xhtml</from-view-id>
		<navigation-case>
			<from-outcome>erro</from-outcome>
			<to-view-id>/pages/erro-preenchimento.jsf</to-view-id>
		</navigation-case>
	</navigation-rule>
	
	<managed-bean>
		<managed-bean-name>relatorio</managed-bean-name>
		<managed-bean-class>br.com.bean.relatorioBean</managed-bean-class>
		<managed-bean-scope>application</managed-bean-scope>
	</managed-bean>
	
	<managed-bean>
		<managed-bean-name>loginBackingBean</managed-bean-name>
		<managed-bean-class>br.com.backingBean.UsuarioBB</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>
	
	<converter> 
      <converter-id>relatorioConverter</converter-id> 
      <converter-class>br.com.relatorio.control.Converter</converter-class> 
	</converter> 
    
</faces-config>
login.xhtml
<?xml version="1.0" encoding="iso-8859-1"?>

<!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:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:c="http://java.sun.com/jsp/jstl/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:rich="http://richfaces.org/rich"
	xmlns:a4j="http://richfaces.org/a4j">

<ui:composition template="../template/template.xhtml">

	<ui:define name="titulo">Login</ui:define>

	<ui:define name="topo">
		<f:loadBundle var="msg" basename="br.com.bundle.messages" />
		<h:graphicImage
			url="#{pageContext.servletContext.contextPath}/images/LogoAttende.jpg" />
		<f:verbatim>
			<br />
		</f:verbatim>
		<h:outputText value="#{msg.pagina_login_titulo}"
			title="#{msg.pagina_login_titulo}" />
	</ui:define>

	<ui:define name="conteudo">
		<h:form>
		<a4j:keepAlive beanName="loginBackingBean" />
			<rich:panel styleClass="login" style="">
				<f:facet name="header">
					<h:outputText value="#{msg.pagina_login_header}" />
				</f:facet>
				<h:panelGrid columns="2">
					<h:outputText value="#{msg.pagina_login_usuario}" />
					<h:inputText value="#{loginBackingBean.usuario.login}" size="30"
						styleClass="camposLogin" />
					<h:outputText value="#{msg.pagina_login_senha}" />
					<h:inputSecret value="#{loginBackingBean.usuario.senha}" size="30"
						styleClass="camposLogin" />
				</h:panelGrid>
				
				<a4j:commandButton reRender="mensagemErro" action="#{loginBackingBean.efetuaLogin}"
					value="#{msg.pagina_login_botao_logar}"/>
			</rich:panel>
		</h:form>
		<a4j:status>
			<f:facet name="start">
				<h:graphicImage value="#{pageContext.servletContext.contextPath}/images/carregando.gif" />
			</f:facet>
		</a4j:status>
		
		<rich:panel id="mensagemErro" rendered="#{loginBackingBean.msgErro}"
			styleClass="msgErro">
			<h:panelGrid columns="2">
				<h:graphicImage value="#{pageContext.servletContext.contextPath}/images/loginErro.png" />
				<h:outputText value="#{msg.pagina_login_incorreto}" />
			</h:panelGrid>
		</rich:panel>
	</ui:define>

</ui:composition>
</html>
e a parte do codigo efetuaLogin:
public String efetuaLogin() throws IOException {
		BuscarUsuario login = new BuscarUsuario();
		this.usuario = login.buscaPorUsuario(this.usuario);
		if (this.usuario != null) {
			this.usuario.setLogado(true);
			//if (this.usuario.getLogin().equals("diego") && this.usuario.getSenha().equals("123")) {
			//	this.usuario.setLogado(true);
			//Utilitario.setHttpSessionObject("usuario", this.usuario);
			//facesContext = FacesContext.getCurrentInstance(); 
			request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
			HttpServletResponse rp = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
			//HttpServletRequest rq = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
			session = request.getSession(false);
			session.setAttribute("usuario", this.usuario);
			this.msgErro = false;
			rp.sendRedirect(request.getContextPath() + "/pages/pedir-relatorio.jsf");
		} else {
			this.msgErro = true;
			this.usuario = new Usuario();
		}
		return "login";
	}

7 Respostas

Flavio_machine

cara eu usanva antes o h:messages para isso , mas agora integrei o primefaces com meu projeto richfaces e uso as mensagens dele é muito bom vc nao precisa ficar colocando ela no meio de outros códigos.

Flavio_machine

Ja tentou colocara o panel dentro do form ?

H

Olá, coloca dentro de um form como nosso amigo Flavio machine falou, e outra coisa, coloca dentro de um <a4j:outputPanel /> e de um reRender no outputPanel.

Wolky

Amigo, já fiz tudo que pediu, olha só

<h:form> <a4j:outputPanel id="mensagemErro" rendered="#{loginBackingBean.msgErro}"> <rich:panel styleClass="msgErro"> <h:panelGrid columns="2"> <h:graphicImage value="#{pageContext.servletContext.contextPath}/images/loginErro.png" /> <h:outputText value="#{msg.pagina_login_incorreto}" /> </h:panelGrid> </rich:panel> </a4j:outputPanel> </h:form> </ui:define>
já coloquei tudo com form em ajax, form em html, já mudei o escopo para request, deixei em session e nada.
Se eu tirar o commandbutton de ajax e por em html ele da certo, mas não da certo mais o a4j:status,
e estou com outro problema, as imagens da página de login não são mostradas enquanto não logo, se logo e peço para acessar login.jsf ta tudo la certinho
mas se eu pedir para acessar a página e for redirecionado para o login.jsf as imagens não aparecem… :shock:
alguém tem uma dica?

Ah, vou começa a dar uma olhada no primefaces

Wolky

Pessoal, retirei o a4j:status
voltei o commandbutton para "h", agora está funcionando corretamente, mas sem a figura de carregando ( :cry: )
Mas o que não entendo mesmo é o seguinte:

Toda vez que eu peço para acessar localhost:8080/Relatorio (usando tomcat) abre minha página de login sem as imagens, tudo ok menos as figuras, até o local da imagens estão lá, vou no código fonte das imagens e no lugar do "x" que era para estar a imagem aparece o local: localhost:8080/Relatorio/images/loginErro.png ou
<img src="/Relatorio/images/loginErro.png">
e tenho a imagem "loginErro.png" dentro da pasta images do meu Web-inf. Eu então logo e vai para o meu index, já logado eu peço para acessar localhost:8080/Relatio/pages/login.jsf abre a página com tudo correto, todas as imagens lá, e no código fonte da página, no mesmo lugar onde não mostrava a imagem e agora mostra, está o caminho: localhost:8080/Relatorio/images/loginErro.png Já tentei de tudo, por o pagecontext, o facescontext, tirar isso e só deixar o caminho images/loginErro.png, mas nada da certo, um amigo meu me falou que podia ser erro com o tomcat e tentasse com o glassfish, fiquei ontem migrando para netbeans + glassfish, mas está dando um erro lá e desisti, alguém tem alguma idéia do que possa ser? Para exibir a imagem no xhtml estou usando:
<h:graphicImage value="#{pageContext.servletContext.contextPath}/images/loginErro.png" />
um outro detalhe, as vezes quando vou no IExplorer e peço código fonte da imagem, as vezes e só as vezes, aparece o caminho da imagem como: localhost:8080/Relatorio/images/loginErro.png;sessionid1298329, ou algo do tipo, não lembro bem o que aparecia depois do ";" Estou usando um Filter para redirecionar para o login.jsf :
package br.com.filter;

import br.com.bean.Usuario;
import java.io.IOException;
import java.util.logging.LogRecord;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SecFilter implements Filter {
	
	// Pagina de login

	public void init(FilterConfig filterConfig) throws ServletException {
	}

	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		HttpServletResponse response = (HttpServletResponse) res;
		HttpServletRequest request = (HttpServletRequest) req;
				
		if (!this.authorize((HttpServletRequest) req) && !request.getRequestURL().toString().contains("login.jsf")) {
			   response.sendRedirect(request.getContextPath() + "/pages/login.jsf");
			  } else {
                 response.setHeader("Cache-Control", "no-store"); 
                 response.setHeader("Pragma", "no-cache"); 
                 response.setDateHeader("Expires", 0);
			   try {
			    chain.doFilter(req, res);
			   } catch (Exception e) {
			    e.printStackTrace();
			    //response.sendRedirect(request.getContextPath() + "/erro.jsf");
			   }
			  }

	}

	public void destroy() {
	}

	// Metodo que verifica o bean em sessao se esta logado.

	private boolean authorize(HttpServletRequest req) {
		boolean retorno = false;
		HttpSession session = req.getSession(true);
		if (session != null) {
			Usuario usuario = (Usuario) session.getAttribute("usuario");
			if ((usuario != null) && (usuario.getLogado() == true)) {
				retorno = true;
			}
		}
		return retorno;
	}

	public boolean isLoggable(LogRecord record) {
		throw new UnsupportedOperationException("Not supported yet.");
	}
}
H

Olá, a imagem não está sendo carregada porque o seu filter está bloqueando a requisição impedindo o acesso a imagem.
Você pode configurar no seu web.xml para filtrar apenas as requisições .jsf.

Espero ter ajudado.

Wolky

henriquejhc:
Olá, a imagem não está sendo carregada porque o seu filter está bloqueando a requisição impedindo o acesso a imagem.
Você pode configurar no seu web.xml para filtrar apenas as requisições .jsf.

Espero ter ajudado.

Amigo, deu certo aqui, brigadão xD

Criado 11 de outubro de 2010
Ultima resposta 19 de out. de 2010
Respostas 7
Participantes 3