28-07-2006 Raul Vicente
Últimamente he estado leyendo sobre JBullet por si alguien no ha leído nada sobre él comentaré que JBullet es un framework Web en Java que une los conceptos de Struts y RoR, es decir, el patrón MVC pero dejando atrás los tediosos archivos de configuración de Java y apostanto por las Conventions que tan buen resultado han dado en Ruby on Rails.
El caballo de batalla de este framework es acabar con los archivos de configuración así pues iré comentando los aspectos más interesantes del framework con trozos de código para que se entienda.
La configuración es similar a la de Struts, una vez añadidas las librerías al classpath de la aplicación y añadidas las líneas de código pertinentes en el archivo web.xml ya estaremos en disposición de poder utilizar el framework. La líneas a añadir en el archivo web.xml son casi identicas a las que había que poner para usar Struts así que los programadores de Java no encontrarán problemas los demás con un simple vistazo a la documentación ya podrán ponerse en marcha.
A diferencia de stuts no tendremos ningún archivo de configuración como podía ser el archivo struts-config.xml. El único archivo de configuración es el archivo jbullet.properties en el que especificaremos en que paquete colocaremos nuestros controllers, nuestros model y nuestros views. El archivo tiene el siguiente aspecto y debe colocarse en el directorio raíz de nuestra aplicación web.
#The controllers’ package
jbullet.controller.package=controller
#The view folder
jbullet.view.package=/WEB-INF/view
#The model package
jbullet.model.package=model
#The resource bundle name
#by default it’s application
#don’t mention .properties extension and any locale
jbullet.resource=application
#The resource reader class
#Should extend org.jbullet.resource.MessageResourceReader class
#By default it’s PropertyMessageResourceReader
jbullet.resource.reader=PropertyMessageResouceReader
#The response no-cache attribute tru=no-cache,false=yes do cache
jbullet.config.cache=true
#The default locate of the application
#The user locale is ignored if this element is specified
jbullet.config.locale=en
Este archivo es mucho más fácil de manterner que los xml a los que se está habituado en el mundo java y no crece de manera exponencial segun va creciendo nuesta aplicación.
JBullet es la implementación de un patrón MVC y por tanto necesitaremos implementar estos tres elementos para poder desarrollar nuestras aplicaciones.
Siguiendo la comparación con Struts los Controllers son lo que en Struts se conocían como Actions, en Struts estas clases extendían la clase Action y en JBullet se considera que un Controller( Convention) es toda clase que se encuentre en el paquete de Controllers (especificado en el archivo jbullet.properties) y acabe en Controller, se aconseja que nuestros controllers extiendan la clase BaseController ya que está clase contiene los objetos Context, Request y Response aunque estos objetos pueden inyectarse como se muestra en el ejemplo y no extender la clase BaseController si eso nos fuera útil.
Ejemplo1 Extendiendo BaseController:
package controller;
import org.jbullet.controller.BaseController;
public class HelloController extends BaseController{
public void index(){
renderText(“Hello World”);
}
public void wow(){
renderText(“Hello from WOW”);
}
}//End Listing 1.1
Ejemplo2 Inyectando
package controller;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import org.jbullet.annotation.Dependency;
import org.jbullet.annotation.DependencyType;
@Dependency({DependencyType.RESPONSE})
public class Hello2Controller {
//The response we need
HttpServletResponse response;
//The setter method called by the dependency injector
public void setResponse(HttpServletResponse response){
this.response=response;
}
//Here goes the handler methods
public void index(){
try{
response.getWriter().print(“Hello World from Hello2″);
response.getWriter().flush();
}catch(IOException ex){
//Do whatever you like with the exception
}
}
public void wow() throws IOException{
response.getWriter().print(“Hello from WOW in Hello2″);
response.getWriter().flush();
}
}//End Listing 2
Una ventaja importante de los controllers de JBullet frente a los Action de Struts son la posibilidad de poner varios métodos para realizar varias acciones desde un mismo controller, es decir , el controllador de aplicaciones tendrá los métodos de listar aplicaciones ,editar ,nueva y borrar aplicación. Esto era difícil con Struts ya que había que pasar un parámetro extra bien en el ActionForm o por la URL y poner un case en el método execute a la vez que se complicaba el archivo struts-config.xml. Con JBullet esto es muy sencillo se puede llamar a un método u otro de la siguiente manera:
http://localhost/QuickStart/controller/Custormer/ para el método index
o http://localhost/QuickStart/controller/Custormer/wow/ para el método wow
Al poner /Customer/ buscará la clase CustomerController en el paquete de controllers y al poner wow buscará dicho método en esa clase si no existieran elevaría una excepción si no se le pone nada por defecto busca el método index.
Se utilizan las annotations de la JDK 1.5 para especificarle al inyector de JBullet que objeto ha de inyetarle a la clase. Si en vez de inyectar el objeto Response se quisiera inyectar un Bean nuestro se tendría que utilizar la directiva @Bean para indicarle al inyector que busque la clase en el paquete de Models.
Para implementar las Views JBullet supone por defecto que se van a realizar utilizando jsps y que estos se encuentran en la ruta especificada en el fichero jbullet.properties.
Se dispone de tags especificos para los jsps como en el caso de Struts y para la navegación entre vistas no hace falta ningún fichero de configuración ya que en el controller al especificarse :
ViewResolver.forwardTo(“register”,request,response);
Jbullet buscará el jsp register.jsp y redirigirá la petición si no lo encuentra elevará una excepción.
Para implementar los Models JBullet utiliza los típicos Beans de siempre que mapean una fila de una tabla de la BD ( los beans de la capa de negocio de nuestra aplicación ) , aquí encontramos una gran diferencia con Struts ya que Struts utilizaba los ActionForms que a priori mezclaban la lógica de Negocio y presentación más tarde se solucionó ese problema permitiendo que se pudiera embeber un bean creado por el usuario dentro del ActionForm pero no dejaba de ser un parche JBullet propone una solución limpia desde el principio.
La internalización de la aplicación está pensada como en struts se dispone de un archivo por cada idioma. El archivo es applicaction_%idioma%.properties de tal manera que cuando cambie el objeto locale se cargue el archivo de idioma que proceda.
Para cada texto en este archivo sólo hay que especificar clave por la que se quiere acceder al texto y el texto en sí.
Por ejemplo en castellano:
aplicación.cabecera=Listado de aplicaciones.
En inglés:
aplicacion.cabecera=Application List.
Las única duda que me genera el framework es que en la documentación nos se comenta nada acerca del soporte de validaciones de los formularios pero en verdad espero que esté pensado como tags a colocar en los JSPs y se hulla de las validaciones tal y como se hacen en Stuts con 2 ficheros de configuración.
Los que quieran indagar más sobre el tema pueden acceder a la documentación oficial en esta url:
https://jbullet-web.dev.java.net/