Desarrollo Web con componentes: Controllers en Wicket

Controllers

Vemos que por momentos el rol del controller en wicket está definido en las mismas clases que representan la vista. Por ejemplo:
parent.addChild(new XButton("limpiar").onClick = [| buscador.clear ])

o el equivalente en Java:
parent.add(new Button("limpiar") {
            @Override
            public void onSubmit() {
                BusquedaCelularesPage.this.buscador.clear();
            }
        });

En este caso, el Button además de ser un componente de la interfaz, y tener comportamiento propio de la vista, tiene el comportamiento asociado al click.
Esto es porque wicket esta diseñado basado en la herencia, en lugar de la composición. Al menos para estos casos.
En Arena estas resposabilidades estaban separadas entre el Button y el Action

IConverter

Estos objetos son similares a los Adapters que teníamos en Arena. Se utilizan como pequeños objetos una única reponsabilidad de saber convertir de una representación de texto (String) a objetos modelo y viceversa. 

Ver javadoc de org.apache.wicket.util.convert.IConverter<C>Y la explicación desde Wicket.

IBehaviors

Todo componente puede ser configurado con objetos IBehavior. Éstos son algo así como "plugins" o comportamientos que podemos agregarle a los controles. ¿Qué tipo de comportamiento? Bueno, la interfaz es bastante genérica, y básicamente un IBehavior puede:
  • ser notificado cuando se asocia a un componente, con lo cual puede manipular su modelo
  • intervenir en la renderización (generación del html)
Entonces, por ejemplo se puede utilizar un IBehavior para cambiar dinámicamente el valor del atributo "class" de un tag, es decir la clase CSS, en base al modelo.

Acá hay un ejemplo donde hacemos esto en base a si un Celular recibe o no notificaciones (en Java):
item.add(new AttributeModifier("class", true, new Model()) {
                    @Override
                    protected String newValue(String currentValue, String replacementValue) {
                        return item.getModelObject().isRecibeResumenCuenta() ?
                                "recibe" : "norecibe";
                        
                    }
                });

Existen varias implementaciones de IBehavior, por ejemplo para realizar acciones a través de Ajax. Para más detalle pueden mirar la jerarquía de IBehavior.