如何从Java对象生成html?

时间:2011-12-20 13:29:34

标签: java html

我有一个rest资源,其方法应该将一些数据作为html返回。我们讨论的是Reports列表,它是一个由6个字符串成员变量组成的简单类。

我在问,因为将元素和值附加到字符串的前景似乎很慢并且容易出错,我更愿意以面向对象的方式进行。

3 个答案:

答案 0 :(得分:9)

对于简单的HTML,直接以文本形式生成它。序列化,XML和转换的其他建议都是过度的。

有一些Java库可以帮助生成HTML,例如:

  • jwebutils
    一个使用Java创建HTML 5标记的库。它还包含对创建JSON和CSS 3标记的支持。
  • Jakarta Element Construction Set(ECS)
    一种用于为各种标记语言生成元素的Java API,它直接支持HTML 4.0和XML。现在退休了,但有些人非常喜欢它。

但是如果你学习了有效HTML的基础知识,你可以编写自己的例程。

至于速度,添加StringBuilder类是为了加快字符串操作。权衡是不同步的。这意味着不是线程安全的。根据程序的结构,您可以在执行HTML呈现的代码外部使用同步。

这是我刚刚在Java 6中编写的一个示例类,以及一个运行它的小应用程序。这段代码只是一个概念证明,还没有为黄金时段制作做好准备。

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

}

运行它的应用程序。

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

}

我尝试在此处发布呈现的HTML,但StackOverflow尝试将其解释为HTML而不是显示它。

额外提示:您可以在HTML&amp;中使用单引号(APOSTROPHE Unicode 39)而不是双引号(QUOTATION MARK Unicode 34)。用于分隔属性值的CSS等。浏览器处理得很好。单引号使您的Java代码编码变得更加容易,无需转义双引号。请注意我在上面的代码中的用法,例如'en''utf-8'

答案 1 :(得分:4)

为Web响应生成HTML的常规方法是使用JSP或Java模板引擎,如Velocity或FreeMarker。

如果您当前正在以XML格式返回响应,则另一种方法是使用XSLT将XML转换为HTML。如果在XML中包含链接到XSLT资源的适当“处理”指令,则可以在客户端(在浏览器中)完成XSLT处理。


我曾经认为将字符串绑在一起是一个合理的解决方案,但后来我意识到这会导致您将HTML布局硬连接到Java代码中。 JSP,模板和转换方法都避免了这种情况,允许您在开发周期的后期调整生成的HTML;例如在系统集成时,甚至在部署后。

答案 2 :(得分:0)

您可以将对象序列化为XML,然后提供XSLT以生成HTML输出。 但是,如果只是6次叮咬我会继续并且只是连接字符串。