SportsTracker 5.3.0

SportsTracker 5.3.0

SportsTracker 5.3.0

SportsTracker es una aplicación muy completa para registrar las actividades deportivas y hacer un seguimiento. Permite crear diagramas y sacar estadísticas.

Descargar SportTracker 5.3.0 Para Windows

Descargar SportTracker 5.3.0 Para Windows

Anuncios

Formato de Números y Fechas con Spring Web MVC

import java.math.BigDecimal;
import java.util.Date;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.Size;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.NumberFormat;

// ...
    @DateTimeFormat(pattern = "dd/MM/yyyy")
    private Date control;

    @NumberFormat(style = NumberFormat.Style.NUMBER)
    @Digits(integer = 5, fraction = 5)
    private BigDecimal distantVisualAcuity;

    @Max(100)
    @Min(10)
    @NumberFormat(style = NumberFormat.Style.NUMBER)
    private BigDecimal totalInterpupilaryDistance;

    @NotNull
    @Past
    @DateTimeFormat(pattern = "dd/MM/yyyy")
    private Date date;

Spring Web MVC convierte los datos ingresados por el usuario al tipo de dato del Bean que respalda el formulario. No es necesario escribir una sola línea de código para convertir la enorme mayoría de los valores que se ingresan. Basta con usar algunas annotations muy sencillas. En el caso de números se puede establecer, por ejemplo, la cantidad de dígitos enteros y fraccionarios, sin tener que recurrir a una máscara de entrada.

Para poder usar la annotation DateTimeFormat hay que incorporar joda-time como dependencia.

La conversión funciona tanto para el ingreso de texto como para el formateo a la hora de editar el formulario.

Las annotations así usadas son además documentación del sistema. Cualquier persona que vea cómo está anotada la variable sabe el tipo de valores de entrada que admite sin tener que mirar otra cosa.

Por Qué Usar Spring Web MVC Framework

1.- Porque la asignación de qué método se ejecuta cuando se carga una URL se puede hacer con una annotation en forma directa y simple.

@Controller
public class User {
    @RequestMapping("/admin/user")
    public String listUsers(Model model) {
        model.addAttribute("users", this.userService.listAll());
        return "userList";
    }
}

Con sólo usar la annotation  @RequestMapping Spring sabe que cuando se ingrese la URL /admin/user hay que ejecutar el método listUsers de la clase User.

2.- Porque los controllers no son más que un objeto cualquiera que lleva una annotation.
En el ejemplo, la clase User no tiene nada en particular. No implementa ninguna interfaz ni hereda de ninguna clase en particular. Sólo se requiere anotarla con @Controller.

3.- Porque todas las validaciones se pueden hacer con annotations usando Bean Validation (JSR 303).

@ScriptAssert(
    lang = "Groovy",
    script = "_this.password.equals(_this.password2)",
    message="{password.confirm}")
public class UserDTO extends PersonDTO {

    @NotEmpty
    @Size(min=5,max=20)
    private String login;

    @Size(max=40)
    private String password;

    @Size(max=40)
    private String password2;
}

En este ejemplo, la clase UserDTO es el respaldo del formulario de alta de usuarios. En el caso del campo login, se valida que esté presente y que sea de entre 5 y 20 caracteres. El caso de la password, que sea como máximo de 40 y para verificar que coincidan ambas contraseñas ingresadas, se usa la annotation @ScriptAssert que permite realizar validaciones más complejas ejecutando código mediante un lenguaje de scripting (en este caso Groovy) sin tener que recurrir a codificar un validador propio.

Cuando el script fuera muy complejo se puede directamente invocar un método del objeto anotado de esta forma:

@ScriptAssert.List({
    @ScriptAssert(lang = "Groovy",
        script = "_this.checkQuery()",
        message = "{report.enterQuery}"),
    @ScriptAssert(lang = "Groovy",
        script = "_this.checkParameterCount()",
        message = "{report.paramCount}")})
public class ReportDTO extends EntityDTO {

    /* ... resto del código de la clase ... */

 public boolean checkParameterCount() {
        return this.parameters.size() == this.getExpectedParameters();
    }

    public boolean checkQuery() {
        return this.query != -1 || (this.sql != null && this.sql.length() > 10);
    }
}

Así se puede escribir en el mismo objeto que respalda el formulario uno o varios métodos que realicen validaciones y se los invoca desde la annotation usando un lenguaje de scripting directamente. En el ejemplo se ve cómo ejecutar varias validaciones cada una con su propio mensaje de error y su script.

4.- Porque permite manejar distintos tipos de request (GET, POST, PUT, DELETE, HEAD y OPTIONS) en forma individual o todos juntos.


// ...

    @RequestMapping(value = "/admin/report/edit", method = RequestMethod.GET)
    public ModelAndView editReportForm(
            @RequestParam(required = true, value = "id") int id) {
// ...
    @RequestMapping(value = "/admin/report/edit", method = RequestMethod.POST)
    public String editReport(
            @ModelAttribute("reportDto") @Valid ReportDTO report,
            BindingResult result,
            SessionStatus status) {
// ...

En el ejemplo, la misma URL, /admin/report/edit, es manejada por diferentes métodos del controller según que annotation se use. Típicamente en el GET se devolvería el formulario de edición con los datos cargados y en el POST se haría la edición según las modificaciones ingresadas por el usuario.

Launch4j: Crear Ejecutable de Windows para una Aplicación Java

Launch4j

Launch4j

Para simplificar la ejecución en Windows de un programa hecho en Java, launch4j permite transformar un archivo JAR en un archivo EXE con un enorme grado de flexibilidad.

No hace falta ni siquiera tener Windows; se puede generar el archivo EXE desde otro sistema operativo como Ubuntu. Simplemente hay que bajar la versión de launch4j correspondiente al sistema operativo que estemos usando.

Hay que tener en cuenta que si se está usando la versión de Ubuntu de 64 bits hay que instalar la biblioteca libc de 32 bits. En Ubuntu 11.10 (Oneiric Ocelot) el paquete es libc6:i386 y se puede instalar desde Synaptic o con este comando:

sudo apt-get install libc6:i386

El resultado es muy bueno. Se genera un archivo ejecutable nativo de Windows que funciona en todas las versiones de ese sistema y detecta solo si está instalada la máquina virtual Java en la PC del usuario.

Ejemplos de ejecutables generados con esta herramienta: