New Page

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

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

BufferedWriter bw = new BufferedWriter(new FileWriter(file)); bw.write("

This is Body

"); bw.close();

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

10 ответов

Если вы хотите сделать это самостоятельно, без использования какой-либо внешней библиотеки, чистый способ — создать файл template.html со всем статическим содержимым, например:

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

Для Java8 передайте дополнительный Charset.forName («UTF-8»), потому что readFileToString без charset устарела.

Также возможно использовать MessageFormat для подстановок: String template = FileUtils.readFileToString(htmlTemplateFile); String title = «New Page»; String body = «This is Body»; String htmlString = MessageFormat.format(template, title, body); И template должен содержать <0>для title и для body .

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

Хорошая идея и хороший инструмент, но, к сожалению, лицензия не так хороша, так что поощрять действительно широкое использование . 😉

@s-n-ushakov sn-ushakov Извините, я не эксперт по лицензионным соглашениям. В чем проблема с GPL v3.0?

Проблема с GPL состоит в том, что это слишком ограничительно. Он также требует от вас раскрытия всего вашего проекта под лицензией GPL, если вы используете какой-либо фрагмент кода, лицензированного по лицензии GPL. Это может не быть проблемой для хобби или университетского программирования, но это может быть довольно проблематично для программирования, связанного с бизнесом. Поэтому, чтобы сделать вашу библиотеку более удобной для бизнеса, я мог бы предложить изменить лицензию, по крайней мере, на LGPL, которая не требует от вас открытого исходного кода для всего вашего проекта, а только требует раскрытия ваших улучшений в библиотеке. Другие лицензии, возможно, несколько более дружественные для бизнеса, это BSD, MIT, Apache, Eclipse .

@s-n-ushakov sn-ushakov СОВЕРШЕНО. Просто выпустите версию 1.1. с лицензией MIT и парой мелких исправлений.

Вы можете использовать jsoup или wffweb (HTML5).

Document doc = Jsoup.parse(" "); doc.body().addClass("body-styles-cls"); doc.body().appendElement("div"); System.out.println(doc.toString()); 
Html html = new Html(null) >; 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"); 

печатает (в уменьшенном формате): —

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

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

Это действительно зависит от типа создаваемого файла HTML.

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

  • Строгое разделение между исходным кодом и HTML-шаблоном,
  • Возможность редактировать HTML без необходимости перекомпилировать приложение,
  • Возможность обслуживать разные HTML файлы в разных случаях на основе одного и того же XML или даже напрямую обрабатывать XML (для дальнейшей десериализации),
  • Более короткий код для записи.
  • Вы должны знать XSLT и знать, как реализовать его в Java.
  • Вы должны написать XSLT (и это пытка для многих разработчиков).
  • При преобразовании XML в HTML с XSLT некоторые части могут быть сложными. Несколько примеров: теги (которые делают страницу непригодной), объявление XML (что может вызвать проблемы с IE), пробелы (с тегами и т.д.), Объекты HTML (   ) и т.д.
  • Производительность будет уменьшена, поскольку сериализация в XML отнимает много ресурсов процессора, а преобразование XSL тоже очень дорого.

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

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

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

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

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

Источник

Write HTML file using Java

If you want to do that yourself, without using any external library, a clean way would be to create a template.html file with all the static content, like for example:

Put a tag like $tag for any dynamic content and then do something like this:

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

Solution 2

A few months ago I had the same problem and every library I found provides too much functionality and complexity for my final goal. So I end up developing my own library — HtmlFlow — that provides a very simple and intuitive API that allows me to write HTML in a fluent style. Check it here: https://github.com/fmcarvalho/HtmlFlow (it also supports dynamic binding to HTML elements)

Here is an example of binding the properties of a Task object into HTML elements. Consider a Task Java class with three properties: Title , Description and a Priority and then we can produce an HTML document for a Task object in the following way:

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 HtmlViewtaskDetailsView() < HtmlViewtaskView = 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 < HtmlViewtaskView = 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")); >> > 

Solution 3

You can use jsoup or wffweb (HTML5) based.

Document doc = Jsoup.parse(" "); doc.body().addClass("body-styles-cls"); doc.body().appendElement("div"); System.out.println(doc.toString()); 
Html html = new Html(null) >; 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"); 

prints (in minified format):-

Solution 4

Velocity is a good candidate for writing this kind of stuff.
It allows you to keep your html and data-generation code as separated as possible.

Solution 5

I would highly recommend you use a very simple templating language such as Freemarker

Источник

Читайте также:  Rounding number in python
Оцените статью