我有一个 rest 资源,其方法应该以 html 形式返回一些数据。我们说的是 Reports 列表,这是一个简单的类,由 6 个字符串成员变量组成。
我问是因为将元素和值附加到字符串的前景看起来很慢而且容易出错,我真的更喜欢以面向对象的方式来做。
最佳答案
对于简单的 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 和 CSS 中使用单引号 (APOSTROPHE Unicode 39) 而不是双引号 (QUOTATION MARK Unicode 34) 来分隔属性值等。浏览器处理得很好。单引号使 Java 代码中的编码变得非常容易,无需转义双引号。请注意我在上面代码中的用法,例如 'en'
和 'utf-8'
。
关于java - 如何从 Java 对象生成 html?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8576222/