web-dev-qa-db-ja.com

Javaを使用してHTMLファイルを記述

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

テーブルを作成する必要があり、非常に不便になっているため、これを行う簡単な方法はありますか?

42

外部ライブラリを使用せずに自分でそれを実行したい場合は、次のように、すべての静的コンテンツを含む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 を使用しました。

41
Marco Lackovic

数ヶ月前、私は同じ問題を抱えていましたが、見つけたすべてのライブラリは最終的な目標に対して機能性と複雑性を提供しすぎています。だから私は自分のライブラリを開発することになります-HtmlFlow-それは私が流なスタイルでHTMLを書くことを可能にする非常にシンプルで直感的なAPIを提供します。ここで確認してください: https://github.com/fmcarvalho/HtmlFlow (HTML要素へのdynamic bindingもサポートしています)

TaskオブジェクトのプロパティをHTML要素にバインドする例を次に示します。 Task Java 3つのプロパティを持つクラス:TitleDescriptionおよび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"));
        }
    }
}
11
Miguel Gamboa

Velocity は、この種のものを書くための良い候補です。
これにより、HTMLコードとデータ生成コードを可能な限り分離することができます。

6
PATRY Guillaume

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>
6
RRadley

Freemarker などの非常に単純なテンプレート言語を使用することを強くお勧めします。

6
npellow

作成しているHTMLファイルの種類によって異なります。

このようなタスクでは、オブジェクトを作成し、XMLにシリアル化し、XSLで変換するために使用します。このアプローチの長所は次のとおりです。

  • ソースコードとHTMLテンプレートの厳密な分離、
  • アプリケーションを再コンパイルせずにHTMLを編集する可能性、
  • 同じXMLに基づいてさまざまなケースでさまざまなHTMLを提供する機能、または必要に応じてXMLを直接提供する機能(たとえば、さらに逆シリアル化するため)
  • 記述するコードの量が短くなります。

短所は次のとおりです。

  • XSLTとJavaでの実装方法を知っている必要があります。
  • XSLTを作成する必要があります(多くの開発者にとっては拷問です)。
  • XSLTを使用してXMLをHTMLに変換する場合、一部の部分が扱いにくい場合があります。いくつかの例:<textarea/>タグ(ページを使用できないようにする)、XML宣言(IEで問題を引き起こす可能性があります)、空白(<pre></pre>タグなど)、HTMLエンティティ(&nbsp;)など.
  • XMLへのシリアル化は多くのCPUリソースを浪費し、XSL変換も非常にコストがかかるため、パフォーマンスが低下します。

現在、HTMLが非常に短いか非常に反復的である場合、またはHTMLが動的に変化する揮発性構造を持っている場合、このアプローチを考慮してはなりません。一方、同様の構造を持つすべてのHTMLファイルを提供し、Javaコードの量を減らしてテンプレートを使用する場合、このアプローチは機能する可能性があります。

3

Groovyを使用する場合は、MarkupBuilderがこの種のことには非常に便利ですが、Javaにそのようなものがあることはわかりません。

http://groovy.codehaus.org/Creating+XML+using+Groovy 's + MarkupBuilder

1
Eric Wilson

また、自分のニーズを満たす簡単なものを見つけるのに問題があったため、独自のライブラリを作成することにしました(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)

1
M. Modugno

反復作業になっている場合。私はあなたがコードの再利用を行うべきだと思います! HTMLの小さなビルディングブロックを「書き込む」関数を単純に作成しないでください。アイデアを得る?例参照文字列を渡すことができる関数を作成すると、自動的に段落タグに入れて表示します。もちろん、これを行うには、何らかの基本的なパーサーを作成する必要があります(関数はどのように段落を添付するかを知るでしょう!)。私はあなたが初心者だとは思わない..だから私は精巧ではありません...あなたが理解していないなら教えてください..

0
Chani

メモリ内のドキュメントの予備作成に基づくテンプレートおよびその他の方法は、結果のドキュメントサイズに特定の制限を課す可能性があります。

一方、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メソッドを自分の好みに合わせて簡単にラップすることは簡単です...

0
Sergey Ushakov