2011-12-20 21 views
5

Tengo un recurso de reposo con un método que debe devolver algunos datos como html. Estamos hablando de una lista de informes, que es una clase simple que consta de 6 variables de miembros de cadena.¿Cómo puedo generar html desde un objeto Java?

Lo estoy preguntando porque la posibilidad de agregar elementos y valores a una cadena parece lenta y propensa a errores, y realmente preferiría hacerlo de forma orientada a objetos.

Respuesta

4

La forma normal de generar HTML para una respuesta web es utilizar un motor de plantillas JSP o Java como Velocity o FreeMarker.

Si actualmente está respondiendo como XML, otro enfoque sería usar XSLT para transformar el XML a HTML. El procesamiento XSLT se puede realizar en el lado del cliente (en el navegador) si incluye una instrucción de "procesamiento" apropiada en el XML que se vincula al recurso XSLT.


Yo solía pensar que golpear cadenas juntas era una solución razonable, pero luego me di cuenta de que eso se traduce en que dura el cableado de su diseño HTML en su código Java. Los enfoques de JSP, plantillas y transformación evitan esto, permitiéndole ajustar el HTML generado más adelante en el ciclo de desarrollo; p.ej. en el tiempo de integración del sistema, o incluso después de la implementación.

+0

¿todos los clientes admiten las transformaciones del lado del cliente? – radai

+0

No todo. Pero los navegadores web modernos sí: http://www.w3schools.com/XSL/xsl_browsers.asp –

+0

Pensé en usar XSLT, ¿tiene alguna idea de cómo incluir las instrucciones de procesamiento en un xml generado a partir de una lista de Informes? anotado con javax.xml.bind.annotation.XmlRootElement? – Marmoy

0

Puede serializar el objeto a XML y luego proporcionar XLST para generar resultados en HTML. Pero si solo son 6 picaduras, seguiría adelante y solo concatenaría las cuerdas.

7

Para HTML simple, generarlo directamente como texto. Las otras sugerencias de serialización, XML y transformaciones son excesivas.

hay bibliotecas Java para ayudar con la generación de HTML, como éstos:

  • jwebutils
    una librería para crear HTML 5 marcado con Java. También contiene soporte para crear marcas JSON y CSS 3.
  • Jakarta Element Construction Set (ECS)
    API de Java para generar elementos para varios lenguajes de marcado. Admite directamente HTML 4.0 y XML. Ahora retirado, pero a algunas personas les gusta mucho.

Pero si aprende los conceptos básicos del HTML válido, puede escribir sus propias rutinas.

En cuanto a la velocidad, se agregó la clase StringBuilder con el fin de una manipulación de cadena más rápida. La compensación no es sincronización. Eso significa que no es seguro para subprocesos. Dependiendo de cómo esté estructurado su programa, puede usar la sincronización alrededor del código haciendo la representación HTML.

Aquí hay una clase de ejemplo que acabo de preparar en Java 6, y una pequeña aplicación para ejecutarlo. Este código es solo una prueba de concepto, no está listo para la producción de horario estelar.

package com.example; 

/** 
* @author Basil Bourque 
*   © 2012 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so. 
*/ 
public class ListToHtmlTransformer { 

    /** 
    * @param collection 
    *   of report titles. 
    * @return string containing source code for HTML5. 
    */ 
    public String render(java.util.Collection<String> reports) { 
     // This source code is not yet tested or made bullet-proof. Only meant for demonstrating concepts. 
     // Warning: This code is not thread-safe. Changes must be made before serious use. 
     // Warning: This code should be modified to produce proper HTML, such as escaping certain characters. 
     // This code generates minimal HTML5 as suggested here: http://www.brucelawson.co.uk/2010/a-minimal-html5-document/ 
     // Big tip: Note that HTML allows the use of apostrophe (single-quote) in place of double-quote. Mixes better with Java source code. 
     // The backslash + 'n' is an escape sequence in Java to generate a linefeed (Ascii/Unicode 10) for use here as a NewLine. 
     // In real life, you woud test your rendered HTML with an HTML validator such as: 
     // • http://html5.validator.nu/ 
     // • http://validator.w3.org/ 
     StringBuilder html = new StringBuilder(); 
     html.append("<!doctype html>\n"); 
     html.append("<html lang='en'>\n"); 

     html.append("<head>\n"); 
     html.append("<meta charset='utf-8'>\n"); 
     html.append("<title>Report of Reports</title>\n"); 
     html.append("</head>\n\n"); 

     html.append("<body>\n"); 
     html.append("<h1>List of Reports</h1>\n"); 
     // Make a list in HTML 
     html.append("<ul>\n"); 
     // Loop the list of reports passed as argument. 
     for (String report : reports) { 
      html.append("<li>" + report + "</li>\n"); 
     } 
     html.append("</ul>\n"); 
     html.append("</body>\n\n"); 

     html.append("</html>"); 

     return html.toString(); 
    } 

} 

Y una aplicación para ejecutarlo.

package com.example; 

import java.util.ArrayList; 

/** 
* 
* @author Basil Bourque 
*   © 2012 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so. 
*/ 
public class App { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     ArrayList<String> listOfReports = new ArrayList<String>(); 
     listOfReports.add("Some report #1"); 
     listOfReports.add("Some report #2"); 
     listOfReports.add("Some report #3"); 
     listOfReports.add("Some report #4"); 
     listOfReports.add("Some report #5"); 
     listOfReports.add("Some report #6"); 

     ListToHtmlTransformer renderer = new ListToHtmlTransformer(); 
     String renderedHtml = renderer.render(listOfReports); 

     System.out.println("The following HTML was rendered: " + new java.util.Date().toString()); 
     System.out.println(renderedHtml); 
     System.out.println("*** End of HTML ***"); 
    } 

} 

Me trataron de publicar el HTML representado aquí, pero Stackoverflow trató de interpretarlo como HTML en lugar de mostrarlo.

Consejo de bonificación: Puede utilizar comillas simples (APOSTROPHE Unicode 39) en lugar de comillas dobles (CITAS MARCAR Unicode 34) en su HTML & CSS para delimitar valores de atributos y cosas por el estilo. Los navegadores manejan bien ambos. La comilla simple hace que la codificación sea mucho más fácil en su código Java, eliminando la necesidad de escapar de las comillas dobles. Observe mi uso en el código anterior, como 'en' y 'utf-8'.

Cuestiones relacionadas