it-swarm.com.ru

Написать HTML-файл, используя Java

Я хочу, чтобы мое Java-приложение записывало HTML-код в файл. Прямо сейчас я жестко кодирую теги HTML, используя класс Java.io.BufferedWriter. Например:

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

Есть ли более простой способ сделать это, так как мне приходится создавать таблицы, и это становится очень неудобным?

39
hoshang.varshney

Если вы хотите сделать это самостоятельно, не используя какую-либо внешнюю библиотеку, чистый способ - создать файл 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 для простоты.

39
Marco Lackovic

Несколько месяцев назад у меня была та же проблема, и каждая найденная библиотека предоставляет слишком много функциональности и сложности для моей конечной цели. Поэтому я заканчиваю разработку своей собственной библиотеки - HtmlFlow - которая предоставляет очень простой и интуитивно понятный API, который позволяет мне писать HTML в свободном стиле. Проверьте это здесь: https://github.com/fmcarvalho/HtmlFlow (также поддерживается динамическое связывание с элементами HTML)

Вот пример связывания свойств объекта Task с элементами HTML. Рассмотрим Java-класс Task с тремя свойствами: Title, Description и Priority, а затем мы можем создать HTML-документ для объекта Task следующим образом:

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

Скорость является хорошим кандидатом для написания такого рода вещей.
Он позволяет вам хранить ваши HTML и код генерации данных как можно более разделенными.

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

Я очень рекомендую вам использовать очень простой язык шаблонов, такой как Freemarker

5
npellow

Это действительно зависит от типа HTML-файла, который вы создаете.

Для таких задач я использую для создания объекта, сериализации его в XML, а затем преобразовать его с помощью XSL. Плюсы этого подхода:

  • Строгое разделение между исходным кодом и шаблоном HTML,
  • Возможность редактировать HTML без перекомпиляции приложения,
  • Возможность обслуживать разные HTML в разных случаях на основе одного и того же XML или даже обслуживать XML напрямую, когда это необходимо (например, для дальнейшей десериализации),
  • Чем меньше количество кода для записи.

Минусы:

  • Вы должны знать XSLT и знать, как реализовать его в Java.
  • Вы должны написать XSLT (и это мучительно для многих разработчиков).
  • При преобразовании XML в HTML с помощью XSLT некоторые части могут быть сложными. Несколько примеров: теги <textarea/> (которые делают страницу непригодной для использования), объявление XML (которое может вызвать проблемы с IE), пробелы (с тегами <pre></pre> и т.д.), Сущности HTML (&nbsp;) и т.д.
  • Производительность будет снижена, так как сериализация в XML тратит много ресурсов процессора и XSL-преобразование также очень дорого.

Теперь, если ваш HTML очень короткий или очень повторяющийся или если HTML имеет изменчивую структуру, которая динамически изменяется, этот подход не должен приниматься во внимание. С другой стороны, если вы обслуживаете файлы HTML, которые имеют схожую структуру, и вы хотите уменьшить объем кода Java и использовать шаблоны, этот подход может работать.

3
Arseni Mourzenko

Если вы хотите использовать Groovy, MarkupBuilder очень удобен для такого рода вещей, но я не знаю, что у Java есть что-то подобное. 

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

1
Eric Wilson

если это становится повторяющейся работой; Я думаю, что вы должны повторно использовать код! почему вы просто не пишете функции, которые «пишут» небольшие строительные блоки HTML. получить идею? см. например у вас может быть функция, которой вы можете передать строку, и она автоматически поместит ее в тег абзаца и представит ее. Конечно, вам также нужно написать какой-то базовый синтаксический анализатор, чтобы сделать это (как функция узнает, где присоединить абзац!). я не думаю, что вы новичок .. поэтому я не уточняю ... скажите мне, если вы не понимаете ..

0
Chani

Шаблоны и другие методы, основанные на предварительном создании документа в памяти, могут накладывать определенные ограничения на размер документа.

Между тем, существует очень простой и надежный подход «на лету» к созданию простого HTML, основанный на обработчике SAX и преобразователе XSLT по умолчанию, причем последний обладает встроенной возможностью вывода 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-преобразователь избавит вас от необходимости экранировать специальные символы, такие как >, так как он сам позаботится об этом.

И методы SAX, такие как startElement() и characters(), легко обернуть во что-то более удобное на свой вкус ...

0
Sergey Ushakov

У меня также были проблемы с поиском чего-то простого, чтобы удовлетворить мои потребности, поэтому я решил написать свою собственную библиотеку (с лицензией 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();

Свободный пример:

ul()
  .add(li("item 1"))
  .add(li("item 2"))
  .add(li("item 3"))     

Вы можете проверить больше примеров здесь

Я также создал он-лайн конвертер для преобразования каждого фрагмента HTML (из сложного шаблона начальной загрузки в простой отдельный фрагмент) на лету (то есть html -> javatags)

0
M. Modugno