私は、いくつかのデータをhtmlとして返すメソッドを備えたrestリソースを持っています。ここでは、6つの文字列メンバー変数で構成される単純なクラスであるレポートのリストについて説明します。Javaオブジェクトからhtmlを生成するにはどうしたらいいですか?
文字列に要素や値を追加する見込みが遅く、エラーが発生する可能性があるため、私は実際にオブジェクト指向の方法で行うことをお勧めします。
私は、いくつかのデータをhtmlとして返すメソッドを備えたrestリソースを持っています。ここでは、6つの文字列メンバー変数で構成される単純なクラスであるレポートのリストについて説明します。Javaオブジェクトからhtmlを生成するにはどうしたらいいですか?
文字列に要素や値を追加する見込みが遅く、エラーが発生する可能性があるため、私は実際にオブジェクト指向の方法で行うことをお勧めします。
WebレスポンスのHTMLを生成する通常の方法は、VelocityやFreeMarkerのようなJSPまたはJavaテンプレートエンジンを使用することです。
現在、応答をXMLとして返す場合は、XSLTを使用してXMLをHTMLに変換する方法もあります。 XSLTリソースにリンクするXMLに適切な「処理」命令を含めると、クライアント側(ブラウザ内)でXSLT処理を実行できます。
私は一緒に文字列をバッシングすることは合理的な解決策だったと思うために使用されるが、その後、私はそれがあなたのJavaコードにあなたのHTMLレイアウトをハードワイヤリングあなたにつながることを認識するようになりました。 JSP、テンプレート化、および変換のアプローチはすべてこれを回避し、開発サイクルの後半で生成されたHTMLを調整することができます。例えばシステムインテグレーション時、または導入後でさえも可能です。
オブジェクトをXMLにシリアル化し、XLSTでHTML出力を生成できます。 しかし、それがちょうど6回の刻みであれば、私は先に進み、弦を連結するだけです。
単純なHTMLの場合は、テキストとして直接生成してください。シリアライズ、XML、およびトランスフォーメーションの他の提案はすべて不合理です。
は、このようなHTMLを生成を支援するためのJavaライブラリがあります。また、JSONとCSS 3マークアップの作成もサポートしています。
有効な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で二重引用符(引用符のUnicode 34)ではなく、一重引用符(APOSTROPHE Unicode 39)を使用できます。ブラウザはどちらもうまく処理できます。一重引用符を使用すると、Javaコードでのコーディングが非常に簡単になり、二重引用符を逃す必要がなくなります。上記のコードで、私の使用法に注意してください。例えば、'en'
と'utf-8'
です。
すべてのクライアントはクライアント側の変換をサポートしますか? – radai
すべてではありません。しかし、現代のWebブラウザは - http://www.w3schools.com/XSL/xsl_browsers.asp –
私はXSLTを使うことを考えました、レポートのリストから生成されたxmlに処理命令を含める方法がありますか? javax.xml.bind.annotation.XmlRootElementで注釈されていますか? – Marmoy