File Upload con Servlet 3.0

Hasta la versión 3.0 de los Servlets (Java EE 6) lo normal era usar la librería commons-fileupload para hacer uploads de ficheros al Servidor.

Con la nueva especificación se simplifica todo un poquito (ha costado Dios mío!):

Basta con anotar el Servlet con la anotación @MultipartConfig

y recuperar los ficheros del Request.

El nombre del fichero viene en:

En el html lo invocamos:

El código:

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import javax.servlet.ServletException;

import javax.servlet.annotation.MultipartConfig;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.Part;

import org.apache.log4j.Logger;

@WebServlet(urlPatterns = “/fileUpload”)

@MultipartConfig

public class FileUploadServlet extends HttpServlet {

private static Logger logger = Logger.getLogger(FileUploadServlet.class);

public FileUploadServlet() {

super();

}

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

for (Part part : request.getParts()) {

logger.info(part.getName());

InputStream is = request.getPart(part.getName()).getInputStream();

int i = is.available();

byte[] b = new byte[i];

is.read(b);

logger.info(“Length : ” + b.length);

String fileName = getFileName(part);

logger.info(“File name : ” + fileName);

FileOutputStream os = new FileOutputStream(“c:/temp/logs/” + fileName);

os.write(b);

is.close();

}

}

private String getFileName(Part part) {

String partHeader = part.getHeader(“content-disposition”);

logger.info(“Part Header = ” + partHeader);

for (String cd : part.getHeader(“content-disposition”).split(“;”)) {

if (cd.trim().startsWith(“filename”)) {

return cd.substring(cd.indexOf(‘=’) + 1).trim()

.replace(“””, “”);

}

}

return null;

}

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

doGet(request, response);

}

}

Android: Algo no va bien…

Interesante Post sobre Android (gracias Jose)

Seguro que los fans no opináis lo mismo pero hay cosas que son incontestables, si tuviera que elegir la peor yo diría que es el tema de las versiones:

¿Cuántas versiones lleva ya Android en su corta existencia? Si hubieran funcionado bien hubieran sido necesaria tantas…

Tips para optimizar JBoss EAP

En leo un artículo con el título “12 Best Practices for Optimizing the JBoss EAP Platform

…desde mi punto de vista no son más que unas recomendaciones livianas, y en algún caso incluso de tan evidentes inútiles pero juzgarlo por vosotros mismos.

Eso sí…coincido con la 9, aunque yo sería más radical: no uses el cluster de JBoss:

Tips sobre Máquinas Virtuales Java JVMs Sun e IBM

En este post recomendábamos la lectura de un libro, especialmente del capítulo 7.

En este capítulo se estudian los funcionamientos de las máquinas virtuales de Sun e IBM: cómo funcionan,…

En este post sólo quería dejar unos tips básicos…que fuera del contexto del estudio pueden parecer aleatorios pero no lo son:

Recomendación Parámetros Sun JVM

Para un Heap de 1 Gb:

-Xmx1024m -Xms1024m -XX:MaxNewSize=448m -XX:NewSize=448m -XX:SurvivorRatio=6

Para un Heap de 2 Gb:

-Xmx2048m -Xms2048m -XX:MaxNewSize=896m -XX:NewSize=896m -XX:SurvivorRatio=6

Recomendaciones Parámetros IBM JVM

1. Set the initial heap size (–Xms) to the size of the steady state of the heap after the application server starts, which can be determined through the verbose garbage collection logs.

2. Set the maximum heap size (–Xmx) to ensure that the heap used during load is approximately 70 percent of the maximum.

3. Observe garbage collection frequency, and if it is too frequent, then increase the target free space (–Xminf) to between 30 and 40 percent.

4. Increase the minimum expansion size (–Xmine) from 1MB to between 20MB and 50MB and observe the frequency of garbage collection. If it’s too frequent, then increase this value; if it’s less frequent but the pause time is too long, then decrease this value.

5. If your pause time is sporadic, then normalize it by enabling concurrent mark (–Xgcpolicy:optavgpause).

Libro: Pro Java EE 5 Performance Management and Optimization

Cuando estuve buscando algún libro que me ayudara a optimizar la máquina virtual de un sistema no lo encontré y el otro día de casualidad me topé con él…

Algunos capítulos como el 7 son prácticamente de lectura obligatoria 🙂

Google en tiempo real

Google ha lanzado una versión de su buscador que permite seguir en tiempo real referencias de su búsqueda en redes sociales.

http://www.google.com/realtime/

El servicio ofrece el flujo de conversaciones en varias redes (Facebook, Twitter…) que se pueden filtrar por fecha, lugar u hora. Google ofrece también un listado de los enlaces más citados en los mensajes. Google Alerts también permite que se reciban avisos relativos a las actualizaciones realizadas sobre la búsqueda realizada.

Búscando lmgracia, por ejemplo… obtenemos…

Es que este hombre no para de publicar… 😀

Java in action

Citando a R.E.M…

“When the day is long and the night, the night is yours alone,

When you’re sure you’ve had enough of this life, well hang on”

Quien no se ha sentido así tras tantos cambios de frameworks, de tensiones y fusiones en el mundo Java… Sin saber cuánto durará esta etapa y si Java tiene futuro…

Pensando en eso, Sun ha publicado “Java in action” una sección que señala como Java juega un papel clave en una gran variedad de industrias.

http://www.java.com/en/java_in_action/

Porque a veces es necesario que esas cosas se aclaren y se recuerden para que no desesperemos 😀