Archive for the ‘Java’ Category
Upload de arquivos com SpringMVC

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.Jersey com Maven e Spring

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).
- Ser a implementação modelo da especificação
- Menos burocracia na implementação dos resources
- 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
- Incluir o repositório do jersey-spring no pom.xml
- Incluir as dependencias das libs: jersey spring
- Configurar web.xml
It’s time do code!
- Configuração do Spring (applicationContext.xml) 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:
- Criação do primeiro resource.
- @Path 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}”).
- @Autowired Injeta um objeto do tipo informado na váriavel.
- @GET Responde as requisições do tipo GET, existem ainda: @POST, @PUT e @DELETE que podem ser utilizadas da mesma maneira que o @GET
- @Produces 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.
- @PathParam Traduz as variáveis mapeadas na URL para um objeto. Este será mapeado para uma variável informada na assinatura do método.
Neste trecho de código existem algumas anotações, entre elas:
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.
Legibilidade do código - Nomes significativos
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.
Relatórios com Ant
- Findbugs
- Cobertura
- Testes Unitários
Palestra JEE e Scrum na UNIARARAS
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!
JBoss and PermGem problem….
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
Ubuntu (Gutsy Gibbon) and Java Swing Applications…
+ 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!
Localizar uma classe dentro de um arquivo .jar
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
Select / Option / Javascript
/**
* 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.
Apache + JBoss com mod_jk
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