如何从Java对象生成html?

如何从Java对象生成html?,java,html,Java,Html,我有一个rest资源和一个方法,它应该以html的形式返回一些数据。我们讨论的是一个报表列表,它是一个由6个字符串成员变量组成的简单类 我这样问是因为在字符串中添加元素和值的过程似乎很慢,而且容易出错,我更喜欢用面向对象的方式 为web响应生成HTML的正常方法是使用JSP或Java模板引擎,如Velocity或FreeMarker 如果您当前以XML形式返回响应,另一种方法是使用XSLT将XML转换为HTML。如果在链接到XSLT资源的XML中包含适当的“处理”指令,则XSLT处理可以在客户端

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


我这样问是因为在字符串中添加元素和值的过程似乎很慢,而且容易出错,我更喜欢用面向对象的方式

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

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



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

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

对于简单HTML,直接将其生成为文本。其他关于序列化、XML和转换的建议都是多余的

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


  • 使用Java创建HTML 5标记的库。它还支持创建JSON和CSS 3标记
  • 雅加达(ECS)
    一个用于为各种标记语言生成元素的Java API,它直接支持HTML4.0和XML。现在退休了,但有些人真的很喜欢
但是,如果您学习了有效HTML的基础知识,您可以编写自己的例程

至于速度,添加该类是为了更快地处理字符串。折衷是没有同步。这意味着不是线程安全的。根据程序的结构,您可以在进行HTML呈现的代码外部使用同步

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

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;
/**
*@作者巴兹尔·布尔克
*©2012巴西尔布尔克。此源代码可以由任何对此承担全部责任的人自由使用。
*/
公共类ListToHtmlTransformer{
/**
*@param集合
*报告标题。
*@返回字符串,包含HTML5的源代码。
*/
公共字符串呈现(java.util.Collection报告){
//这段源代码还没有经过测试或者是防弹的,只是用来演示概念。
//警告:此代码不是线程安全的。在认真使用之前必须进行更改。
//警告:应修改此代码以生成正确的HTML,例如转义某些字符。
//此代码生成最小HTML5,如下所示:http://www.brucelawson.co.uk/2010/a-minimal-html5-document/
//大提示:注意HTML允许使用撇号(单引号)代替双引号。与Java源代码更好地混合。
//反斜杠+'n'是Java中的转义序列,用于生成换行符(Ascii/Unicode 10),在此处用作换行符。
//在现实生活中,您将使用HTML验证器测试呈现的HTML,例如:
// • http://html5.validator.nu/
// • http://validator.w3.org/
StringBuilder html=新的StringBuilder();
html.append(“\n”);
html.append(“\n”);
html.append(“\n”);
html.append(“\n”);
html.append(“报告的报告”);
html.append(“\n\n”);
html.append(“\n”);
html.append(“报告列表”);
//用HTML制作一个列表
html.append(“
    \n”); //循环作为参数传递的报告列表。 用于(字符串报告:报告){ html.append(“
  • ”+report+”
  • \n”); } html.append(“
\n”); html.append(“\n\n”); html.append(“”); 返回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 ***" );
    }

}
package.com.example;
导入java.util.ArrayList;
/**
* 
*@作者巴兹尔·布尔克
*©2012巴西尔布尔克。此源代码可以由任何对此承担全部责任的人自由使用。
*/
公共类应用程序{
/**
*@param args
*/
公共静态void main(字符串[]args){
ArrayListlistOfReports=new ArrayList();
报告列表。添加(“一些报告1”);
报告列表。添加(“一些报告2”);
报告列表。添加(“一些报告3”);
报告列表。添加(“一些报告4”);
报告列表。添加(“一些报告5”);
报告列表。添加(“某些报告6”);
ListToHtmlTransformer呈现程序=新建ListToHtmlTransformer();
String renderedHtml=renderer.render(listOfReports);
println(“呈现了以下HTML:“+new java.util.Date().toString());
System.out.println(renderedHtml);
System.out.println(“***HTML***”结尾);
}
}
我试图在这里发布呈现的HTML,但StackOverflow试图将其解释为HTML而不是显示它

额外提示:您可以在HTML和CSS中使用单引号(撇号Unicode 39)而不是双引号(引号Unicode 34)来分隔属性值等。浏览器可以很好地处理这两个问题。单引号使Java代码中的编码更加容易,无需转义双引号。请注意我在上面代码中的用法,例如
'en'
'utf-8'