Arquivo para categoria JSF

Problema e solução com o adf uncommittedDataWarning, autoSubmit e partialSubmit

No ADF existe uma funcionalidade muito interessante para verificação do formulário de dados caso o usuário clique em algum link que saia da página. Porém está funcionalidade detém uma anomalia quando utilizada com componentes que usufluem do autoSubmit ou partialSubmit. Esta anomalia teoricamente não deveria acontecer pois todos os dados ainda não foram submetidos para finalizar o formulário, mas na prática está correto pois quando o ADF submete esses dados na requisição do autoSubmit o estado do managed bean e dos campos das páginas estão iguais, assim ele entende que o formulário não está mais na situação “DIRTY”. Leia o resto deste post »

, , , ,

Deixe um comentário

Abas com tamanho dinâmico af:panelTabbed

Há algum tempo procurava uma solução com css para o caso das abas com tamanho dinâmico no adf 11g no componente af:panelTabbed.
Porém não me atentei a um atributo do componente af:panelTabbed chamado DimensionsFrom este atributo tem três opções: auto, disclosedChild e parent. E a opção disclosedChild foi a que me surpreendeu por fez o que eu estava tentando fazer com o css. Que era para cada aba ter o tamanho do seu conteúdo.
Fica a dica

, , , ,

Deixe um comentário

Insert complexo com relacionamento no ADF BC 11g

Olá a todos, este post surgiu de uma necessidade minha para uma inserção em mais de uma tabela, existem outras formas de fazer. Agradeço ao meu amigo Caio Gallo por ter me explicado como realizar esse tipo de inserção. O meu exemplo vai ser uma inserção por relacionamento, algo extremamente simples como Autor e seus livros, imagine se você quisesse inserir o autor do livro pelo relacionamento do livro com o autor.
Bom vamos começar com a parte que interessa, primeiramente crie um projeto FusionDeveloper  no JDevelper veja a estrutura:

Após isso vamos criar nosso Application Module e o EO’s e VO’s de nossa aplicação. Para isso clique com o botão direito no Model e depois em New. Na tela selecione Adf Busines Components e depois selecione Business Components from Tables

Clique em ok. Depois selecione a conexão com o banco e clique em ok

Depois disso clique no botão query e selecione as duas tabelas, como na imagem abaixo

feito isso clique em Next, selecione as duas tabelas também para cria os Updatable View Objects das nossas tabelas, este lugar é onde vamos realizar nossas operações de inserts.

clique em Next novamente e crie os Read-Only View Objects como feito nos Updatable View Objects. Na próxima tela dê um nome para nosso Application Moduel.

clique em Next, se você quiser na próxima tela poderá pedir para o JDeveloper criar o diagram, clique em Next novamente e depois em Finsh.
Veja a estrutura do projeto como ficou até agora

Agora selecione o VO, LivroView clique em java, depois clique no lápis em Java Classes selecione

  • Generate View Objec Class e
  • Generate View Row Class

Após isso clique em ok.

no VO AutorView Faça a mesma coisa.

O próximo passo é criar a classe Java do AppModule, abra o AppModule vá em Java e em Java Classes clique no lápis,
e selecione o item Generate Application Module Class e clique em ok.
Outra coisa a se fazer no nosso application module é colocar o nossos VO para ser utilizados, para isso clique na opção Data Model, em Available View Objects selecione LivroView e AutorView e coloque no lado direito DataModel.

Por padrão quando criamos nossos VOs ele já adiciona no AppModule porém, se criarmos outro VO teremos que fazer isso da forma descrita acima.

Agora Abra o LivroViewImpl.java e crie um método no meu caso vou o método vai se chamar inserindoLivro. Vou colocar a inserção como HardCode mesmo só para o exemplo do post, veja o código como ficou.

Para executarmos o nosso exemplo vou fazer de forma bem simples apenas colocar um botão em uma página e fazer a chamada do método pelos bindings do ADF. Mais antes disso é preciso que possa aparecer nosso método na interface do binding. Para isso abra o LivroView vá em Java em Client Interface clique no lápis, aparecerá uma tela com o nosso método, selecione ele e clique na seta para direita e depois clique em ok, veja na imagem abaixo.

Pronto, Agora vamos na aba de Data Controls clicamos no refresh e nosso método aparecerá veja

Clique no inserindoLivro e arraste para a jsp. E selecione a opção de Adf Button.
Depois é só executar a aplicação e testar

Download do Código e Base

, , ,

2 Comentários

Desenvolvendo com ADF 11g e BPM parte 1

Nesta série irei abordar o densenvolvimento de uma aplicação utilizando o ADF BC, Faces, BPEL e também o BPM.

Nesta primeira parte vamos desenvolver um banco onde há ideia é ter um pedido feito por um cliente e feita a ativação do pedido ou não por um gerente pelo BPM, um exemplo simples só demonstramos o desenvolvimento.

Nesta primeira parte vamos desenvolver o diagrama da base e exportar isso para o banco Oracle XE pelo JDeveloper.

Leia o resto deste post »

1 comentário

Resolvendo o problema do immediate true no JSF

Este post trata-se de um “problema” que nos afeta quando precisamos do immediate=true e também precisamos capturar o valor de algum campo do formulário. Existe uma forma de obter o valor do componente desejado, que vou demonstrar.
Crie um projeto JSf . Depois crie uma página para e coloque um componente input com as opções required=true e faça um binding com o ManagedBean.
Inclua um botão coloque um ActionListener e a opção immediate=true.

nomeInput.processUpdates(FacesContext.getCurrentInstance());
System.out.println(“NOME “+nomeInput.getSubmittedValue());

nomeInput.setValue(nomeInput.getSubmittedValue());

o nomeInput.process(…), irá realizar a atualização do valor do componente, o getSubmittedValue irá pegar o valor que foi submetido
e assim temos o valor que foi digitado no campo. Abaixo o exemplo da implementação

download

até a próxima.

, ,

Deixe um comentário

Criando um componente de popup no jsf 2.0 com primefaces para confirmação

Em pouco tempo usando JSF 2.0 gostei muito de um recurso que já havia com o facelets que é a composição de componentes, ou seja com os componentes do JSF você pode construir um outro componente de forma declarativa e simples.
Irei demonstrar abaixo um exemplo de tela de confirmação que tenho botões sendo renderizado conforme os parâmetros do novo componente.
Começamos colocando a seguinte estrutura no WebContent
estrutura

A seguinte estrutura WebContent– resources – comps é obrigatória para organização dos componentes, comps foi um nome que eu dei onde ficaria os componentes porém pode ser outro nome e conter outras pastas com outros componentes também.
Vamos ver agora o conteúdo do componente de confirmacao.xhtml

<?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">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:cc="http://java.sun.com/jsf/composite"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.prime.com.tr/ui">

    <!-- INTERFACE -->
    <cc:interface>
        <cc:attribute name="mensagemDialog" required="true" />
        <cc:attribute name="widgetVar" required="true" />
        <cc:attribute name="simTitulo" required="true" />
        <cc:attribute name="naoTitulo" required="true" />
        <cc:attribute name="simUpdate" required="true" />
        <cc:attribute name="simOnClick" />
        <cc:attribute name="naoOnClick" />
        <cc:attribute name="naoUpdate" />
        <cc:attribute name="scriptOnComplete" />
        <cc:attribute name="simAction"
            method-signature="java.lang.String action()" />
        <cc:attribute name="naoAction"
            method-signature="java.lang.String action()" />
        <cc:attribute name="notAjaxSim" required="false" />
    </cc:interface>

    <!-- IMPLEMENTATION -->
    <cc:implementation>
        <p:confirmDialog modal="true" header="#{cc.attrs.mensagemDialog}"
            message="#{cc.attrs.mensagemDialog}"
            widgetVar="#{cc.attrs.widgetVar}">
            <h:panelGrid columns="2">
                <p:commandButton style="float:left" value="#{cc.attrs.simTitulo}"
                    action="#{cc.attrs.simAction}" update="#{cc.attrs.simUpdate}"
                    rendered="#{not empty cc.attrs.simUpdate}"
                    title="#{cc.attrs.simTitulo}"
                    oncomplete="#{cc.attrs.widgetVar}.hide();#{cc.attrs.scriptOnComplete}"
                    onclick="#{cc.attrs.simOnClick}" ajax="#{!cc.attrs.notAjaxSim}"/>
                <p:commandButton style="float:left" value="#{cc.attrs.simTitulo}"
                    action="#{cc.attrs.simAction}" title="#{cc.attrs.simTitulo}"
                    rendered="#{empty cc.attrs.simUpdate}"
                    onclick="#{cc.attrs.simOnClick}"
                    oncomplete="#{cc.attrs.widgetVar}.hide();#{cc.attrs.scriptOnComplete}" />
                <p:commandButton style="float:right" value="#{cc.attrs.naoTitulo}"
                    rendered="#{not empty cc.attrs.naoUpdate}"
                    title="#{cc.attrs.naoTitulo}" action="#{cc.attrs.naoAction}"
                    update="#{cc.attrs.naoUpdate}" onclick="#{cc.attrs.naoOnClick}"
                    oncomplete="#{cc.attrs.widgetVar}.hide();#{cc.attrs.scriptOnComplete}" />
                <p:commandButton style="float:right" value="#{cc.attrs.naoTitulo}"
                    rendered="#{empty cc.attrs.naoUpdate}"
                    onclick="#{cc.attrs.naoOnClick}" action="#{cc.attrs.naoAction}"
                    title="#{cc.attrs.naoTitulo}"
                    oncomplete="#{cc.attrs.widgetVar}.hide();#{cc.attrs.scriptOnComplete}" />
            </h:panelGrid>
        </p:confirmDialog>
    </cc:implementation>
</ui:composition>

Começamos a declarar nosso componente com <ui:composition> e suas referencias para podermos utilizar na implementação do componente.

Com o <cc:interface> declaramos os atributos que nosso componente terá para ser utilizado na implementação do componente neste lugar indicamos se o atributo será um método,bean ou requerido. No nosso componente teremos vários atributos mais não vou detelhar o que eles fazem porque não é o foco do post.

Na tag <cc:implementation> será o coração do nosso componente aqui, serão colocados os outros componentes que formaram o novo componente para utilizarmos em nossas páginas para o reaproveitamento de código.

Para referenciarmos nosso atributos declarados na interface usamos o #{cc.attrs}, assim conseguimos obter o valor dos atributos. É importante dizer também que os componentes são precedidos de um id gerado automaticamente pelo jsf, que nada mais é que o id do novo componente, mais é possivel também determinar como vai ser esse id.

Agora como utilizar este componente, primeiramente temos que declarar este componente no cabeçalho para utilizarmos veja como é simples:

xmlns:comps="http://java.sun.com/jsf/composite/comps"

Agora veja como declarar o componente para utilização;

<comps:confirmacao
                    mensagemDialog="#{mes['ged.cidades.municipio.msgSalva']}"
                    widgetVar="confirmCid" simTitulo="#{mes.sim}"
                    naoTitulo="#{mes.nao}" simAction="#{cidadeMBean.salvar}"
                    simUpdate="grow,fieldCidade" scriptOnComplete="popCidades.hide()" />

Neste caso que exemplifiquei de como declarar o componente não coloquei o id assim ele irá gerar automaticamente mas eu poderia ter colocado id=”confirma” para não ser gerado automaticamente.Veja a imagem dela sendo executada:

salvando cidade

Agora onde você for utilizar alguma confirmação é só reutilizar o componente, assim economizando tempo e código.

Simples não, é isso ai bons códigos pessoal

Referências

http://www.primefaces.org/

, ,

10 Comentários

%d blogueiros gostam disto: