Resolvendo Problema com dispositivo /dev/dsp ao programar em JME

Nas versões mais novas do Ubuntu o dispositivo /dev/dsp simplesmente não existe, pois ele pertence ao pacote OSS, e o modulo não vem instalado, muitas aplicações utilizam o OSS, por este motivo o pacote Pulse Audio vem com um “emulador” chamado padsp, que emula as chamadas ao /dev/dsp,redirecionando ao proprio PulseAudio, como o Pulse Audio vem instalado no Ubuntu, para utiliza-lo, use o comando:

padsp nome_da_aplicacao

Para fazer com que suas aplicações JME rodem com áudio execute o NETBEANS desta forma

padsp netbeans

Se você utiliza o gnome, adicione o comando em um lançador:

Até a próxima;

Abraço..

Se gostou deixa um comentário….

Como fazer download de um arquivo da internet com java

Bem fazer download de arquivo é bem simples, vamos utilizar a classe java.net.URL



import java.io.*;
import java.net.URL;
import java.net.URLConnection;

/**
 *
 * @author Moacir.com.br
 * 
 * Exemplo de como fazer download de um arquivo em java.
 * 
 * 
 * 
 */
public class FazDownload {


    public static void main(String[] args)  {
        String protocolo="http";
        String endereco ="moacirrf.com.br";
        String arquivo="/arquivos/JSFImmediate.zip";
        
        try {
           //cria URL
            URL url1 = new URL(protocolo,endereco,arquivo);
            //abre uma conexao na url criada àcima
           URLConnection con =  url1.openConnection();
           
           //tenta conectar.
           con.connect();
           
           //arquivo de saida
            FileOutputStream fileOut = new FileOutputStream("c:/teste/JSFImmediate.zip");
            
            int c=0;
            
           do{
             //le o byte
               c=con.getInputStream().read();
             
               //escreve o byte no arquivo saida
               fileOut.write(c);
               
   
              
           }while(c !=-1);
        
           //fecha o arquivo de saida
           fileOut.close();
           
           System.out.println("Arquivo baixado com sucesso");
        }catch(IOException e){   
                 e.printStackTrace();
        } 
         
    }
}

Segue algumas explicações.

Na linha 23 criamos o objeto URL, dentre os diversos construtores disponíveis na classe, estamos utilizando este que recebe três parâmetros, URL(protocol, host, file).

  • Primeiro-parâmetro é o protocolo, no nosso caso utilizamos o HTTP;
  • Segundo- parâmetro é o host, o endereço do servidor;
  • Terceiro-É o arquivo que você deseja acessar no servidor, poder ser um arquivo de texto, uma pagina html etc, no que no nosso caso estamos acessando o arquivo ZIPque esta dentro da pasta arquivos de modo que a url normal é http://moacirrf.com.br/arquivos/JSFImmediate.zip.

Na linha 25 criamos uma conexão com o host,usando a classe URLConnection, Não é realmente necessário utilizar esta classe para este exemplo, mas o interessante de usa-la, você pode utilizar alguma das suas sublasses como por exemplo a HttpURLConnection para configurar ou receber parâmetros específicos do protocolo HTTP, como por exemplo código do status.

Até logo pessoal;

Como ser um pouco mais produtivo utilizando Eclipse e JSF

Em primeiro lugar, vou fazer um critica f****-se você não gostar, A ide Eclipse para JSF junto com seus plugins Jboss Tools é lenta e trava com muita facilidade, mas tomando algumas providências antes mesmo de começar a escrever o seu Managed Bean,você pode ser bem produtivo, segue algumas dicas para manter sua sanidade mental ao usar o JSF e você não machucar a sua mão dando soco na mesa.

1-Não coloque tantos atributos no seu Managed Bean distribua em mais de uma classe, ou até mesmo em mais de um ManagedBean, use Facelets para compor os seus templates, não importa se você  tenha que criar 10 templates para construir uma tela, é bem melhor fazer isso do que por tudo  em uma pagina e a IDE TRAVAR quando você der um CTRL +espaço.

2- No JSF 1.2 não existe navegação implicita, então se possivel use a Navegação Global para que você não precise ficar relacionando páginas com páginas, e deixar seu FacesConfig imenso dificultando ainda mais o trabalho da IDE, é bem fácil:


<navigation-rule>
<from-view-id>*</from-view-id>
<navigation-case>
<from-outcome>incluir</from-outcome>
<to-view-id>/incluir.xhtml</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>editar</from-outcome>
<to-view-id>/editar.xhtml</to-view-id>
</navigation-case>
</navigation-rule>

Leia mais sobre este assunto aqui:

http://www.jsftutorials.net/jsf-navigation-by-examples.html

3-Utilize dois arquivos faces-config:

Você pode utilizar mais de um arquivo de configuração do JSF basta fazer isto:

  • Altere o arquivo web.xml


<context-param>

<param-name>javax.faces.CONFIG_FILES</param-name>

<param-value>/WEB-INF/faces-config.xml</param-value>
<param-value>/WEB-INF/faces-config-navegacao.xml</param-value>
</context-param>


Note que neste exemplo temos dois arquivos de configuração:

faces-config.xmlfaces-config-navegacao.xml

O primeiro com a declaração dos componentes(Backing Beans,Converters etc…) e outro com a navegação.

 

4- Continua lento, tente aumentar a memoria do eclipse:

http://blog.xam.dk/?p=58

Não adiantando, aceite e espere, você ja esta sentado mesmo…

Sobre o CTRL +espaço, só tenho uma coisa a dizer, eu uso, e  muito, e gosto de resposta imediata da IDE, se você acha que Code Assist é coisa de trouxa, então vai programar no VI, neste quesito a Intellij Idea é excelente mas nunca usei para JSF pois a versão Free não possui suporte ao JSF.

Era isso…

O sonho RAD dos defensores do  “padrão” JSF continua bem longe do ideal, mas essas dicas ja valem alguma coisa.

Até

ps.: Eu prefiro frameworks como Wicket e Click mas nunca escrevi sequer uma letra sobre os mesmos, que curioso….

Instalando o JDK da Sun/Oracle no Ubuntu 10.4

Vamos instalar e configurar o JDK  no Ubuntu e depois substituir a o OPEN JDK pela versão da Oracle, que é mais compativel com a maioria dos sites que existem por aí, e sem nem sentir o cheiro do console, apenas usando as ferramentas gráficas disponiveis no Ubuntu, elas estão aí pra isso.

“Boa sorte…”

Siga os passos

Va até Aplicativos –>Central de Programas do Ubuntu –> instale os seguintes pacotes: Configurador Alternatives, default-jdk
Escolhi instalar o JDK ao inves da JRE, pois assim estou sendo útil a programadores e usuários não nerds desenvolvedores.

Execute o programa Configurador Alternatives em Aplicativos–>Ferramentas de Sistema.

Este programa serve para você configurar as alternativas para inúmeros softwares, então na maioria das vezes, as  alternativas livres e programas devidamente alterados para funcionarem no Ubuntu, são mantidos como PADRÃO, para o JDK da Oracle, temos o OpenJDK , para o Mozilla Firefox temos Mozila Firefox for Ubuntu, o problema é que as vezes esses softwares não são totalmente compatíveis com nossas necessidades.

Agora altere todas as alternativas que tem relação com java da seguinte forma, por exemplo a appletviewer:

1- Selecione appletviewer no esquerda,note que a no meu caso a alternativa padrão é o OpenJdk, então clique no botão Adicionar.

2- Ao clicar em Adicionar, clique no botão Navegar..

3- Agora você deve selecionar o Java da Oracle conforme a imagem:

4- Agora marque a nova alternativa como padrão, como a figura abaixo:

5- Se você desejar, realize o mesmo procedimento para todas as outra opções(extcheck, idlj,jar, jarsigner, javajavac, javadoc, javah, javap, javaws, jconsole, jdb, jhat, jinfo, jmap, jps, jrunscript), as que eu deixe em negrito são as que eu acho que você deveria realizar o procedimento.

6- Agora o ultimo e mais importante passo, vamos configurar o plugin java para o mozilla-firefox (Oba! Sem problemas com o Banco do Brasil), configure conforme a imagem abaixo:

Até a próxima…

Abrass

Entenda o atributo immediate no JSF

Neste artigo vou tentar explicar para que serve o atributo immediate do JSF e exemplos de situações onde você iria gostar de usá-lo, estou considerando que você seja um iniciante em JSF, mas que ao menos saiba a estrutura de um projeto WEB.

Bem vamos lá…

Segue a explicação do atributo immediate segundo o JEE Tutorial:

UIInput components and command components (those that implement ActionSource, such as buttons and hyperlinks) can set the immediate attribute to true to force events, validations, and conversions to be processed during the apply request values phase of the life cycle.

O parágrafo diz que os componentes de entrada  e componentes de comandos (botões e hiperlinks), podem setar o atributo immediate para true, para fazer com que os eventos, validações e conversões sejam processadas durante a fase de aplicar valores de requisição(Apply Request Values)

Concluímos que não pulamos a validação, se você pensar no immediate como “uma forma de pular a validação”, vai ficar complicado usar o JSF.

Olhe o diagrama do ciclo de vida do JSF:

Não vou me estender quanto ao Ciclo de Vida, mas darei uma breve explicação sobre como interpretar o diagrama acima.

Os quadrados em verde são as fases, os quadrados em azul são os eventos que ocorrem em cada fase, muita gente confunde, e acha que os quadrados em azul também são  fases, se  temos 6 quadrados verdes, então o JSF tem 6 fases.

Por exemplo, um método actionListener de um botão será executado em Process Events da fase  Invoke Application, antes de Render Response.

Se este mesmo botão estiver com o Immediate setado para true, o actionListener será executado em Process Events de Apply Request Values.

Obs.:  Response Complete significa que a aplicação deve ser redirecionada para qualquer coisa que não seja um componente JSF,  um uso comum desta declaração, é quando você deseja que um actionListener devolva um um arquivo para download. Da uma ligada no post do cara chamado Urubatan no link abaixo.

http://www.guj.com.br/posts/list/54239.java

Acho que já esclarecemos um pouco as coisas, certo? Então vamos a um exemplo prático:

Para garantir que estaremos falando a mesma língua, baixe o projeto básico de exemplo, você deve importá-lo para o Eclipse JEE, talvez você tenha que corrigir as bibliotecas do seu classplath.

Se você  executou o projeto, deve ter visto JOptionPane, exibindo o que você inseriu no campo, e também em que fase do ciclo de vida aquele evento foi executado,  caso você não insira nada no campo de entrada, é impresso “campo obrigatório”, e o actionListener não é executado.

Deixe aberto em sua IDE as classes Pessoa, ManagedBeanPessoa e o arquivo jsp pessoaView.jsp

Abaixo temos alguns casos de usos

Caso 1

Eu quero que o metodo imprimeNome seja executado mesmo que eu não digite nada no campo.

Simples! Altere o botão imprimeNome, adicione o immediate=”true” ao botão.

<h:commandButton id="commandoButtonImprimeNome" immediate="true" value="Imprime Nome" actionListener="#{managedBeanPessoa.addImprimeNome}" />

Executou perfeitamente, mas note que a fase mudou, agora exibiu APPLY_REQUEST_VALUES, e o nome da pessoa esta nulo.

O nome da pessoa esta nulo, pois o modelo não foi atualizado (olhe o diagrama do ciclo de vida.). Depois que o actionListener foi executado, o ciclo seguiu para RENDER_RESPONSE e nunca chegou em UPDATE_MODEL_VALUES.

Caso 2

Eu quero que o método imprimeNome seja executado, mesmo que eu não digite nada no campo, mas caso eu tenha digitado alguma coisa, eu quero obter esses valores.

Moleza!, pois o modelo não é atualizado, então precisamos obter o valor através de um binding, altere o arquivo br.com.moacirrf.controlador.ManagedBeanPessoa.

Adicione este atributo

private HtmlInputText inputTextNome = new HtmlInputText();

importe do pacote javax.faces.component.html.HtmlInputText, e crie o método set e get para este atributo.

Altere do actionListener desta forma

public void addImprimeNome(ActionEvent event){
JOptionPane.showMessageDialog(null,"Fase JSF: "+event.getPhaseId()+ "\n Nome da pessoa: " +inputTextNome.getSubmittedValue());

}

Por ultimo, altere o arquivo pessoaView.jsp

<h:inputText id="pessoaNome"  binding="#{managedBeanPessoa.inputTextNome}" required="true" value="#{managedBeanPessoa.pessoa.nome}" requiredMessage="Campo Obrigatorio!">

</h:inputText>

Reinicie o servidor, e o valor que você digitou será exibido.

Caso 3

Eu quero que o método imprimeNome seja executado, mesmo que eu não digite nada no campo, mas caso eu tenha digitado alguma coisa, eu quero obter esses valores  e eu quero que o campo nome seja validado.

Barbada!,  adicione o immediate=”true” no campo nome.

<h:inputText  id="pessoaNome" immediate="true" binding="#{managedBeanPessoa.inputTextNome}" required="true" value="#{managedBeanPessoa.pessoa.nome}" requiredMessage="Campo Obrigatorio!">

</h:inputText>

Altere o ManagedBeanPessoaNome

public void addImprimeNome(ActionEvent event){
JOptionPane.showMessageDialog(null,"Fase JSF: "+event.getPhaseId()+ "\n Nome da pessoa: " +inputTextNome.getValue());
inputTextNome.setValue(null);

}

Teste e veja só que beleza.

Note a linha inputTextNome.setValue(null) experimente comentá-la, se você ficou com duvidas sobre qual a diferença entre getValue() e getSubmitedValue() leia este artigo do criador do PrimeFaces http://cagataycivici.wordpress.com/2005/12/28/jsf_component_s_value_local/

Concluímos aqui este artigo, se você testou todos os exemplos, aprendeu a usar o Immediate, isso evitará muitas gambiarras nos seu futuros projetos com JSF, de quebra você aprendeu um pouco sobre o ciclo de vida deste  framework, que não é tão dificil de entender como dizem por aí.

Espero que este artigo tenha sido útil.

Qualquer xingamento sugestão pode deixar um comentário.

Abrass