22 de marzo

He usado un par de horas a mi alojado en Google Code proyecto Grum sobre el estado de cosas para traer (que era de hecho era hora). Grum es una pequeña aplicación Grails para la gestión de usuarios, lo que me permite la web marco de Grails "para "jugar.

Soy consciente de la aplicación de los muchos plugins Grails omitidos a fin de tener como efectos secundarios posible y mantenerlo para aquellos que simplemente buscan una introducción a Grails. Por lo tanto, incluido en soluciones Grum, tales como el hombre:

  • el acceso a una base de datos MySQL implementado
  • 1:1, 1: ny n: m GORM modelada relaciones
  • escribir sus propias librerías de etiquetas
  • La biblioteca de etiquetas JSP DisplayTag utiliza la página de datos por la página, para agrupar, ordenar, y en todos los formatos posibles (Excel, CSV, XML, PDF) a la exportación
  • te permite subir archivos
  • las pruebas de funcionamiento con el plugin de webtest utiliza
  • y la entrega de XML basado en la URL (la negociación de contenido corto) implementa

La nueva versión 0.3 ahora utiliza griales 1.2.1 y el webtest plugin en la versión 2.0.3. La fuente , los archivos de SQL para crear la base de datos MySQL y un archivo web tiene todas las librerías necesarias en Google Code para descargar listas.

Nutztungshinweise:
El código se puede utilizar libremente, pero puede contener errores de los que no asumen ninguna responsabilidad. Las condiciones de la licencia de las bibliotecas que deben ser respetados.

gklinkmann escrito por \ \ tags: y y , ,

09 de marzo

Que mis contribuciones a la categoría de la izquierda semana han hecho una pausa por un tiempo, fue también el hecho de que copiar los enlaces para enfadarse.

Entonces, ¿qué hace usted como programador, cuando la presión de la enfermedad es lo suficientemente alta - se lee un API (en este caso de delicious.com ), toma el idioma de su elección (para mí maravilloso ) y adopta las medidas correctivas.

El abuelo de los administradores en línea favorito delicious.com proporciona una API basada en REST disponibles. Groovy ofrece el módulo HTTP Builder es una poderosa herramienta que hace que el trabajo con los recursos basados ​​en HTTP extremadamente fácil.

Después de una autenticación exitosa de una solicitud válida y obtener una respuesta XML que podría tener este aspecto:

  A
 2
 3
 4
 5
 6
 7
 8
 9
 10
  "" user = "user" > <Posts Tag = user = "" "user">
   "http://www.weather.com/" description = "weather.com" <Href = post "http://www.weather.com/" description = "weather.com"
   tag = "weather reference" hash = "6cfedbe75f413c56b6ce79e6fa102aba" tag = "referencia de tiempo"
   /> tiempo = "2005-11-29T20: 30:47 Z" />
     ...
   "http://www.nytimes.com/" <Href = post "http://www.nytimes.com/"
   description = "The New York Times - Breaking News, World News & Multimedia"
   hash = "ca1e6357399774951eed4628d69eb84b" extendida = "requiere login" hash = "ca1e6357399774951eed4628d69eb84b"
   time = "2005-11-29T20:30:05Z" /> tag = "los medios de comunicación" tiempo = "2005-11-29T20: 30:05 Z" />
 </ Mensajes> 

Puede probar una sola vez en la línea de comandos utilizando curl :

  > Curl https://user:passwd @ api.del.icio.us/v1/posts/recent 

Algunos URL, tales como posts/all que no debe llamar demasiado a menudo, ya que son limitados. Para hacerlo todavía (como yo) se obtiene el error 999a Es mejor, ya que sólo las últimas entradas (por defecto 15) posts/recent en preguntar. Todo el programa y luego me miró como esto:

  A
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
  importar groovyx.net.http. * 
 groovy.util.slurpersupport.GPathResult importación 

 Delicioso Bookmark clase Client {

    args ) { public static void main (args) {
       DeliciousBookmarkClient ( ) def dc = nuevo y delicioso favorito del cliente ()
       CC. solicitud ()
    }

    solicitud pública () {
       try {
          / / Autenticación
          RESTClient ( 'https://username:password@api.del.icio.us/v1/posts/recent' ) rc = nueva definición RESTClient (@ https://nombredeusuario api.del.icio.us/v1/posts/recent ')
          "username" , "password" rc. auth. básica "username", "password"

          Solicitud / / y comprobar la respuesta
          ( "count" : "5" ) rc definición resp = get ("cuenta" "5").
          == 200 afirman, respectivamente. status == 200
          resp. data instanceof GPathResult ) afirmar (o los datos instanceof GPathResult)

          . post Mensajes recientes def = respectivamente. datos. mensaje
          recentPosts. size ( ) println "El número de mensajes" + los últimos puestos. size ()

          / / HTML preparación de los enlaces y la descripción
          println "<dl>"
          post -> los últimos puestos cada puesto {-.>
             ( ) desc = descripción del puesto @ def. de texto ()
             ( ) def mensaje @ href = href. de texto ()
             println "<dt> <a href= \" $href \"> $ desc </ a> </ dt>"
             println "<dd> $ desc </ dd>"
          }
          println "</ dl>"
       ( e ) { Captura} (e) {
          println correo de respuesta. el estado
          e println mensaje
       }
    }   
 } 

La API se puede, por supuesto, también agregar y eliminar marcadores. Lo mismo ocurre con las etiquetas y paquetes de etiquetas. Esto no deja nada que desear.

gklinkmann escrito por \ \ tags: , ,

05 de marzo

Los que pueden no sólo ha sido con Grails aplicaciones Web basadas en Java, utiliza el esperado JSP taglib DisplayTag ser un nombre familiar.

DisplayTag sin barbillas grandes tablas en las páginas de servidor Java en varias páginas (paging), grupo clase, y la exportación a Excel, CSV, XML y PDF.
Grails contó con el apoyo "de la caja" sólo la paginación y el tiempo no usamos librerías de etiquetas JSP en Grails, por lo que podría asignar la funcionalidad restante ya sea a través de plugins o incluso tuvieron que echar una mano.

Desde Grails 1.1, esta restricción se ha levantado y se combinan los dos, la prueba ha sido completada con éxito. Sólo la entrada de blog sobre él es, ya que incluso en mi lista de tareas pendientes. Pero lo bueno va a salir a las (espero :-) ).

Los siguientes pasos son necesarios para integrar DisplayTag en Grails:

libs

En primer lugar, las bibliotecas deben ser DisplayTag junto al controlador de base de copiar en el directorio lib.

DisplayTag archivo de configuración

El archivo de configuración de DisplayTag displaytag.properties estar bajo src/java que se creará. La estructura de este archivo está en el documento descrito por DisplayTag. Por mi Grum proyecto, la configuración es la siguiente:

  A
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
  csv excel xml pdf exportación. csv excel xml = pdf
 true exportación. Excel = true
 true exportación. csv = true
 true exportación. xml = true
 true exportación. pdf = true
 = org. displaytag . export . excel . DefaultHssfExportView exportación. Excel. class = org. DisplayTag. exportación. Excel. DefaultHssfExportView
 = org. displaytag . export . DefaultPdfExportView exportación. pdf. class = org. DisplayTag. exportación. DefaultPdfExportView
 = org. displaytag . export . DefaultRtfExportView exportación. rtf. class = org. DisplayTag. exportación. DefaultRtfExportView
 div class = "exportlinks" > Export to : { 0 } </ div > bandera de exportación = class = <div "export-left"> Exportar a. {0} </ div>
 list exportar. = importe lista de
 = bottom paginación. bandera. la colocación inferior =
 = No data found. básica. msg. empty_list = No se han encontrado datos.
 . empty_list_row =< tr class = "empty" >< td colspan = "0" > No data found. </ td ></ tr ></ tr > básica. msg. empty_list_row <tr = class = "empty"> <td colspan = "0"> No se encontraron datos. </ td> </ tr> </ tr>
 =< span class = "pagelinks" >< a href = "{1}" >< strong >& lt ;& lt ;</ strong ></ a >& nbsp ;& nbsp ;& nbsp ;< a href = "{2}" >< strong >& lt ;</ strong ></ a >& nbsp ; { 0 } & nbsp ;< a href = "{3}" >< strong >& gt ;</ strong ></ a >& nbsp ;& nbsp ;& nbsp ;< a href = "{4}" >< strong >& gt ;& gt ;</ strong ></ a ></ span > bandera de paginación total = <span class = "page left"> <a href = "{1}"> <strong> & lt; .. & lt; </ strong> </ a> & nbsp; & nbsp; & nbsp; <a href = "{2}"> <strong> & lt; gt <a href = "{3}"> <strong> y;; </ strong> </ a> & nbsp; {0} & nbsp < / strong> </ a> & nbsp; & nbsp; & nbsp; <a href = gt "{4}"> <strong> &; & gt; </ strong> </ a> </ span>
 =< span class = "pagelinks" > { 0 } & nbsp ;< a href = "{3}" >< strong >& gt ;</ strong ></ a >& nbsp ;& nbsp ;& nbsp ;< a href = "{4}" >< strong >& gt ;& gt ;</ strong ></ a ></ span > paginación primera bandera = <span class = "page left"> {0} & nbsp; .. <a href = "{3}"> <strong> & gt; </ strong> </ a> & nbsp; & nbsp; & nbsp; <a href = "{4}"> <strong> & gt; & gt; </ strong> </ a> </ span>
 =< span class = "pagelinks" >< a href = "{1}" >< strong >& lt ;& lt ;</ strong ></ a >& nbsp ;& nbsp ;& nbsp ;< a href = "{2}" >< strong >& lt ;</ strong ></ a >& nbsp ; { 0 } </ span > bandera de paginación última = <span class = "page left"> <a href = "{1}"> <strong> & lt; .. & lt; </ strong> </ a> & nbsp; & nbsp; & nbsp; <a href = "{2}"> <strong> & lt; </ strong> </ a> & nbsp; {0} </ span>
 =< span class = "pagebanner" > 1 Record found. Seite : </ span > bandera de paginación one_item_found = <span class = "banner page"> página 1 registro encontrado ... </ span>
 =< span class = "pagebanner" > { 0 } Records found. Seite : </ span > paginación bandera all_items_found = <span class = "banner page"> {0} registra encontradas Página: ... </ span>
 =< span class = "pagebanner" > { 0 } Records found, show { 2 } - { 3 } . </ span >< br />< br /> paginación bandera some_items_found = <span class = "banner page"> {0} registra encontrados, se muestran {2} - {3} ... </ span> <br /> <br /> 

DisplayTag envoltorio

Los enlaces dinámicos y el formato que se ejecutará en el patrón Decorator en DisplayTag. El decorador se implementa en una clase contenedora que es, por supuesto, escrito en Groovy Grails. Mi aplicación es la clase DisplaytagWrapper que creó el proyecto de Grum un enlace a los datos del usuario y formatos de la fecha de la creación.

  A
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
  paquete de de.koo.grum.groovy.util

 ; org.displaytag.decorator.TableDecorator importación;

 TableDecorator { public class TableDecorator DisplaytagWrapper {
    Cadena getLinkToUser () {
       def user = getCurrentRowObject ()
       /grum/user/show/${user.id} \" >${user.username}</a>" ; retorno "<a href= \" /grum/user/show/${user.id} \"> $ {} user.username </ a>";
    }
    Cadena getUserCreatedAt () {
       def user = getCurrentRowObject ()
       . format ( "dd.MM.yyyy HH:mm" ) ; usuario createdAt formato de devolución ("AAAA HH: MM") ..
    }
 } 

Filtros de exportación

Establecer la hora de exportar a un formato que no sea HTML, el tipo de contenido de la respuesta al navegador. Para evitar que esto causa problemas, el filtro debe ser definido en el archivo web.xml, que contrarresta los posibles errores. DisplayTag trae la respuesta de anulación clase de filtro ya es una aplicación para con él.

Para Grails en los cambios en el web.xml que usted hace, las plantillas se deben instalar:

  grails install-templates 

Luego está el web.xml en el directorio src/templates/war . Para filtrar las entradas siguientes son necesarios.

  A
 2
 3
 4
 5
 6
 7
 8
  <filter>
    <filter-name> anulación de respuesta del filtro </ filter-name>
    <filter-class> org.displaytag.filter.ResponseOverrideFilter </ filter-class>
 </ Filtro>
 <filter-mapping>
    <filter-name> anulación de respuesta del filtro </ filter-name>
    <url-pattern> / * </ url-pattern>
 </ Filter-mapping> 

Integración con el Servidor de páginas Groovy

Si ha completado todos estos pasos preparatorios, que finalmente es capaz de bajar a la utilización de DisplayTag en una página de servidor Groovy.
En mi ejemplo, los usuarios / list.gsp todos los datos del usuario se mostrará en forma de tabla. La mesa es el atributo sortable pueden ordenar por nombre y apellido (sin acceso a nueva base de datos) y, cuando el pagesize del atributo partialList repartidas en varias páginas.

  A
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
  = "display" % > <% @ Taglib uri = "http://displaytag.sf.net" prefix = "display"%>  
 <html>
 ..
 defaultsort = "1" partialList = "true" <Pantalla: nombre de la tabla = "lista de usuarios" DefaultSort = "1" partialList = "true"
 decoradora = "de.koo.grum.groovy.util.DisplaytagWrapper"
 = "${pageSize}" requestURI = "/grum/user/list" size = "$ {} tamaño de resultado" pageSize = "$ {} tamaño de página" requestUri = "/ Grum / usuario / listado"
 = "0" cellspacing = "0" sort = "list" > class = "lista" cellpadding = "0" cellspacing = "0" sort = "lista">
    title = "Userame" /> <display:column property = title = "linkToUser" "Userame" />						
    title = "Firstame" sortable = "true" /> <display:column property = title = "firstname" "Firstame" ordenar = "true" />						
    title = "Lastname" sortable = "true" /> <display:column property = title = "lastname" "Lastname" ordenar = "true" />						
    title = "Created At" sortable = "true" /> <display:column property = title = "userCreatedAt" "Created At" ordenar = "true" />						
 </ Display: table>
 ... 

Atributos adicionales ( export , group ) puede, como en el ejemplo los datos de contacto o list.gsp también exportar a diferentes formatos de salida y una serie de entradas se alcanzan.

  A
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
  export = "true" defaultsort = "1" partialList = "true" <Pantalla: nombre de la tabla = "lista de contactos de los datos" de exportación = "true" DefaultSort = "1" partialList = "true"
 decoradora = "de.koo.grum.groovy.util.DisplaytagWrapper"
 = "${pageSize}" requestURI = "/grum/contactData/list" size = "$ {} tamaño de resultado" pageSize = "$ {}" RequestUri tamaño de página = "/ Grum / o datos de contacto de la lista"
 = "0" cellspacing = "0" sort = "list" > class = "lista" cellpadding = "0" cellspacing = "0" sort = "lista">
     value = "contactData.csv" /> nombre = valor = <display:setProperty "export.csv.filename" "contactData.csv" />
     value = "contactData.xls" /> nombre = valor = <display:setProperty "export.excel.filename" "contactData.xls" />
     value = "contactData.xml" /> nombre = valor = <display:setProperty "export.xml.filename" "contactData.xml" />
     value = "contactData.pdf" /> nombre = valor = <display:setProperty "export.pdf.filename" "contactData.pdf" />
     value = "list" /> nombre = valor = <display:setProperty "export.amount" "list" />

     title = "Name" sortable = "true" group = "1" /> <display:column property = title = "linkContactDataToUser" "Name" ordenar = grupo = "true" "1" />						
     title = "type" sortable = "true" /> <display:column property = title = "type" "type" ordenar = "true" />
     sortable = "true" /> <display:column property = "data" ordenar = "true" />
 </ Display: table> 

Conclusión:
Una vez configurado DisplayTag uno de los mayores soluciones para aplicaciones Web basadas en Java que se mostrarán en datos tabulares. La funcionalidad supera con creces la funcionalidad estándar de Grails. La combinación de Grails y DisplayTag voy a recomendar a nadie.

Enlaces:
Grum fuente

gklinkmann escrito por \ \ tags: , , ,

14 de enero

Como administrador, debe seleccionar la hora de crear contraseñas de los usuarios que no me refiero sólo a 123.456 º Sin embargo, desde la fantasía de un administrador es limitado, es la mejor manera de crear uno.
Un maravilloso clase para un generador de contraseñas puede tener este aspecto:

  A
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
  public class {generador de contraseñas
    main ( def args ) { public static void main (args def) {
       availChars def = []  
       .. 'Z' ) . each { availChars << it. toString ( ) } ('A' .. 'Z'). Cada {availChars que <<. ToString ()}  
       { ( 0 .. 9 ) . each { availChars << it. toString ( ) } } Tercera épocas {(0 .. 9). Cada {availChars que <<. ToString ()}}  

       length -> def generan al azar cadena = {longitud ->   
         = availChars. size def max = availChars. tamaño      
         new Random ( ) def rnd = new Random ()  
         new StringBuilder ( ) def sb = new StringBuilder ()  
         sb. append ( availChars [ rnd. nextInt ( max ) ] ) } de longitud. épocas {SB. append (availChars [rnd. nextInt (max)])}  
         sb. toString ()  
       }   

       { println generateRandomString ( 8 ) } Tiempos de 10 º {println generan al azar de cadena (8)}   
    }
 } 

Fuente: www.chrisrauber.com

Es aún más fácil, por supuesto, si el contenido es el método principal en el shell de Groovy se ejecuta.

gklinkmann escrito por \ \ tags: , ,

08 de enero

En silencio, que tanto, ha llegado. Al igual que muchos otros proyectos Groovy (Groovy 1.7, 0.9 GPars, Gant 1.9) se publica también en el tiempo para la Grails Groovy y Grails intercambio, una nueva versión. La versión final 1.2 ha sido un largo tiempo.

Una versión estable, que debería ser. Esa fue la razón para la beta de largo y la fase de RC. Sun está basado en Groovy 1.2, sin embargo, la versión 1.6.7 Groovy.

Para la nueva versión tiene Dierk König (autor de Groovy in Action) un detallado artículo escrito para que en este punto sigue una breve lista de nuevas características:

  • Dependencias declarativas para las bibliotecas dentro de las aplicaciones Grails
  • Más rápidos puntos de vista - Mejoras de rendimiento para Groovy Server Pages (SGP)
  • Por defecto se pueden configurar GORM
  • Las consultas con nombre, que también pueden servir como base de selección de los métodos de búsqueda dinámicos
  • Expansión, el RESTO de todas formas ya es muy bueno y compatibilidad de JSON
  • El motor de documentación Grails también se puede utilizar en otras (no basado en Grails) aplicaciones se utilizan
  • Actualización sobre la primavera 3
  • Fuentes configurables finamente granular de datos
  • un mayor apoyo a las entidades anotadas
  • Tomcat como contenedor servlet por defecto. Otros contenedores de servlets como el embarcadero también se apoyan.

La lista completa de cambios que puede en el registro de cambios y notas de la versión leer.

Grails 1.2 está disponible en la página del proyecto de descarga listo. Suficiente para las aplicaciones existentes de Grails, como tener un

  griales de actualización 

El salto de la versión 1.1 a la 1.2 no es tan grande como el de la versión 1.0 a la 1.1. Siendo esto así ahora, sólo algunos problemas conocidos.

gklinkmann escrito por \ \ tags: , , ,