Jsf 2.0

36 respostas
ddark.emanu

Estou com problema na navegação do JSF 2.0 , tenho um botão na pagina e chamo no action outra página, mas ele atualiza a pagina atual, alguém sabe o que pode ser ?

Tentativas

<h:commandLink value="Aprovar/Rejeitar" action="editSolicitacao" /> 

<h:commandLink value="Aprovar/Rejeitar" action="/editSolicitacao" /> 

<h:commandLink value="Aprovar/Rejeitar" action="editSolicitacao?faces-redirect=true" />

<h:commandLink value="Aprovar/Rejeitar" action="editSolicitacao.xhtml?faces-redirect=true" />

<h:commandLink value="Aprovar/Rejeitar" action="/editSolicitacao?faces-redirect=true" />

<h:commandLink value="Aprovar/Rejeitar" action="pages/editSolicitacao?faces-redirect=true" />

Estrutura

  • web
    - pages
    – editSolicitacao.xhtml ( destino)
    – solicitacoes.xhtml (atual)
    • login.xhtml

36 Respostas

H

Tenta assim:

&lt;h:commandLink value="Aprovar/Rejeitar" action="/pages/editSolicitacao.xhtml" /&gt;

Espero ter ajudado.

ddark.emanu

valeu , mais também ja tentei assim :stuck_out_tongue:

tyemy

[color=white].[/color]

ddark.emanu

Também não …

A

henriquejhc:
Tenta assim:

&lt;h:commandLink value="Aprovar/Rejeitar" action="/pages/editSolicitacao.xhtml" /&gt;

Espero ter ajudado.

1 - Pelo que eu tenho visto, o pessoal tem colocado .xhtml diretamente na raiz de WebContent,
você já conseguiu fazer funcionar dentro de alguma subpasta?

----------- // -------------
2 - E se você mapeasse no faces-config.xml o sinal editSolicitacao direcionando para a página .xhtml;

A
ddark.emanu:
Estou com problema na navegação do JSF 2.0 , tenho um botão na pagina e chamo no action outra página, mas ele atualiza a pagina atual, alguém sabe o que pode ser ? Tentativas
<h:commandLink value="Aprovar/Rejeitar" action="editSolicitacao" /> 

<h:commandLink value="Aprovar/Rejeitar" action="/editSolicitacao" /> 

<h:commandLink value="Aprovar/Rejeitar" action="editSolicitacao?faces-redirect=true" />

<h:commandLink value="Aprovar/Rejeitar" action="editSolicitacao.xhtml?faces-redirect=true" />

<h:commandLink value="Aprovar/Rejeitar" action="/editSolicitacao?faces-redirect=true" />

<h:commandLink value="Aprovar/Rejeitar" action="pages/editSolicitacao?faces-redirect=true" />

Estrutura

- web
- pages
-- editSolicitacao.xhtml ( destino)
-- solicitacoes.xhtml (atual)
- login.xhtml

<h:commandLink value="Aprovar/Rejeitar" action="editSolicitacao" /> 

 -- editSolicitacao.xhtml ( destino)
Deveria funcionar...

Só não está funcionando com esta página em específico ou no projeto inteiro?

ddark.emanu

Só funciona o mapeamento do login para index, não consigo fazer mas nenhuma navegação entre páginas

G

-> web.xml

<context-param>
	<param-name>javax.faces.CONFIG_FILES</param-name>
	<param-value>
		/WEB-INF/faces-config.xml
	</param-value>
</context-param>

-> faces-config.xml

<navigation-rule>
	<navigation-case>
		<from-outcome>editSolicitacao</from-outcome>
		<to-view-id>endereco_do_arquivo.jsf</to-view-id> <!-- .jsf ou .faces ou o que você definiu no seu servlet mapping -->
	</navigation-case>
</navigation-rule>
<h:commandLink value="Aprovar/Rejeitar" action="editSolicitacao" />

eu uso a navegação assim, sempre funciona.
da uma olhada nesses links:
http://www.devmedia.com.br/post-6366-Navegacao-estatica-e-dinamica-com-JSF-Parte-I.html
http://www.devmedia.com.br/post-6377-Navegacao-Estatica-e-Dinamica-com-JSF-Parte-II.html

espero que possa ser de alguma ajuda.

ddark.emanu

Eu uso assim no JSF 1.2, mais gostaria de aprender um pouco mais do JSF 2.0 e fazer sem o arquivo de configuração faces-config

ddark.emanu

Pode ser alguma configuração no web.xml ?

<web-app version="3.0" 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-app_3_0.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
<servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>

....
G

no meu arquivo faces-config.xml eu tenho a definição de versão que uso:

... xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd ...

verifique se a action possui o mesmo nome da página, lembrando do case sensitive …
se as libs do jsf2 no teu projeto não estão sendo sobre-postas pelas libs do servidor de aplicação web

ddark.emanu

as paginas já conferi estão corretas , a questão das libs , foram criadas pelo netbeans 7 , pode acontecer isso ?

A

Seu index é .xhtml?

ddark.emanu

Sim , isso é um problema ?

A

Não isso não é um problema não. Como foi feito no login?

ddark.emanu
private static final String PAGE_INICIAL = "faces/pages/index?faces-redirect=true";

public String logar() {

...

return PAGE_INICIAL ;
}
ddark.emanu

Encontrei o problema :

<p:dataTable id="table" value="#{solicitacaoController.solicitacoes}" var="s">
             <p:column>
                  <f:facet name="header">  
                    Opções
                </f:facet>  
                 <h:commandLink value="Aprovar/Rejeitar" action="editar" immediate="true" />
            </p:column>
</p:dataTable>

Alguém sabe me dizer porque não funciona dentro do dataTable ?

A

Uma questão:

Você tinha colocado tudo dentro de um form?

ddark.emanu

Sim , ta tudo dentro do form , coloque o button fora do data Table funcionou normalmente , é alguma coisa do data table do Primefaces ?

ddark.emanu
<?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:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <h:head>
        <title>Listagem de Solicitação de Produto</title>
    </h:head>
    
    <h:form>
        <p:commandButton action="#{solicitacaoController.buscar}" value="Pesquisar" update="table"/>
        <p:commandButton action="index" value="Voltar" immediate="true" ajax="false"/>    // FUNCIONA
        <br />
        <br />
        
          <p:dataTable id="table" value="#{solicitacaoController.solicitacoes}" var="s">           
             <p:column>
                  <f:facet name="header">  
                    Opções
                </f:facet>  
                 <p:commandButton action="index" value="Voltar" immediate="true" ajax="false"/>  // NÃO FUNCIONA
            </p:column>
              
          </p:dataTable>    
    </h:form>
    
</html>

Alguém sabe me dizer porque ?

G

eu uso dentro da datatable um commandlink

<p:commandLink ajax="false" action="#{areaCtrl.abrirSubArea}" title="#{messageSource.sistema_view_subArea}" rendered="#{areaCtrl.security_areaListar_cadastrar}">
	<p:graphicImage url="#{KCUtils.url}/images/table/icon_Tramite.png" />
	<f:setPropertyActionListener value="#{area}" target="#{areaCtrl.bean}" />
</p:commandLink>

experimenta tirar o immediate=“true”

ddark.emanu

também não , você fez alguma configuração na datatable ?

G

não.
você tentou usar command link ao invés de commandbuttom?

ddark.emanu

Sim , tentei os 2 … com o action recebendo um metodo e tambem recebendo a pagina direto , também não funcionou

V

Estou usando aki JSF 2.0 e faço os meus links assim:

<h:commandLink value="Teste" action="sistema/MenuPrincipal?faces-redirect=true" />

O link está dentro da página index.xhtml e a estrutura é assim:
->WebContent
—index.xhtml
—>Sistema
----MenuPrincipal.xhtml

Testei aqui e deu certo!

ddark.emanu

O commandlink funcionou no meu projeto , apenas não funciona quando mando dados para minah p:dataTable

G

qual a sua necessidade de ter este botao dentro de um p:datatable?

eu uso da seguinte forma:

<p:dataTable id="lazyDataModel" var="area" value="#{areaCtrl.lazyDataModel}" 
	dynamic="true" rows="#{KCUtils.pageSize}" paginator="true" lazy="true" 
	loadingMessage="#{messageSource.paginador_carregando}"
	emptyMessage="#{messageSource.paginador_sem_registro}"
	paginatorPosition="bottom" pageLinks="5" scrollable="false"
	paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"
	rowStyleClass="#{empty rowIx or rowIx mod 2 ne 0 ? 'even-row' : 'odd-row'}"
	rowIndexVar="rowIx">
						 
	<p:column headerText="#{messageSource.sistema_acoes}" styleClass="colunaAcao">
		<p:commandLink ajax="false" action="#{areaCtrl.abrirSubArea}" title="#{messageSource.sistema_view_subArea}">
			<p:graphicImage url="#{KCUtils.url}/images/table/icon_Tramite.png" />
			<f:setPropertyActionListener value="#{area}" target="#{areaCtrl.bean}" />
		</p:commandLink>
		<p:spacer width="5"/>
		<p:commandLink type="image" async="true" oncomplete="modalDel.show();" title="#{messageSource.sistema_delete}">
			<p:graphicImage url="#{KCUtils.url}/images/table/icon_Delete.png"/>
			<f:setPropertyActionListener value="#{area}" target="#{deleteCtrl.bean}" />
		</p:commandLink>
	</p:column>
								
	<p:column headerText="#{messageSource.entity_area_nmArea}" sortBy="#{area.nmArea}">
		<h:outputText value="#{area.nmArea}"/>
	</p:column>
	<p:column headerText="#{messageSource.sistema_entity_sigla}" styleClass="colunaSigla" sortBy="#{area.nmSigla}">
		<h:outputText value="#{area.nmSigla}"/>
	</p:column>
	<p:column headerText="#{messageSource.sistema_entity_situacao}" style="width:100px !important; text-align:center;" sortBy="#{area.flAtivo}">
		<h:outputText value="#{area.flAtivoString}" />
	</p:column>
	<f:facet name="footer">
		<h:outputText value="#{messageSource.sistema_total}: #{areaCtrl.lazyDataModel.rowCount}" />
	</f:facet>
</p:dataTable>

o redirecionamento funciona certinho, é chamado o método abrirSubArea adicionado parametros e retorna a string da action corretamente.
não estou conseguindo visualizar o problema no seu datatable =/

ddark.emanu

A necessidade seria editar um objeto da lista , também não consigo achar o problema … teoricamente teria que abrir a outra página

meu código real é :

view

<?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:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    
    <h:head>
        <title>Listagem de Solicitação de Produto</title>
    </h:head>
    
    <h:form>
        <p:commandButton action="#{solicitacaoController.buscar}" value="Pesquisar" update="table" />
        <p:commandButton action="index" value="Voltar" immediate="true" ajax="false"/>
        <br />
        <br />
        
          <h:dataTable id="table" value="#{solicitacaoController.solicitacoes}" var="s">
            <h:column>
                 <f:facet name="header">  
                    Solicitante 
                </f:facet>  
                <h:outputText value="#{s.solicitante}" />
            </h:column>
            
            <h:column>
                 <f:facet name="header">  
                    Código do Produto
                </f:facet>  
                <h:outputText value="#{s.produto}" />
            </p:column>  
              
            <h:column>
                 <f:facet name="header">  
                    Nome do Produto
                </f:facet>  
                <h:outputText value="#{s.produtoNome}" />
            </h:column>
              
            <h:column>
                 <f:facet name="header">  
                    Status da Solicitação
                </f:facet>  
                <h:outputText value="#{s.status}" />
            </h:column>
              
               <p:column>
                 <f:facet name="header">  
                    Opções
                </f:facet>  
                   <h:commandLink value="Aprovar/Rejeitar" action="#{solicitacaoController.editar}" >  
                        <f:setPropertyActionListener value="#{solicitacao}" target="#{solicitacaoController.solicitacao}" />  
                   </h:commandLink>  
            </h:column>
              
          </p:dataTable>    
    </h:form>
    
</html>

Controller

@ManagedBean(name="solicitacaoController")
@RequestScoped
public class SolicitacaoController {
    
    private Solicitacao solicitacao;
    private List<Solicitacao> solicitacoes;

public String editar(){
        
       solicitacao = new Solicitacao();
        
        return "alterarSolicitacao";
        
    }
ddark.emanu

O Problema está no update=“table” no botão Pesquisa , retirado ele funciona normalmente

G

eu faço isso através de modal (p:dialog no primefaces)

vide exemplo:

Listagem:

<p:dataTable id="lazyDataModel" var="area" value="#{areaCtrl.lazyDataModel}" 
	 dynamic="true" rows="#{KCUtils.pageSize}" paginator="true" lazy="true" 
	 loadingMessage="#{messageSource.paginador_carregando}"
	 emptyMessage="#{messageSource.paginador_sem_registro}"
	 paginatorPosition="bottom" pageLinks="5" scrollable="false"
	 paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"
	 rowStyleClass="#{empty rowIx or rowIx mod 2 ne 0 ? 'even-row' : 'odd-row'}"  rowIndexVar="rowIx">
						 
	<p:column headerText="#{messageSource.sistema_acoes}" styleClass="colunaAcao">
		<p:commandLink type="image" update="editTable" async="true" oncomplete="modalEdit.show();" title="#{messageSource.sistema_edit}">
			<p:graphicImage url="#{KCUtils.url}/images/table/icon_Edit.png"/>
			<f:setPropertyActionListener value="#{area}" target="#{areaCtrl.bean}" />
		</p:commandLink> 
		<p:spacer width="5"/>
                <!-- abre uma outra página -->
		<p:commandLink ajax="false" action="#{areaCtrl.abrirSubArea}" title="#{messageSource.sistema_view_subArea}">
			<p:graphicImage url="#{KCUtils.url}/images/table/icon_Tramite.png" />
			<f:setPropertyActionListener value="#{area}" target="#{areaCtrl.bean}" />
		</p:commandLink>
....

modal:

<p:dialog widgetVar="modalEdit" header="#{messageSource.tituloCadastrar_area}" resizable="true" position="center" modal="true" width="500" minWidth="500">
	<h:form prependId="false">
		<p:toolbar>
			<p:toolbarGroup align="left">
			        <p:commandButton ajax="true" type="push" actionListener="#{areaCtrl.save}" value="Salvar " update="editTable" oncomplete="modalEdit.hide();"/>
			        <p:commandButton ajax="true" type="push" value="Cancelar" image="icon-cancel" oncomplete="modalEdit.hide();"/>
			</p:toolbarGroup>
		</p:toolbar>
		<p:panel id="editTable">
			<p:messages showSummary="true" showDetail="true" />
				
			<h:panelGrid columns="2" columnClasses="label,value" styleClass="panelGrid100Perc">
				<h:outputLabel value="#{messageSource.sistema_caracter_campo_obrigatorio} #{messageSource.entity_area_nmArea}:" />
				<p:inputText value="#{areaCtrl.bean.nmArea}" maxlength="150" styleClass="inputTextMaxSize"/>
					
				<h:outputLabel value="#{messageSource.sistema_caracter_campo_obrigatorio} #{messageSource.sistema_entity_situacao}:" />
		                <h:selectOneRadio value="#{areaCtrl.bean.flAtivo}" >
					<f:selectItem itemLabel="#{messageSource.sistema_ativo}" itemValue="true"/>
					<f:selectItem itemLabel="#{messageSource.sistema_inativo}" itemValue="false"/>
				</h:selectOneRadio>
			</h:panelGrid>
		</p:panel>
	</h:form>
</p:dialog>

ManagedBean

public void setBean(AreaDto bean)
{
	this.bean = bean;
}

public void save(ActionEvent actionEvent)
    {
        try
        {
            //salvar;
            //add FacesMessage salvo com sucesso
        }
        catch(Exception e)
        {
            //add FacesMessage erro ao salvar
        }
    }

eu não abro outra página para editar os arquivos, edito em modais (p:dialog)
mesmo no caso de fazer um redirecionamento para uma outra página dentro do modal eu não vejo problemas

ddark.emanu

eu vi para fazer dessa maneira, mais o formulário é muito grande para abrir um modal , ai acho melhor abrir em outra pagina mesmo … agora vou ver se acho uma forma de atualizar o componente se usar o update.

G

tenta com o remotecommand do primefaces …

http://www.primefaces.org/showcase/ui/remoteCommand.jsf

ddark.emanu

Resolvi de uma maneira que não é a solução que eu gostaria.

Retirei o botão Pesquisar

<h:commandButton action="#{solicitacaoController.buscar}" value="Pesquisar"/>

E no método construtor fiz a lista de Solicitações receber o resultado da busca

solicitacoes = buscar();

Assim Fiquei com uma dúvida referente a JSF

Quando eu atualizo uma table , seja por ajax ou renderizando a pagina (através de métodos) , os actions dos componentes que chamam outra página não funcionam , alguém sabe porque ?

por exemplo :

<h:commandButton id="buscar" action="#{solicitacaoController.buscar}" value="Pesquisar">
          <f:ajax render = "table" execute ="buscar" />
</h:commandButton 

<h:dataTable id="table" value="#{solicitacaoController.solicitacoes}" var="s">
     <h:column>
              <h:commandLink value="Aprovar" action="editarSolicitacao" />
      </h:column>
</h:dataTable>

O botão pesquisar funciona normalmente , mais quando vou apertar o aprovar ele volta para a página, sem os registros da dataTable

ou

view

<h:commandButton id="buscar" action="#{solicitacaoController.buscar}" value="Pesquisar" /> 

<h:dataTable id="table" value="#{solicitacaoController.solicitacoes}" var="s">
     <h:column>
              <h:commandLink value="Aprovar" action="editarSolicitacao" />
      </h:column>
</h:dataTable>

Controller

public String buscar(){

       return "editarSolicitacao";

}

mesma coisa, o botão pesquisar funciona normalmente , mais quando vou apertar o aprovar ele volta para a página, sem os registros da dataTable

G

tas usando qual escopo nos teus controllers?
Request / Session / View ?

ddark.emanu

Uso Request

G

o problema pode ser esse
Request: cria um controller pra cada requisição
Session: cria um controller pra sessão
View: cria um controller que tem vida útil enquanto existir referência a ele na janela.

eu costumo usar ViewScope em 99% dos meus controllers, salvo alguns controllers genéricos que eu uso session

aqui tem uma das implementações mais comuns disponibilizadas nas internet:
http://www.jroller.com/RickHigh/entry/adding_a_jsf_view_scope
tenta implementar e ve no que dá

Criado 12 de julho de 2011
Ultima resposta 13 de jul. de 2011
Respostas 36
Participantes 6