- Esta diseñado para ser amable con la memoria mientras se busca la mayor rapidez de - ejecución posible. Equilibrandolo finalmente con la sencillez de configuración y - mantenimiento. Haciendolo perfecto tanto para grándes como pequeñas aplicaciones. - - El diseño interno de QCore está basado en técnicas vistas en multitud de frameworks actuales, pero tiene su propia implementación, mejornado la integración y eliminando código e instancias innecesiarias. - - Una de esas técnicas es la capacidad de configurar el framework usando un archivo - de contexto, como hace Srping pero en vez - de usar una estructura en XML, usa un lenguaje propio, facilitando enormemente la - lectura y modificación de dicho archivo. - - O Ibatis, para el acceso a base de datos. - Plasmando en este mismo fichero de confugración la configuración de acceso a datos, y - las queries que atacan a esta.
- Una peculiaridad de QCore es la posibilidad de definir el engine de base de datos - usado, y poder realizar multiples queris para los distintos engines.
- De esa manera QCore es capaz de decidir la query a usar dependiendo del engine del - acceso a datos, y por lo tanto facilitar el cambio de engine de una base de datos a - otra sin penalización en el desarroyo. -
- QCore busca por defecto el archivo de contexto qcore.ctx dentro de META-INF. Se publican - unos archivos .ctx de ejemplo para la configuración inicial.
- Añadir QCore.jar como libreria de aplicación, y añadir al META-INF de la aplicación - web los archivos de ejeplo situados en doc/META-INF.
- Editar el web.xml, añadiendo el correspondiente filtro, es recomendable usar este filtro como primer filtro -
-<filter> - <filter-name>SessionFilter</filter-name> - <filter-class>qcore.WebFilter</filter-class> -</filter> - -<filter-mapping> - <filter-name>SessionFilter</filter-name> - <url-pattern>*.do</url-pattern> -</filter-mapping> -<filter-mapping> - <filter-name>SessionFilter</filter-name> - <url-pattern>*.jsp</url-pattern> -</filter-mapping> -<filter-mapping> - <filter-name>SessionFilter</filter-name> - <url-pattern>*.html</url-pattern> -</filter-mapping> --
Estructura:
- provider <name> default <defaultname>{
- <implname>
- <implname>
- }
-
- El nombre <name> ha de coincidir con el de la clase del proveedor (sin el paquete)
- El nombre <defaultname> ha de estar en la lista de <implname>
- Los proveedores adicionales han de estar listados en <implname>
- Estructura:
- object [<name>] class <class>{[(<parameter>[,<parameter>,...])
- [<property>=<value>]
- [<property>=<value>]
- [...]
- }
-
- El nombre <name> ha de ser único entre todas las definiciones del contexto,
- excepto con las definiciones de queries. La clase <class> ha de un nombre
- completo de una clase instanciable. El parametro <parameter> son los parametros
- del constructor. Tanto <property> como <value> se usan para asignar
- propiedades de la clase mediante su seter o directamente en la propiedad privada.
- Estructura:
- array [<name>] of <class> {
- [<value>]
- [<value>]
- [...]
- }
-
- El nombre <name> ha de ser único entre todas las definiciones del contexto, excepto con las definiciones de queries
- El valor <value> se usa para definir los vlares del array
- Estructura:
- list [<name>]{
- [<value>]
- [<value>]
- [...]
- }
-
- El nombre <name> ha de ser único entre todas las definiciones del contexto, excepto con las definiciones de queries
- El valor <value> se usa para definir los vlares del array
- Estructura:
- map [<name>] {
- [{<key>,<value>}]
- [{<key>,<value>}]
- [...]
- }
-
- El nombre <name> ha de ser único entre todas las definiciones del contexto, excepto con las definiciones de queries
- La clave <key> es la clave del HashMap
- El valor <value> es el valor para la clave <key>
-Estructura: - null -- Es la definicion del valor null -
Estructura: - "<value>" -- El valor <value> es el contenido del String sin cambios. -
Estructura: - <value> -- El valor <value> es un número, usando el punto "." para decimales -
Estructura: - true|false -- Literal sin commillas, true para verdadero y false para falso. -
Estructura:
- query <name> [engine <enginename>|any] [type <type>] { <querystr> }
-
- El engine ha de coincidir con el especificado en el acceso a datos (case sensitive) any para cualquera,
- si no se especifica engine, se asume any.- Querystr puede contener información adicional usando la almoadilla como caracter de escape: -
-
-
- ## Hace referencia a un tipo escalar unico -
- #[<numero indice>]# Hace referencia a un elemento de un array Ex: #1#,#2#,#10# -
- #<nombre miembro># Hace referencia a una propiedad de un objeto, o a una clave en un hashmap Ex: #userName#,#userPwd# -
-
-object QCoreConf class nihao.QCoreConf{
- loginConf=object class nihao.login.LoginConf{
- modules=array of nihao.login.ILoginModule{
- //object class nihao.login.LoginModuleSSL{}
- object class nihao.login.LoginModuleRequest{}
- };
- pageLogin="login.jsp";
- pageEnd= "end.jsp";
- pageError="error.jsp";"
- pageForbidden="forbidden.jsp";
- excluded=array of String{
- };
- }
- worksetCacheSize=10;
-}
-
-
-Uso en JSP:
- Se usa a través del taglib de QCore, defeinir en cada página:
- <%@ taglib uri="http://www.xwolf.es/qcore" prefix="Q"%>
- para usar el taglib
-
-Id en tags
- Para que el tag coja datos del Workset se vinculan mediante el mismo nombre de campo del workset que el id del tag.
- En este caso el tag es de ida y vuelta (el valor se envia a la página, pero este también se notifica al servidor).
- Existen casos especiales, para obtener valores, pero estos no serán enviados al servidor de manera natural.
- Estos casos son:
- · Nombres que empiezan por "|": Obtienen el valor de los atributos del PageContext, el nombre en el PageContext incluye
- el simbolo "|"
- · Nombres que empiezan por "@": Obtienen el valor del archivo de contexto de aplicación, sin incluir el simbolo inicial.
- · Nombres que empiezan por "$": Obtienen el valor de la sesión, sin incluir el simbolo inicial.
- · Nombres que empiezan por "%": Obtienen el valor de el parametro del request, sin incluir el simbolo inicial.
- · Puntos en el nombre: Si los nombres de campo estan separados por ".", se realiza una navegación. por
- los elementos de los objetos, pudiendo emplear cualquier profundidad. Si algún elemento en la ruta de
- navegación, es null, se retorna null.
- Para enviar al servidor hay que especificar el attributo send="<nombre campo>". Dónde
- <nombre campo> es el nombre del campo del workset.
-
-
-Proveedores de acceso a datos:
- Estructura:
- object MainDatabaseConnection class xwolf.qcore.db.DataSourceProviderJNDI{("java:comp/env/jdbc/<name>")
- engine="<engine>" //opcional
- }
- object MainDatabaseConnection class xwolf.qcore.db.DataSourceProviderJDBC{("jdbc:<engine>://<host>:3306/<ddbb>")
- driver="<driver to initialize>" // opcional
- engine="<engine>" //opcional
- user="<user>"
- password="<password>"
- }
-
-