Marcio Garcia

Software Empowerment²

Archive for the ‘Java’ Category

Upload de arquivos com SpringMVC

without comments



A quick setup to upload files using SpringMVC.

Dependencies

Usando o Maven, o primeiro passo é incluir duas dependencias: commons-io and commons-fileupload:


Application Context

Segundo passo é configurar o application context para fazer uso de multiparts:


Controller

Terceiro passo: criar o seu controller. note the existe um parametro do tipo: MultipartFile.


View

E o último passo: sua JSP.

Written by Marcio

May 6th, 2010 at 8:38 am

Posted in Java, Maven, SpringMVC, spring

Tagged with , , ,

Jersey com Maven e Spring

with one comment






Recentemente eu precisei de trabalhar em um projeto onde toda a comunicação entre o frontend e o backend era feita através de requisições HTTP. A princípio consideramos utilizar um Servlet com alguns helpers que mapeava os parâmetros de URL para um Map e internamente esse Map era “injetado” em todas as classes de recurso.


Era uma solucão a ser considerada, mas como essa era a primeira idéia que o time teve, resolvemos descartá-la.


Por uma requisição do cliente, tinhamos que utilizar Maven e Spring e isto era ponto fechado. As demais bibliotecas eram por nossa conta (e risco).
Surgiu então a segunda idéia de utilizar RESTful simplesmente para facilitar o trabalho entre o mapeamento dos parâmetros vindos da URL com o código.


Pesquisamos a primeira Lib, Jersey já quer esta é a implementação padrão do JSR-311 e também pesquisamos a API do Restlet.
Resolvemos nos contrapor a ideologia de rejeitar a primeira opção a fim de conseguir novos recursos.
Ambos frameworks possuem aspectos únicos e muito bem documentados. Cada uma com suas particularidades, por exemplo no Restlet é necessário criar uma classe com as rotas (uma classe que extende a classe Application).

Mas os principais motivos que nos levou a decidir a utilizar o Jersey foram:
  1. Ser a implementação modelo da especificação
  2. Menos burocracia na implementação dos resources
  3. Integração quase que natural com o Spring para a injeção de classes nos resources.


Este “walk through” tem o objetivo de exemplificar como criar uma aplicação simples utilizando as ferramentas: Spring, Maven e Jersey de forma prática.

Setup


  1. Incluir o repositório do jersey-spring no pom.xml


  2. Incluir as dependencias das libs: jersey spring

  3. Configurar web.xml

It’s time do code!


  1. Configuração do Spring (applicationContext.xml)
  2. Crie o arquivo applicationContext.xml no diretório META-INF de sua aplicação. Este código informa ao engine do Spring para que o pacote com.mng.jerseydemo esteja disponível para a injeção de dependencias. Segue o modelo do arquivo:
  3. Criação do primeiro resource.

  4. Neste trecho de código existem algumas anotações, entre elas:

    1. @Path
    2. Este é o padrão da URL que será tratado pela classe. Pode ser informado variáveis utilizando o modelo: {nomeDaVariavel}. Por exemplo: @Path(”/user/{username}/{password}”).
    3. @Autowired
    4. Injeta um objeto do tipo informado na váriavel.
    5. @GET
    6. Responde as requisições do tipo GET, existem ainda: @POST, @PUT e @DELETE que podem ser utilizadas da mesma maneira que o @GET
    7. @Produces
    8. Informa o tipo de retorno do método. Esta anotação pode ser informada tanto no método quanto na classe, junto com o @Path. Informando na classe o tipo de retorno será propagado para todos os métodos que não tenham um @Produces específico.
    9. @PathParam
    10. Traduz as variáveis mapeadas na URL para um objeto. Este será mapeado para uma variável informada na assinatura do método.

Acessando

Para acessar o recurso recém criado voce pode utilizar o próprio browser (Chrome ou Firefox), com eles fica fácil de simular o GET. No entanto, se você está no mundo X (Linux, Unix ou mesmo Mac) faça bom uso do cUrl. De forma rápida e prática este comando é simples de ser utilizado.
Através do parametro “-X” especificando o método que deverá ser enviado é possível testar a maior parte dos serviços:

E com o parâmetro -F você pode especificar os parâmetros (@QueryParam) do método post.






Written by Marcio

December 24th, 2009 at 11:48 am

Posted in Java, Maven, Shell, code

Tagged with , , , ,

Legibilidade do código - Nomes significativos

without comments

Desde um pouco antes de minha passagem pela Austrália tenho me dedicado a estudar sobre código e formas de codificar. Melhores e piores técnicas. Na época que passei na Austrália essa dedicação foi amplificada, pois como não estava trabalhando e nem a procura de um emprego passei muito tempo apenas lendo a respeito e aplicando algumas técnicas em códigos pessoais.

Nomes Significativos.


Se você ainda não teve uma experiência como esta, você é uma pessoa de sorte, mas em alguns casos você é obrigado a trabalhar com a restrição de oito caracteres para nomes. Essa “lei” se aplica para banco de dados antigos que não evoluíram.

Mas isso não quer dizer que o seu código (Java, C#, Ruby….) deva seguir este modelo. Os nomes das variáveis, métodos devem ser ao menos significativos.

Veja o seguinte trecho de código:
Este é apensa um exemplo, mas tais variáveis não dizem nada, absolutamente nada sobre a intenção das mesmas. Além do mais, você como um programador deve codificar mentalmente o que significa as variáveis cor e pal dentro do contexto. Agora leia o código a baixo:



Não é mais simples? Foi necessário alguma decodificação mental a respeito da intenção das variáveis?

Nomes de Métodos e Construtores.


Outra regra muito fácil aprendida na faculdade é de que o nomes para métodos devem ser verbos, expressando uma ação. Como por exemplo: get / set / is / do…..

Mas e com relação a construtores? Estes não são nada próximos de amigáveis ou mesmo significativos.
Uma boa saída é criar métodos estáticos dentro da própria classe informando o motivo para aquele construtor estático, por exemplo:



Este é um exemplo muito pequeno e sem nenhum contexto. Ainda neste código o nome do método construtor createComplete poderia ser renomeado apenas para create, caso existisse uma convenção em toda a aplicação de que o método chamado create precise de todos os parâmetros do objeto para ser criados.
Uma outra alternativa seria criar um construtor static ao invés de informar o parâmetro faltante - state - que não é algo muito legível, utilizar um contexto para esta criação, como por exemplo: createForSelect, sendo utilizado para a criação de um objeto City para ser utilizado em um campo html select.

Written by Marcio

November 1st, 2009 at 8:08 pm

Posted in Java, Utilidades, code

Tagged with ,

Relatórios com Ant

without comments

Segue um script que gera via Ant os relatórios:

  • Findbugs
  • Cobertura
  • Testes Unitários

Written by Marcio

September 3rd, 2009 at 4:09 pm

Posted in Ant, Java

Tagged with , , ,

Palestra JEE e Scrum na UNIARARAS

without comments

No último dia 28 ministrei uma palestra para os alunos da UNIARARAS no II Encontro de Profissionais de TI foi muito legal mostrar para o pessoal um pouquinho de como trabalhamos com JEE e Scrum lá no UOL.

Para todos que se interessarem, a apresentação se encontra publicada no Slideshare e aqui no blog, fiquem a vontade de baixá-lo e replicá-lo!

Written by Marcio

November 1st, 2008 at 10:24 am

JBoss and PermGem problem….

with 2 comments

After some deploys JBoss can display a message like:

java.lang.OutOfMemoryError: PermGen space

You can solve (or at least delay it) by changing the MaxPermSize parameter on startup by doing this:

Open run.conf (%JBOSS_DIR%/bin/run.conf) and include -XX:MaxPermSize=512m as parameter of the java statement

Written by Marcio

September 24th, 2008 at 2:22 pm

Posted in JBoss, Java

Tagged with ,

Ubuntu (Gutsy Gibbon) and Java Swing Applications…

with 4 comments

+ +

There is a problem using Gutsy Gibbon + Swing Java Application + Compiz.

My libraries are:


  • Ubuntu 7.10 (Gutsy Gibbon
  • JDK 1.5.0_16
  • Compiz-Core 1.06
  • Compiz-Fusion 0.52

The problem

When an java application is executed, it simply doesn’t appear anything, no buttons, no fields, no menus, nothing!

Solving

I really like compiz fusin effects but they are the monsters inside the box, they are the ones who don’t let the java application works fine.

For now, I had disable compiz (Visual Effects = None) and applications like: Jude and Oracle SQLDeveloper that before that opened but don’t appear nothing, now they run fine!.

Yes, thats boring to use Gnome without compiz effects, but for now this is the way that I have found to work with Java Swing Application on Ubuntu.

Have a lot of fun!

Written by Marcio

August 17th, 2008 at 12:11 am

Posted in Compiz, Java, Ubuntu

Tagged with , ,

Localizar uma classe dentro de um arquivo .jar

without comments

echo usage="Uso:        findJavaClass directory ClassName   "
if [ $# -lt 2 ] ; then
echo $usage
exit 1
fi
if [ -d 1 ] ; then
FIND_CMD="find 1"
else
echo "Diretorio nao existe"
exit 1
fi
$FIND_CMD -name \*.jar | while read jar_file ;
do
found_class=`unzip -l $jar_file | awk '{print }' | grep  `
num_classes=`echo $found_class | wc -c`
if [ $num_classes -gt 1 ] ; then
echo ""
echo "Arquivo:"
echo "    $jar_file"
echo "Classes:"
echo $found_class | sed 's/\ /\n/g' | sed 's/^.*/\ \ \ \ &/g'
fi
done


Descaradamente copiado do blog do Claudio

Written by Marcio

August 14th, 2007 at 4:23 pm

Posted in Java, Linux, Shell

Tagged with

Select / Option / Javascript

without comments

Selecionando uma opção baseado no valor.

/**
* retorna o indice do objeto [option] referente ao valor [value]
* caso nao encontre, retorna 0 (zero)
*/
function getOptionIndexFromValue(options, value) {
for (i = 0; i < options.length; i++) {
if (options[i].value == value) {
return i;
}
}
return 0;
}


Pode ser útil com AJAX.

Written by Marcio

August 6th, 2007 at 12:15 am

Posted in HTML, Java, Javascript

Apache + JBoss com mod_jk

without comments

1 - Instale o Apache
2 - Instale o JBoss
3 - Instale o mod_jk (download em: http://tomcat.apache.org/download-connectors.cgi)

Faça o download do modulo e copie-o no diretorio de modules do apache.

4 - Configure o mod_jk no Apache
Crie o arquivo: mod-jk.conf no diretorio conf do apache e insira o conteudo:

# Load mod_jk module
# Specify the filename of the mod_jk lib
LoadModule jk_module modules/mod_jk.so
# Where to find workers.properties
JkWorkersFile conf/workers.properties
# Where to put jk logs
JkLogFile logs/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
# JkOptions indicates to send SSK KEY SIZE
# Note: Changed from +ForwardURICompat.
# See http://tomcat.apache.org/security-jk.html
JkOptions +ForwardKeySize +ForwardURICompatUnparsed -ForwardDirectories
# JkRequestLogFormat
JkRequestLogFormat "%w %V %T"
# Mount your applications
JkMount /application/* loadbalancer
# You can use external file for mount points.
# It will be checked for updates each 60 seconds.
# The format of the file is: /url=worker
# /examples/*=loadbalancer
JkMountFile conf/uriworkermap.properties
# Add shared memory.
# This directive is present with 1.2.10 and
# later versions of mod_jk, and is needed for
# for load balancing to work properly
# Note: Replaced JkShmFile logs/jk.shm due to SELinux issues. Refer to
# https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=225452
JkShmFile run/jk.shm
# Add jkstatus for managing runtime data
<location>
JkMount status
Order deny,allow
Deny from all
Allow from 127.0.0.1
<location>


5 - Inclua a chamada para o mod-jk.conf no httpd.conf do Apache:
Altere o arquivo httpd.conf do Apache, inserindo a linha:
Include conf/mod-jk.conf

6 - Crie o arquivo workers.properties
# Define list of workers that will be used
# for mapping requests
# The configuration directives are valid
# for the mod_jk version 1.2.18 and later
#
worker.list=loadbalancer,status
#
# Define Node1
# modify the host as your host IP or DNS name.
worker.node1.port=8009
worker.node1.host=localhost
worker.node1.type=ajp13
worker.node1.lbfactor=1
# worker.node1.connection_pool_size=10 (1)
#
# Define Node2
# modify the host as your host IP or DNS name.
worker.node2.port=8009
worker.node2.host=localhost
worker.node2.type=ajp13
worker.node2.lbfactor=1
# worker.node1.connection_pool_size=10 (1)
#
# Load-balancing behaviour
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=node1,node2
#
# Status worker for managing load balancer
worker.status.type=status


Esclarecimentos:

(1) You should only set the connection_pool_size if the number of allowed connection to the Httpd is higher than maxThreads in server.xml

If you specify worker.loadbalancer.sticky_session=Off, each request will be load balanced between node1 and node2. But when a user opens a Session on one server, it is a good idea to always forward this user’s requests to the same server. Otherwise the user’s session data would need to be synchronized between both servers. This is called a “sticky session”, as the client is always using the same server he reached on his first request. Session stickiness is enabled by default.

Side Note: a non-loadbalanced setup with a single node required the “worker.list=node1″ entry before mod_jk would function correctly. Without this setting I would only get a 500 error and no other useful messages in log or otherwise. -Harlequin516

Side Note: I tried both loadbalanced and single node methods on Fedora 4. Both setups causing jk.shm errno=13 and jk-runtime-status errno=13 in the mod_jk.log. Could only get 500 errors. As a last resort disabled selinux on apache server. Restarted service and connection was made first try. -paulbrown

7 - Criar o arquivo de mapeamento (uriworkermap.properties)
Crie o arquivo uriworkermap.properties no diretorio conf do Apache.

# Simple worker configuration file
#
#
# Mount the Servlet context to the ajp13 worker
/jmx-console=loadbalancer
/jmx-console/*=loadbalancer
/web-console=loadbalancer
/web-console/*=loadbalancer


Esclarecimento: Isso fara com que toda requisição feita ao apache a /web-console e jmx-console seja direcionada para o JBoss.

8 - Configuração do Tomcat do JBoss

Altere o arquivo: server.xml, localize o trecho:

<Engine name="jboss.web" defaulthost="localhost" jvmroute="node1">
.
</Engine>


inclua o jvmRoute=”node1″

Verifique se o conector AJP1.3 nao esta comentado:

<Connector port="8009" address="${jboss.bind.address}">
emptySessionPath="true" enableLookups="false" redirectPort="8443"
protocol="AJP/1.3"/></Connector>


Altere o arquivo jboss-service.xml fazendo com q o atributo UseJK seja igual a true:

<attribute name="UseJK">true</attribute>


9 - Start
Inicie o Apache e o JBoss e acesse: http://localhost/web-console

Fonte: Jboss-Wiki

Written by Marcio

July 15th, 2007 at 11:41 pm

Posted in Apache, JBoss, Java, Linux, Tomcat