JavaアプリケーションがHTMLコードをファイルに書き込むようにします。現在、Java.io.BufferedWriterクラスを使用してHTMLタグをハードコーディングしています。例:
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
bw.write("<html><head><title>New Page</title></head><body><p>This is Body</p></body></html>");
bw.close();
テーブルを作成する必要があり、非常に不便になっているため、これを行う簡単な方法はありますか?
外部ライブラリを使用せずに自分でそれを実行したい場合は、次のように、すべての静的コンテンツを含むtemplate.html
ファイルを作成することをお勧めします。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>$title</title>
</head>
<body>$body
</body>
</html>
動的コンテンツに$tag
のようなタグを付けて、次のようなことをします。
File htmlTemplateFile = new File("path/template.html");
String htmlString = FileUtils.readFileToString(htmlTemplateFile);
String title = "New Page";
String body = "This is Body";
htmlString = htmlString.replace("$title", title);
htmlString = htmlString.replace("$body", body);
File newHtmlFile = new File("path/new.html");
FileUtils.writeStringToFile(newHtmlFile, htmlString);
注:簡単にするために org.Apache.commons.io.FileUtils を使用しました。
数ヶ月前、私は同じ問題を抱えていましたが、見つけたすべてのライブラリは最終的な目標に対して機能性と複雑性を提供しすぎています。だから私は自分のライブラリを開発することになります-HtmlFlow-それは私が流なスタイルでHTMLを書くことを可能にする非常にシンプルで直感的なAPIを提供します。ここで確認してください: https://github.com/fmcarvalho/HtmlFlow (HTML要素へのdynamic bindingもサポートしています)
Task
オブジェクトのプロパティをHTML要素にバインドする例を次に示します。 Task
Java 3つのプロパティを持つクラス:Title
、Description
およびPriority
を考えて、次の方法でのTask
オブジェクトのHTMLドキュメント:
import htmlflow.HtmlView;
import model.Priority;
import model.Task;
import Java.io.FileOutputStream;
import Java.io.IOException;
import Java.io.PrintStream;
public class App {
private static HtmlView<Task> taskDetailsView(){
HtmlView<Task> taskView = new HtmlView<>();
taskView
.head()
.title("Task Details")
.linkCss("https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css");
taskView
.body().classAttr("container")
.heading(1, "Task Details")
.hr()
.div()
.text("Title: ").text(Task::getTitle)
.br()
.text("Description: ").text(Task::getDescription)
.br()
.text("Priority: ").text(Task::getPriority);
return taskView;
}
public static void main(String [] args) throws IOException{
HtmlView<Task> taskView = taskDetailsView();
Task task = new Task("Special dinner", "Have dinner with someone!", Priority.Normal);
try(PrintStream out = new PrintStream(new FileOutputStream("Task.html"))){
taskView.setPrintStream(out).write(task);
Desktop.getDesktop().browse(URI.create("Task.html"));
}
}
}
Velocity は、この種のものを書くための良い候補です。
これにより、HTMLコードとデータ生成コードを可能な限り分離することができます。
jsoup または wffweb (HTML5)ベースを使用できます。
Jsoupのサンプルコード:-
Document doc = Jsoup.parse("<html></html>");
doc.body().addClass("body-styles-cls");
doc.body().appendElement("div");
System.out.println(doc.toString());
プリント
<html>
<head></head>
<body class=" body-styles-cls">
<div></div>
</body>
</html>
Wffwebのサンプルコード:-
Html html = new Html(null) {{
new Head(this);
new Body(this,
new ClassAttribute("body-styles-cls"));
}};
Body body = TagRepository.findOneTagAssignableToTag(Body.class, html);
body.appendChild(new Div(null));
System.out.println(html.toHtmlString());
//directly writes to file
html.toOutputStream(new FileOutputStream("/home/user/filepath/filename.html"), "UTF-8");
印刷(縮小形式):-
<html>
<head></head>
<body class="body-styles-cls">
<div></div>
</body>
</html>
Freemarker などの非常に単純なテンプレート言語を使用することを強くお勧めします。
作成しているHTMLファイルの種類によって異なります。
このようなタスクでは、オブジェクトを作成し、XMLにシリアル化し、XSLで変換するために使用します。このアプローチの長所は次のとおりです。
短所は次のとおりです。
<textarea/>
タグ(ページを使用できないようにする)、XML宣言(IEで問題を引き起こす可能性があります)、空白(<pre></pre>
タグなど)、HTMLエンティティ(
)など.現在、HTMLが非常に短いか非常に反復的である場合、またはHTMLが動的に変化する揮発性構造を持っている場合、このアプローチを考慮してはなりません。一方、同様の構造を持つすべてのHTMLファイルを提供し、Javaコードの量を減らしてテンプレートを使用する場合、このアプローチは機能する可能性があります。
Groovyを使用する場合は、MarkupBuilderがこの種のことには非常に便利ですが、Javaにそのようなものがあることはわかりません。
http://groovy.codehaus.org/Creating+XML+using+Groovy 's + MarkupBuilder
また、自分のニーズを満たす簡単なものを見つけるのに問題があったため、独自のライブラリを作成することにしました(MITライセンス)。これは主にコンポジットとビルダーのパターンに基づいています。
基本的な宣言例は次のとおりです。
import static com.github.manliogit.javatags.lang.HtmlHelper.*;
html5(attr("lang -> en"),
head(
meta(attr("http-equiv -> Content-Type", "content -> text/html; charset=UTF-8")),
title("title"),
link(attr("href -> xxx.css", "rel -> stylesheet"))
)
).render();
流fluentな例は次のとおりです。
ul()
.add(li("item 1"))
.add(li("item 2"))
.add(li("item 3"))
他の例を確認できます here
また、 オンラインコンバーター を変換してeveryhtmlスニペット(complex bootstrapシンプルな単一スニペットへのテンプレート)オンザフライ(つまり、html-> javatags)
反復作業になっている場合。私はあなたがコードの再利用を行うべきだと思います! HTMLの小さなビルディングブロックを「書き込む」関数を単純に作成しないでください。アイデアを得る?例参照文字列を渡すことができる関数を作成すると、自動的に段落タグに入れて表示します。もちろん、これを行うには、何らかの基本的なパーサーを作成する必要があります(関数はどのように段落を添付するかを知るでしょう!)。私はあなたが初心者だとは思わない..だから私は精巧ではありません...あなたが理解していないなら教えてください..
メモリ内のドキュメントの予備作成に基づくテンプレートおよびその他の方法は、結果のドキュメントサイズに特定の制限を課す可能性があります。
一方、SAXハンドラーとデフォルトのXSLTトランスフォーマーに基づくプレーンHTMLの作成に対する非常に簡単で信頼性の高いオンザフライのアプローチが存在します。後者はHTML出力の固有の機能を備えています。
_String encoding = "UTF-8";
FileOutputStream fos = new FileOutputStream("myfile.html");
OutputStreamWriter writer = new OutputStreamWriter(fos, encoding);
StreamResult streamResult = new StreamResult(writer);
SAXTransformerFactory saxFactory =
(SAXTransformerFactory) TransformerFactory.newInstance();
TransformerHandler tHandler = saxFactory.newTransformerHandler();
tHandler.setResult(streamResult);
Transformer transformer = tHandler.getTransformer();
transformer.setOutputProperty(OutputKeys.METHOD, "html");
transformer.setOutputProperty(OutputKeys.ENCODING, encoding);
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
writer.write("<!DOCTYPE html>\n");
writer.flush();
tHandler.startDocument();
tHandler.startElement("", "", "html", new AttributesImpl());
tHandler.startElement("", "", "head", new AttributesImpl());
tHandler.startElement("", "", "title", new AttributesImpl());
tHandler.characters("Hello".toCharArray(), 0, 5);
tHandler.endElement("", "", "title");
tHandler.endElement("", "", "head");
tHandler.startElement("", "", "body", new AttributesImpl());
tHandler.startElement("", "", "p", new AttributesImpl());
tHandler.characters("5 > 3".toCharArray(), 0, 5); // note '>' character
tHandler.endElement("", "", "p");
tHandler.endElement("", "", "body");
tHandler.endElement("", "", "html");
tHandler.endDocument();
writer.close();
_
XSLTトランスフォーマーは、_>
_のような特殊文字をエスケープする負担から解放されることに注意してください。
そして、startElement()
やcharacters()
のようなSAXメソッドを自分の好みに合わせて簡単にラップすることは簡単です...