Introducción
Para el propósito de este post, asumiré que el lector tiene conocimientos previos sobre la configuración de Hibernate y su uso. De lo contrario recomiendo este tutorial para una rápida iniciación.
Sitebricks de Google esta escrito en Java y basado en su framework de injección de dependencias Guice.
Hibernate es el servicio para persistencia y consulta orientado a objetos.
El uso de ambas tecnologías en un desarrollo es una manera profesional, escalable y mantenible. Lo siguiente es un ejemplo que muestra como combinarlas.
Supongamos que tenemos una aplicación donde el usuario sube sus imágenes y la información de estas es almacenada en la tabla Uploads, haremos una página que despliegue las imágenes que han sido guardadas, empezemos!!! .
SQL
CREATE TABLE `Uploads` ( `ID` int(11) NOT NULL auto_increment, `size` varchar(10) NOT NULL default '', `name` varchar(250) default NULL, `uploadDate` date NOT NULL, `uploadTime` time NOT NULL, `ip` varchar(45) default NULL, `step` int(2) NOT NULL default '0', `active` int(1) NOT NULL default '1', PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; INSERT INTO `uploads` (`ID`, `size`, `name`, `uploadDate`, `uploadTime`, `ip`, `step`, `active`) VALUES (1, '17346', 'pictures/0d42.jpg', '2009-09-28', '', '127.0.0.1', 1, 1), (2, '17346', 'pictures/7f03.jpg', '2009-09-28', '', '127.0.0.1', 1, 1), (3, '21671', 'pictures/48be.jpg', '2009-09-28', '', '127.0.0.1', 1, 1), (4, '21671', 'pictures/73b0.jpg', '2009-09-28', '', '127.0.0.1', 1, 1);
web.xml
<filter>
<filter-name>webFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>webFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>com.google.sitebricks.web.MyGuiceCreator</listener-class>
</listener>
Example.html
<html>
<head>
<style>
.listed li{
list-style:none;
border:1px solid #CCC;
padding:4px;
}
</style>
</head>
<body>
<!-- simple access -->
MESSAGE : <strong>${message}</strong> <br/>
<!-- Hides or shows annotated tag content -->
@ShowIf(true)
<div> CONDITIONAL MESSAGE : listing ${uploads.size()} elements </div> <br/>
<h3>D List</h3>
<!-- Repeats annotated tag content over provided collection -->
<ul class="listed">
@Repeat(items=uploads, var="tr", pageVar="l")
<li>${tr.name}</li>
</ul>
</body>
</html>
En este template se muestra el uso de algunos de los bricks que han sido documentados de la pagina wiki del proyecto aqui .
MyGuiceCreator.java
public class MyGuiceCreator extends GuiceServletContextListener {
@Override
public Injector getInjector() {
return Guice.createInjector(new SitebricksModule() {
@Override
protected void configureSitebricks() {
//scan class Example's package and all descendants
scan(Example.class.getPackage());
}
});
}
static public class Objective{
private String name="DEFAULT";
public Objective(String name) {
this.name = name;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
@At("/listExample")
static public class Example {
private static ArrayList<Uploads> uploads = (ArrayList<Uploads>) (new UploadsDAO()).findAll();
private static ArrayList<Objective> list = new ArrayList<Objective>() {{
add(new Objective("insane"));
add(new Objective("insane2"));
add(new Objective("insane3"));
}};
private String message = " Hey Dude , ";
public ArrayList<Objective> getList(){
return (ArrayList<Objective>) list.clone();
}
public ArrayList<Uploads> getUploads(){
return (ArrayList<Uploads>)uploads;
}
public String getMessage() { return message; }
}
}
De lo anterior se resume lo siguiente:
- MyGuiceCreator ha sido declarada como listenerClass en el archivo web.xml.
- La anotación ‘At($exp)’ le indica a la aplicación que escuche en ${host}[:${port}]/${context}/ $exp’
- La clase Example buscara el archivo ‘$classname.html’ como template base.
Lo que se debe saber:
- Los getters deben estar incluidos en la clase si se trata de acceder a ellos desde el template.
- En el uso de listas , los tipos de retorno del metodo y el tipo de dato deben conicidir.
Por ultimo, el resultado se muestra abajo.

A donde ir desde aquí.
item1