sexta-feira, 18 de julho de 2014

Como criar um projeto no Eclipse com webapp, src/main/java e etc.

Este post é sobre uma questão que eu já vinha pesquisando já tem um tempo e que me deu uma bela dor de cabeça. Porém, não vamos perder mais tempo. Mão na massa.

O meu problema era: precisava criar um simples HelloWorld com Spring MVC com a estrutura de projeto do maven. Quando digo "estrutura de projeto do maven", quero dizer um projeto web com a pasta webapp, src/main/java, entre outras.

Depois de muita dor de cabeça e muita pesquisa, achei a solução. Abaixo, a minha lista de ferramentas:

  • Eclipse Kepler
  • Maven 3.0.4 (Esse maven já veio no Eclipse)
Abra o eclipse com o seu workspace. Crie um projeto Maven seguindo os passos do vídeo abaixo.

Vídeo nº1

Se você seguiu os mesmos passos vídeo nº 1, irá notar que o container web criado foi na versão 2.3 e que não foram criados os packages src/main/java e src/test/java. Não se espante, isso é normal. Um bug acabou de acontecer.

UMMMM BUUGGGG !!!!

Como fazemos para corrigir esse bug ? Siga os passos do vídeo nº 2.

Vídeo nº 2

Nossa, nesse momento você deve estar se sentindo perdido porque, nesse vídeo realizamos vários passos.

Primeiro, vamos entender o que aconteceu. Quando o projeto foi criado, ele teve o seu arquivo de classpath gerado e nele foi especificado que outras pastas além, da pasta resources também teriam arquivos. Essas pastas são: test e java. No vídeo é possível notar que, quando abrimos o Build Path do projeto, existem duas pastas que estão faltando, justamente as pastas que citamos acima. Para resolver esse bug, ou removemos alguma das pastas do Build Path e apertamos o botão Ok ou, adicionamos uma pasta nova no File System(Windows Explorer) do projeto, adicionamos a mesma no Build Path, apertamos Ok, e depois removemos a mesma.

A segunda solução foi a usada no vídeo. Como disse acima, o que aconteceu foi um bug. Uma escrita no arquivo de classpath foi feita mas, as pastas não foram criadas. Logo, precisamos realizar alguma ação que dê um "refresh" no projeto e assim, o Eclipse irá criar as pastas corretas com as configurações corretas.

Pronto, já temos um projeto criado de forma funcional. No início do nosso post, comentei que o projeto gerado com base no archtype do Maven tem o container web na versão 2.3. Existe aí, um outro problema. A versão 2.3 é um pouco limitada, por exemplo: caso seja necessário usar EL, será necessário adicionar a declaração abaixo:

<%@ page isELIgnored="false" %>
Recomendo a leitura do post do blog do Mkyong que, explica isso e foi de lá que, consegui esta explicação.

http://www.mkyong.com/spring-mvc/modelandviews-model-value-is-not-displayed-in-jsp-via-el/

Agora imagine que, em todas as suas páginas você tenha que adicionar essa declaração. Cansativo, né ? A chance de cometer erros aumenta muito. Na versão 2.5 do container web, o uso de EL é automático e o arquivo web.xml é escrito de forma diferente. Neste momento, o caro leitor deve pensar: "Ahh !! Isso é mole, é só eu ir no Project Facets do projeto e mudar para 2.5 o web module" e eu respondo em seguida: "Você está completamente errado".

Caso alguém tente fazer o que foi pensado acima, não conseguirá pois, o Eclipse acusa um conflito. Então, mais uma vez teremos de dar nosso jeito. Siga os passos do vídeo nº 3 para mudar o web module do projeto de 2.3 para 2.5.

Vídeo nº 3

No vídeo 3 mudamos um arquivo de configuração do próprio Eclipse. Desta forma, forçamos a mudança de versão do web module mas, o arquivo web.xml também precisa ser modificado conforme é mostrado no blog do Mkyong. Com o arquivo web.xml regerado, é necessário mudar o Java Compiler do projeto pois, mexemos na versão do Java usado.

Feito isso tudo, é só começar a programar e ser feliz.

Espero que esta minha contribuição ajude a muitos pois, foi muito difícil chegar a essa solução. Caso alguma outra pessoa consiga outras soluções, diferentes das minhas, para o mesmo problema, deixe sua contribuição nos comentários.

Até a próxima.

Leia Mais ››

quarta-feira, 9 de julho de 2014

Gravar ano(Year) em banco MySQL usando Java

Caros leitores, a ajuda de hoje vai ser rápida. Vamos supor que temos a tabela abaixo:


A coluna id é do tipo Integer, a coluna nome é do tipo Varchar e a coluna data_aniversario é do tipo Year. Quando estamos lidando com uma tabela e usando Hibernate, as coisas se tornam mais fáceis porque, o hibernate grava o registro para o desenvolvedor e não é necessário montar query de INSERT e atribuir os valores a mesma. Porém, quando estamos usando JDBC puro e quando digo puro estou falando do pacote java.sql, precisamos lidar com a atribuição de valores à query e essa atribuição, às vezes, pode ser um pouco complicada.

Para tratarmos a gravação de dados com colunas do tipo Year, fazemos da seguinte forma:

String query = "INSERT .....";
...
preparedStatement.setInt(1, obj.getId());
preparedStatement.setString(2, obj.getNome());

Calendar c = Calendar.getInstance();
c.setTime(obj.getAnoNascimento());
preparedStatement.setInt(3, c.get(c.YEAR));

preparedStatement.execute();

É isso galera, espero ter ajudado. Ficamos por aqui hoje.
Leia Mais ››

Focus no JInternalFrame

E quando eu penso que, não terei de mexer mais com algum projeto em Swing, me engano e lá vamos nós...

Nesse projeto que estava desenvolvendo, estava usando JInternalFrame para confecção de telas. Quando uma tela era aberta, eu queria que ela fosse aberta com o focus. Depois de muito pesquisar, achei a solução na própria documentação.

Segue solução para o problema:

protected void createFrame() {
    MyInternalFrame frame = new MyInternalFrame();
    frame.setVisible(true);
    desktop.add(frame);
    try {
        frame.setSelected(true);
    } catch (java.beans.PropertyVetoException e) {}
}

Também descrevo abaixo algumas boas práticas no uso de JInternalFrame, retiradas da documentação da API.

Rules of Using Internal Frames

If you have built any programs using JFrame and the other Swing components, then you already know a lot about how to use internal frames. The following list summarizes the rules for using internal frames. For additional information, see How to Make Frames and The JComponent Class.
You must set the size of the internal frame.
If you do not set the size of the internal frame, it will have zero size and thus never be visible. You can set the size using one of the following methods: setSizepack, orsetBounds.
As a rule, you should set the location of the internal frame.
If you do not set the location of the internal frame, it will come up at 0,0 (the upper left of its container). You can use the setLocation or setBounds method to specify the upper left point of the internal frame, relative to its container.
To add components to an internal frame, you add them to the internal frame's content pane.
This is exactly like the JFrame situation. See Adding Components to the Content Pane for details.
Dialogs that are internal frames should be implemented using JOptionPane or JInternalFrame, not JDialog.
To create a simple dialog, you can use the JOptionPane showInternalXxxDialog methods, as described in How to Make Dialogs.
You must add an internal frame to a container.
If you do not add the internal frame to a container (usually a JDesktopPane), the internal frame will not appear.
You need to call show or setVisible on internal frames.
Internal frames are invisible by default. You must invoke setVisible(true) or show() to make them visible.
Internal frames fire internal frame events, not window events.
Handling internal frame events is almost identical to handling window events. See How to Write an Internal Frame Listener for more information.
Se alguém precisar de alguma ajuda no inglês, deixe um comentário, que eu dou uma forçinha.

Referência:
http://docs.oracle.com/javase/tutorial/uiswing/components/internalframe.html
Leia Mais ››