2011-12-20 9 views
5

Ho una risorsa di riposo con un metodo che dovrebbe restituire alcuni dati come html. Stiamo parlando di un elenco di Report, che è una semplice classe composta da 6 variabili membro della stringa.Come posso generare html dall'oggetto Java?

Sto chiedendo perché la prospettiva di aggiungere elementi e valori a una stringa sembra lenta e soggetta a errori e preferirei farlo in modo orientato agli oggetti.

risposta

4

Il modo normale di generare HTML per una risposta Web consiste nell'utilizzare un motore di template JSP o Java come Velocity o FreeMarker.

Se si stanno restituendo le risposte come XML, un altro approccio sarebbe utilizzare XSLT per trasformare l'XML in HTML. L'elaborazione XSLT può essere eseguita sul lato client (nel browser) se si include un'istruzione di "elaborazione" appropriata nell'XML che si collega alla risorsa XSLT.


Ho usato a pensare che colpire le stringhe insieme era una soluzione ragionevole, ma poi mi sono reso conto che che si traduce in voi hard-wiring il layout HTML nel codice Java. Gli approcci JSP, i modelli e le trasformazioni evitano tutto ciò, consentendo di regolare l'HTML generato successivamente nel ciclo di sviluppo; per esempio. al momento dell'integrazione del sistema o anche dopo la distribuzione.

+0

tutti i client supportano le trasformazioni client-side? – radai

+0

Non tutti. Ma i moderni browser web fanno - http://www.w3schools.com/XSL/xsl_browsers.asp –

+0

Ho pensato di usare XSLT, hai qualche idea su come includere le istruzioni di elaborazione in un XML che viene generato da un elenco di Report annotato con javax.xml.bind.annotation.XmlRootElement? – Marmoy

0

È possibile serializzare l'oggetto in XML e quindi fornire XLST per generare output HTML. Ma se sono solo 6 punture andrei avanti e concatenerei le stringhe.

7

Per HTML semplice, generarlo direttamente come testo. Gli altri suggerimenti di serializzazione, XML e trasformazioni sono tutti eccessivi.

ci sono librerie Java per aiutare con la generazione di codice HTML, come questi:

  • jwebutils
    una libreria per la creazione di HTML 5 markup utilizzando Java. Contiene anche il supporto per la creazione di markup JSON e CSS 3.
  • Jakarta Element Construction Set (ECS)
    Un'API Java per la generazione di elementi per vari linguaggi di marcatura supporta direttamente HTML 4.0 e XML. Ora in pensione, ma a qualcuno piace molto.

Ma se si apprendono le nozioni di base di HTML valido, è possibile scrivere le proprie routine.

Per quanto riguarda la velocità, è stata aggiunta la classe StringBuilder allo scopo di una più rapida manipolazione delle stringhe. Il compromesso non è sincronizzazione. Ciò significa che non sono thread-safe. A seconda di come è strutturato il programma, è possibile utilizzare la sincronizzazione all'esterno del codice eseguendo il rendering HTML.

Ecco un esempio di classe che ho appena preparato in Java 6 e una piccola app per eseguirlo. Questo codice è solo una prova di concetto, non è pronto per la produzione in prima serata.

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(); 
    } 

} 

E un'app per eseguirlo.

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 ***"); 
    } 

} 

ho cercato di pubblicare il rendering HTML qui, ma StackOverflow cercato di interpretarlo come HTML invece di visualizzarlo.

Bonus Suggerimento: È possibile utilizzare una sola citazione (apostrofo Unicode 39), piuttosto che a doppia citazione (VIRGOLETTA Unicode 34) nel codice HTML & CSS per delimitare i valori degli attributi e così via. I browser gestiscono entrambi bene. La citazione singola rende la codifica molto più semplice nel codice Java, eliminando la necessità di sfuggire alle virgolette doppie. Notare il mio utilizzo nel codice sopra, ad esempio 'en' e 'utf-8'.

Problemi correlati