Подтвердить что ты не робот

Создать 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();

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

4b9b3361

Ответ 1

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

Ответ 2

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

Вот пример привязки свойств объекта Task к элементам HTML. Рассмотрим класс Task Java с тремя свойствами: 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"));
        }
    }
}

Ответ 3

Velocity является хорошим кандидатом для написания такого рода материалов.
Это позволяет вам сохранить код html и код генерации данных как можно более разделенным.

Ответ 4

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

Ответ 5

Вы можете использовать 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

Это действительно зависит от типа создаваемого файла 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 и использовать шаблоны, этот подход может работать.

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

Между тем существует очень простой и надежный подход к созданию простого 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() к чему-то более удобному для одного вкуса...

Ответ 10

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