Maverick

De WikiII

Archivo:MaverickLogo.gif

Contenido

Introducción

¿Qué es Maverick?

Maverick es un framework para desarrollo web que utiliza Java y J2EE basado en el Modelo-Vista-Controlador (MVC). Es un framework minimalista que se centra en la lógica MVC, permitiendo generar la presentación utilizando una amplia variedad de plantillas y lenguajes de transformación.

Maverick no es un framework diseñado por gente que construye frameworks, sino que está diseñado y construido por personas que realizan aplicaciones web y no está de acuerdo con la complejidad de las herramientas existentes.

Características principales

En principio combina las mejores características de Struts, WebWork y Cocoon2, sin embargo:

  • Maverick es un framework minimalista y cualquiera puede entenderlo fácilmente. No es un recetario que provea al programador de todo lo que necesite para desarrollar una aplicación web, puesto que ya existen una gran colección de conectores de bases de datos, servidores de aplicaciones, frameworks de prueba, lenguajes de plantillas, etc, ahí fuera.
  • Maverick es sencillo de entender, el código es fácil de entender y no tiene demasiado código y está diseñado para que sea fácilmente extensible mediante plugins. La idea de un controlador que construya un modelo que se obtenga renderizado por una vista es muy simple, por lo que el framework debería ser igual de simple.
  • Maverick es agnóstico en cuanto a tecnologías, puedes utilizar cualquier motor de plantillas que desees. Los ejemplos están hechos con JSF (con JSTL sin necesidad de librerías especiales de etiquetas), Velocity y Domify/XSLT. Los desarrolladores de Maverick usan los tres en su "vida real" para construir aplicaciones web.
  • Puedes ejecutar tu vista a través de una serie de transformaciones encadenadas. Maverick incluye transformaciones XSLT, DVSL, transformaciones de composición "envolventes", FOP y Perl. Puedes hacer de forma muy eficiente una cadena de transformaciones de varios tipos a la vez y especificar esto en una vista básica. Por supuesto que las tecnologías de transformación pueden definirse con plugins o por ti mismo de forma fácil.

También puedes para el proceso de transformación en cualquier punto y salida del contexto intermedio. Si estás usando XSLT, esta es una gran forma de producir código XML estático y construir tus plantillas de forma offline con herramientas estándar.

  • Tus comandos, controladores, vistas y transformadores se configuran con un método fácil XML. Para más flexibilidad puedes preprocesarlo con XSLT.
  • Maverick elegirá automáticamente entre diferentes vistas basadas en lenguajes de usuario, tipo navegador o cualquier otra característica. Y por supuesto es configurable con plugins.
  • Maverick soporta tanto controladores singleton tipo Struts (Acciones) y estilo Webwork "throwaaway".
  • Maverick es multiplataforma, portado a .NET y PHP.

Dependiendo de qué tecnología de plantillas escojas, te puede ser de interés alguna de las siguientes prestaciones:

  • Maverick puede automáticamente "domificar" (DOM) o "saxificar" (SAX) arbitrariamente objetos Java que XSLT puede usar sin el procesamiento de generar y analizar XML. XSLT puede ser utilizado como lenguaje de plantillas directamente en tu modelo usando JSP.
  • Para texto basado en motores de plantillas como JSP o Velocity, una forma elegante de aplicar un simple "look and feel" y un layout para establecer vistas es utilizar transformaciones "envolventes". La salida de los pasos previos está disponible como subsecuencia de pasos como una variable de tipo String, la cual puede ser colocada en cualquier lugar de la página.
  • Las transformaciones FOP permiten a tu aplicación producir archivos de tipo PDF, Postscript, PCL y media docena de otros formatos de documentos "al vuelo".
  • Una alternativa interesante a XSLT es DVSL. Es un lenguaje declarativo de plantilla creado tras XSLT pero basado en Velocity.

Uso de Maverick

Maverick incluye muchas aplicaciones de ejemplo que ilustran cómo crear una aplicación web básica, que pueden ser de gran utilidad.

Configuración de web.xml

A la hora de construir una aplicación Maverick, es necesario configurar el Dispatcher de servlets en el fichero web.xml. Todos los comandos con una extensión especial como, por ejemplo "*.m", se asignan al este servlet:

  <web-app>
     <display-name>Friendbook Web Application</display-name>
     <servlet>
        <servlet-name>dispatcher</servlet-name>
        <display-name>Maverick Dispatcher</display-name>
        <servlet-class>org.infohazard.maverick.Dispatcher</servlet-class>
        <load-on-startup>2</load-on-startup>
     </servlet>
     <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.m</url-pattern>
     </servlet-mapping>
  </web-app>


A continuación, pueden verse varios parametros iniciales para el Dispatcher:

  • configFile: Ruta al fichero de configuracion XML. Si no se especifica, por defecto es /WEB-INF/maverick.xml. Puede anularse configurando una atributo del contexto de aplicación con la clave Dispatcher.KEY_CONFIG_FILE.
  • configTransform: Ruta al fichero XSL que se usa para transformar el fichero de configuración Mverick antes de la carga. Si se deja sin especificar, no se produce ninguna transformación. Puede anularse configurando un atributo del contexto de aplicación con la clave Dispatcher.KEY_CONFIG_TRANSFORM.
  • currentConfigCommand: Muestra la configuracion XML actual, incluyendo cualquier transformación especificada por configTransform. Si tiene información comprometida en el fichero de configuración, asegurese de desabilitar este comando en su sistema.
  • reloadCommand: Recarga el fichero de configuración y toda la información asociada almacenada en caché. Este comando no para a maverick, si no que la ejecución continúa con la configuración antigua hasta que los nuevos datos están completamente cargados y listos. Ya que hace uso de gran capacidad de procesamiento, sería conveniente desactivarlo o dejarlo sin definir.
  • limitTransformsParam: Especifica el nombre de un parámetro de consulta especial que limita el numero de transformaciones que podrán aplicar. Permite renderizar cualquier página que se detenga a la mitad y enviar la resultado intermedio al navegador.
  • defaultRequestCharset: Permite a las aplicaciones web anular el conjunto de caracteres utilizado para decodificar los parametros de solicitud HTTP. Si no se define, se toma ISO-8859-1 por defecto.
  • reuseMaverickContext: Si se configura como verdadero, el objeto contextual Maverick persistirá múltiples invocaciones en la misma solicitud. Debido a los problemas que causa con SiteMesh, por defecto es falso.

Configuración de maverick.xml

El centro neurálgico de una aplicación Maverick es el fichero maverick.xml. Este fichero contiene toda la información sobre los comandos disponibles, sobre el código asociado con comandos específicos y sobre vistas resultantes de un comando.

Por defecto, este fichero reside en WEB_INF/maverick.xml en la aplicación web. La localización es configurable como un parámetro de inicio para el servlet Dispatcher.

El esquema del fichero de configuración es bastante flexible porque la mayor parte puede interpretarse como módulos conectables. Cada uno de los tipos de vista y de transformación están definidos por instancias de clases especiales de factoría que pueden configurarse en el elemento modules. La documentación para vistas individuales o tipos de transformación se encuentra en el javadocs de la factoría.

Por convención, las siguientes construcciones se consideran equivalentes y pueden usarse indistintamente:

  • <element attr="blah"/>
  • <element><attr value="blah"/></element>

Tecnología de plantillas

JSP

Usar JSP con Maverick es muy directo. Utiliza el tipo de vista del documento para referenciar tus documentos JSP. El modelo se colocará en el atributo petición del servlet para que tu JSP pueda acceder a él. La clave por defecto es "model", pero tanto el valor por defecto como la vista individual pueden ser configuradas. Los parámetros (cualquiera definido con elementos "param" en el fichero de configuración o definido por tu aplicación llamando a "ControllerContext.setParam()") también son colocados en el contexto de la petición.

Las vistas de documentos permiten transformaciones. La aplicación de ejemplo friendbook-jsp demuestra el uso de transformaciones de documentos, que proveen de contenido de pasos previos para sub-pasos en secuencia en forma de String en la petición servlet de atributos.

XSLT

Hay varias formas de trabajar con XSLT en Maverick. XSLT por si mismo está disponible como tipo de transformación, no como vista. Esto significa que puedes aplicar transformaciones XSLT a cualquier vista que soporte transformaciones.

La manera tradicional es utilizar vistas de documento como por ejemplo JSP para generar texto XML el cual será transormado. Esto funciona bien pero es engorroso y añade mucha carga al proceso.

Un mecanismo mucho más elegante se ha incluido en el paquete de Maverick opt-domify. En lugar de usar un lenguaje de plantillas para generar texto XML del modelo, Domify usa Java para adaptar el modelo a un DOM facade. El tipo de vista "domificado" envuelve el modelo con un adaptador Domify y entonces toma la fuente DOM de la transformación.

Este enfoque no es sólo más eficiente (sin necesidad de analizar XML), sino que permite a los diseñadores trabajar inmediatamente con XSLT como lenguaje de plantilla. Desde que las transformaciones XSLT de Maverick permiten la transformación, los procesos pueden deternerse en cualquier paso, suendo fácil obtener XML real, con el que los diseñadores pueden trabajar offline.

El paquete opt-domify contiene una versión domify de la aplicación de ejemplo friendbook. Las clases del controlador son las mismas que estos usan para friendbook-jsp; sólo maverick.xml y las plantillas son distintas.

Domify fue creado por Maverick, pero ha dado pie a un proyecto aparte, cuyo desarrollo continúa.

Velocity

De muchas maneras, usar Velocity con Maverick es como usar JSP. Gracias a la integración Jakarta Struts, Velocity produce un VelocityViewServlet, el cual permite a tu contenedor web manejar plantillas de Velocity de la misma manera que con JSP. Todas las peticiones hechas con ficheros Velocity (de extensión *.vm) son mapeadas a este servlet, que enmascara el atributo servlet como el "Context" Velocity.

Para usar Maverick con Velocity, simplemente registra el "VelocityViewServlet" en tu descriptor "web.xml" y utiliza tipo de vista de documento normal Maverick. El modelo estará disponible en el contexto con la clave del modelo (esto es configurable como en JSP). Puedes usar también cualquier tipo de transformación con estas vistas, incluyendo documentos transformadores. Puedes usar Velocity para escribir esos documentos transformadores.

El paquete opt-velocity no es necesario para utilizar Velocity con Maverick, de todas formas provee de cierta asistencia. Incluye una versión del ejemplo del friendbook con Velocity, así como una versión reciente del VelocityViewServlet. También incluye un nuevo tipo de transformación basado en DVSL, la tecnología desarrollada recientemente por el equipo Velocity.

DVSL es una tecnología muy similar, tanto en la forma como en el propósito, a XSLT. Es declarativa, con una sintaxis del lenguaje basado en XSLT pero que usa Velocity para generar la salida. Esto conlleva un número de ventajas y desventajas que está fuera del alcance de este documento.

Internacionalización

Hay muchas maneras de internacionalizar una aplicación web, dependiendo muchas de ellas del lenguaje específico de plantillas que se esté usando. Con todo, Maverick ofrece bastante asistencia con esta tarea con el fin de conformar otros tipos de "customización visual", tal como proveyendo un comportamiento especifico del navegador o mostrando WML.

Los dos conceptos importantes en Maverick son modos y shunts. Los modos permiten definir múltiples vistas con el mismo nombre. Los shunts son modulos conectables de Maverick que determinan en tiempo de ejecución cuál de los modos debe ser ejecutado.

Se puede crear una aplicación Maverick que usa shunts configurando una shunt-factory en la sección modules. La factoría se usará para crear un shunt para cada vista nombrada.

  <maverick version="2.0" default-view-type="document">
     <modules>
        <shunt-factory provider="org.infohazard.maverick.shunt.LanguageShuntFactory"/>
     </modules>
     <commands>
        <command name="runQuery">
           <controller class="org.foo.Query"/>
           <view name="success" path="en/queryResults.jsp"/>
           <view name="success" mode="fr" path="fr/queryResults.jsp"/>
           <view name="success" mode="de" path="de/queryResults.jsp"/>
           <view name="error" path="en/queryError.jsp"/>
           <view name="error" mode="fr" path="fr/queryError.jsp"/>
           <view name="error" mode="de" path="de/queryError.jsp"/>
        </command>
     </commands>
  </maverick>

La LanguageShuntFactory construye shunts que determinan el modo basándose en el valor de la cabecera Accept-Language de la solicitud HTTP. El controlador determinaría que nombre de vista renderizar; el shunt determina que modo debería usarse.

Normalmente, Maverick proporciona la LanguageShuntFactory, pero las interfaces Shunt y ShuntFactory son muy sencillas y fáciles de implementar.

Paquetes opcionales

Maverick es un framework extendible y muchas funcionalidades están implementadas como módulos que se agregan como plugins. Ahora se presenta una vista general de varios paquetes disponibles para descargar en el sitio web de Maverick.

opt-domify

Domify es una librería que adapta JavaBeans (y colecciones) a la representación del W3C DOM. Originalmente fue creado como parte de Maverick, pero se ha separado en un proyecto distinto.

Este paquete opcional incluye un tipo de vista Maverick para "domificar" vistas y una versión de la aplicación de ejemplo Friendbook, la cual utiliza Domify y XSLT para la presentación.

opt-betwixt

Betwixt es una alternativa a Domify. Puede generar una serie de eventos SAX desde el modelo JavaBean.

Apuntar que esta opción está menos probada que Domify.

opt-fop

Apache FOP es un procesador que puede transformar XSL-FO (objetos formateados) en una gran variedad de formatos de presentación, incluyendo PDF y Postscript. El paquete opt-fop provee de los servicios FOP para como un tipo de transformación Maverick.

Por ejemplo, puedes utilizar XSLT para transformar tu modelo en XSL-FO, entonces utiliza la transformación FOP para emitir un PDF de vuelta al usuario.

opt-velocity

Para usar Velocity con Maverick no es necesario un nuevo tipo de vista. En cambio, las vistas normales de documento son utilizadas en conjunción con el "VelocityViewServlet" que fue originalmente desarrollado por Struts. Utilizar Velocity con Maverick es muy parecido a JSP.

Este paquete incluye tres cosas:

  • Una versión reciente del VelocityViewServlet.
  • La aplicación de ejemplo Friendbook usando Velocity.
  • Un tipo de transformación Maverick para DVSL. DVSL es un lenguaje de transformación experimental que proviene de XML, que ha salido tras XSLT pero basado en Velocity.

opt-perl

Ofrece un tipo de transformación Maverick que ejecuta la salida a través de Perl.

opt-struts

Pone a nuestra disposición un número de herramientas de ayuda para migrar una aplicación Struts a Maverick.

Funcionamiento de Maverick

Hay dos fases en la vida de una aplicación Maverick ejecutable. la primera es la fase de carga, que ocurre una vez y en la que se utiliza el fichero de configuración para construir un árbol de objetos de flujo de trabajo (workflow) La segunda es la fase de ejecución, en la que se sirven las solicitudes HTTP. Maverick está diseñado soportar mucha carga de trabajo durante la fase de carga para que la ejecución sea lo más rápida posible.

El árbol de flujo de trabajo construido durante la carga representa todas las posibles rutas de ejecución para servir una solicitud HTTP. Se compone de objetos que implementan distintas interfaces y muchos de los objetos son creados por factorias conectables.

De modo que, en tiempo de ejecución, una solicitud HTTP es servida así:

1. El Dispatcher recibe la solicitud y mira en un Map el command asociado con la URL Command.go() 2. Command llama a Controller.go() El controlador determina opcionalmente el objeto modelo (utilizando un método de ControllerContext) y devuelve una cadena indicando el nombre de la vista a renderizar. 3. Command busca en el Map la vista a renderizar. Se llama a View.go() y pasa a un objeto ViewContext. 4. Si los shunt están activos y pueden utilizarse, la vista será una instancia de ViewShunted. este objeto utiliza Shunt para encontrar la vista a renderizar. Este mecanismo es específico del shunt. 5. La vista genera algún contenido y lo manda a TransformStep, obteniendo ViewContext.getNextStep(). Si no hubiera transformaciones definidas, este paso sería una implementación especial que mandaría directamente la salida con la respuesta real. 6. Los objetos TransformStep se encadenan para que uno pase información al siguiente. Eventualmente, la información cosigue pasar a la implementación especial que manda la salida con la respuesta real.

Ampliar Maverick

Maverick fue diseñado para ser altamente extendible y ampliable. Normalmente existen cuatro formas de ampliar Maverick: factorías de vistas personalizadas, factorías de transformaciones personalizadas, factorías de maniobras personalizadas y controladores personalizados. Maverick utiliza mecanismos que nos brindan la funcionalidad básica para ampliarse.

Tipos de vistas personalizadas

Cualquier puede agregar un tipo de vista personalizada a Maverick por un plugin en su propia implementación de org.infohazard.maverick.flow.ViewFactory. Si un fichero de configuración define la factoría como view-factory en la sección modules, la factoría del objeto será creada e inicializada con el código XML el cual definirá la factoría. De esta forma los elementos hijo y los atributos pueden ser utilizados para configurar la factoría.

Cuando se procesa el archivo de configuración, Maverick identifica qué factoría ha generado los objetos View basados en el atributo type. La factoría es entonces preguntada para crear una instancia de View basada en el fragmento de XML en el cual está definida la vista.

Tipos de transformaciones personalizadas

Crear un TransformFactory personalizado es muy parecido a la creación de una ViewFactory personalizada. El framework reconoce automáticamente elementos transform dentro de elementos view y construye la cadena apropiada Transform.

Configuración del esquema de Maverick

maverick

Elemento raíz de la configuración de Maverick

Atributos

Nombre Tipo Descripción Valor por defecto
version CDATA Versión del esquema "2.0"
default-view-type CDATA Tipo para los nodos view que no tienen un atributo type explícito "document"
default-transform-type CDATA Tipo para los nodos transform que no tienen un atributo type explícito "document"

Ejemplo

  <maverick version="2.0" default-view-type="document" default-transform-type="xslt">
     <modules>
        ...
     </modules>
     <views>
        ...
     </views>
     <commands>
        ...
     </commands>
  </maverick>

modules

Módulos que se pueden enlazar

Atributos

No tiene.

Ejemplo

  <maverick version="2.0" default-view-type="domify" default-transform-type="xslt">
     <modules>
        <view-factory type="domify" provider="org.infohazard.maverick.opt.view.DomifyViewFactory"/>
        <transform-factory type="dvsl"
         provider="org.infohazard.maverick.opt.transform.DVSLTransformFactory"/>
        <transform-factory type="xslt"
         provider="org.infohazard.maverick.transform.XSLTransformFactory">
           <lazy-load-templates value="true">
        </transform>
        <shunt-factory provider="org.infohazard.maverick.shunt.LanguageShuntFactory"/>
        <controller-factory provider="org.infohazard.maverick.flow.DefaultControllerFactory">
     </modules>
     ...
  </maverick>

view-factory

Configura un tipo de vista

Atributos

Nombre Tipo Descripción Valor por defecto
type CDATA Clave única para este tipo de vista Obligatoria
provider CDATA Nombre completo de la clase que implementa org.infohazard.maverick.flow.ViewFactory Obligatorio

Ejemplo

Ver ejemplo de modules

transform-factory

Configura un tipo de transformación

Atributos

Nombre Tipo Descripción Valor por defecto
type CDATA Clave única para este tipo de transformación Obligatoria
provider CDATA Nombre completo de la clase que implementa org.infohazard.maverick.flow.TransformFactory Obligatorio

Ejemplo

Ver ejemplo de modules

shunt-factory

Configura un tipo shunt

Atributos

Nombre Tipo Descripción Valor por defecto
provider CDATA Nombre completo de la clase que implementa org.infohazard.maverick.flow.ShuntFactory Obligatorio

Ejemplo

Ver ejemplo de modules

controller-factory

Configura un controlador

Atributos

Nombre Tipo Descripción Valor por defecto
provider CDATA Nombre completo de la clase que implementa org.infohazard.maverick.flow.AbstractControllerFactory Obligatorio

Ejemplo

Una factoria de controlador personalizada:

  public class AllwaysReloadControllerFactory extends AbstractControllerFactory{
     public final static String ATTRIB_ALLWAYS_RELOAD="allways-reload";
     private boolean allwaysReload=false;
     private static Log log=LogFactory.getLog(AllwaysReloadControllerFactory.class);	  
     public void init(Element factoryNode, ServletConfig servletCfg)
     throws ConfigException{
        String allwaysRealoadS=XML.getValue(factoryNode,ATTRIB_ALLWAYS_RELOAD);
        if(allwaysReloadS!=null){
           allwaysReload=Bolean.valueOf(allwaysReloadS).booleanValue();
           log.info("allwaysReload set to "+ allwaysReload);
        }else{
           log.info("attribute"+ ATTRIB_ALLWAYS_RELOAD +" not set");
        }
     }  
     protected Controller decorateController(Element controllerNode, Controller controller)
     throws ConfigException{
        if(allwaysReload) {
           controller = new AllwaysReloadControllerAdapter(controller.getClass());
        }
        // let the framework do any additional decorating (ControllerWithParameters)
        controller = super.decorateController(controllerNode, controller);
        return controller;
     }
  }

Usa este adaptador personalizado:

  public class AllwaysReloadControllerAdapter implements ControllerSingleton {
     protected Class controllerClass;
     protected Map params = null;
     private Element controllerNode;
     public AllwaysReloadControllerAdapter(Class controllerClass) {
        this.controllerClass = controllerClass;
     }
     public void init(Element controllerNode) throws ConfigException {
        this.controllerNode = controllerNode;
     }
     public String go(ControllerContext cctx) throws ServletException {
        try {
           Controller instance = (Controller)this.controllerClass.newInstance();
           if(instance instanceof ControllerSingleton) {
              ((ControllerSingleton)instance).init(controllerNode);
           }
           return instance.go(cctx);
        }
        catch (Exception ex) {
           throw new ServletException(ex);
        }
     }
  }
  

Y se define en el documento de configuración de la siguiente manera:

  <maverick version="2.0">
     <modules>
        <controller-factory provider="nl.openedge.util.maverick.CustomControllerFactory">
           <allways-reload value="true"/>
        </controller-factory>
     </modules>
     ...
  </maverick>

views

Vistas que pueden ser referenciadas por comando

Atributos

Nombre Tipo Descripción Valor por defecto
mode CDATA Modo considerado para las vistas si no se especifica ningún modo -

Ejemplo

  <maverick version="2.0">
     <views>
        <view id="loginRequired" path="en/loginRequired.jsp"/>
        <view id="loginFailed" path="en/loginFailed.jsp"/>
     </views>
     <views mode="de">
        <view id="loginRequired" path="de/loginRequired.jsp"/>
        <view id="loginFailed" path="de/loginFailed.jsp"/>
     </views>
     ...
  </maverick>

commands

Contiene comandos

Atributos

No tiene.

Ejemplo

  <maverick version="2.0">
     <commands>
        <command name="welcome">
           ...
        </command>
        <command name="signup">
           ...
        </command>
     </commands>
  </maverick>

command

Determina el comportamiento de un comando

Atributos

Nombre Tipo Descripción Valor por defecto
name CDATA URI asociada con este comando Obligatorio

Ejemplo

  <maverick version="2.0" default-view-type="document">
     <commands>
        <command name="welcome">
           <view path="hello.html"/>
        </command>
     </commands>
  </maverick>

controller

Asocia un controlador con un comando determinado

Atributos

Nombre Tipo Descripción Valor por defecto
class CDATA Nombre de la clase que actuará como controlador, implementará org.infohazard.maverick.flow.Controller o org.infohazard.maverick.flow.ControllerSingleton Obligatorio

Ejemplo

  <maverick version="2.0" default-view-type="document">
     <commands>
        <command name="viewReport">
           <controller class="org.foo.Report">
              <param name="color" value="red"/>
           </controller>
           <view name="success" path="good.jsp"/>
           <view name="error" path="bad.jsp"/>
        </command>
     </commands>
  </maverick>

view

Define una vista como cualquier parte de un comando o una vista referenciable globalmente

Atributos

Nombre Tipo Descripción Valor por defecto
type Factoria de Vista Uno de los tipos registrados como view-factory o alguno por defecto (redirect, document, trivial, null) valor de default-view-type o, si no está especificado, "document"
id CDATA Permite referencias de los comandos Obligatorio si su padre es views
name CDATA Cadena que devuelve el controlador para identificar qué vista renderizar Valor de ref
ref ID de vista previamente definido Enlaza con un id de una vista global -
mode CDATA Ver sección de Internacionalización -

Ejemplo

  <maverick version="2.0" default-view-type="document">
     <views>
        <view id="ugly" path="ugly.jsp"/>
        <view id="fugly" path="fugly.jsp"/>
     </views>
     <commands>
        <command name="viewReport">
           <controller class="org.foo.Report"/>
           <view name="good" path="good.jsp">
              <param name="color" value="red"/>
           </view>
           <view name="bad" path="bad.jsp"/>
           <view ref="ugly"/>
           <view name="explicitname" ref="fugly"/>
        </command>
     </commands>
  </maverick>

transform

Define una transformación en vistas que pueden soportarlo

Atributos

Nombre Tipo Descripción Valor por defecto
type Factoria de transformación Uno de los tipos registrados como transform-factory o uno por defecto (document, xslt) valor de default-transform-type o, si no está especificado, "document"

Ejemplo

  <maverick version="2.0" default-view-type="document" default-transform-type="xslt">
     <commands>
        <command name="runQuery">
           <controller class="org.foo.Query"/>
           <view name="success" path="queryResults.jsp">
              <transform path="firstStage.xsl"/>
              <transform path="lookAndFeel.xsl"/>
           </view>
           <view name="error" path="queryError.jsp">
              <transform path="errorStage.xsl">
                 <param name="color" value="red"/>
              </transform>
              <transform path="lookAndFeel.xsl"/>
           </view>
        </command>
     </commands>
  </maverick>

Referencias

Herramientas personales