开发者

Building HTML in Java code only

What is t开发者_运维百科he simplest, fastest way to create a String object (I suppose) that contains HTML (with correct encoding), which I can return for example in @ResponseBody (Spring MVC) ?


There can be several approaches.

First you can use String, or StringBuilder. This is good for extremely short HTMLs like <html>Hello, <b>world</b></html>.

If HTML is more complicated it is easier to use some API. Take a look on these links:

http://xerces.apache.org/xerces-j/apiDocs/org/apache/html/dom/HTMLBuilder.html

Java HTML Builder (anti-template) library?

or search html builder java in google.

Other possibility is templating. If you actually have a template where you wish to replace a couple of words you can write your HTML as an *.html file with {0}, {} marks for parameters. Then just use java.text.MessageFormat to create actual HTML text.

The next approach is to use "real" template engine like Velocity.


Does this work for you?

StringBuilder htmlBuilder = new StringBuilder();
htmlBuilder.append("<html>");
htmlBuilder.append("<head><title>Hello World</title></head>");
htmlBuilder.append("<body><p>Look at my body!</p></body>");
htmlBuilder.append("</html>");
String html = htmlBuilder.toString();


As of Java 13 there is a new feature being added called Text Blocks . To use a Text Block you must use three double quotes AKA """, to open and close the String.

This feature allows us to build something such as html without needing to concatenate Strings, handle new lines, or use a library and build the String very clearly and easily.

Here is a short example of using this new feature for html:

String html = """
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
              """;

This is equivalent to the below code without using Text Blocks:

String html = "<html>\n" +
              "    <body>\n" +
              "        <p>Hello, world</p>\n" +
              "    </body>\n" +
              "</html>\n";

Source: JEP 355: Text Blocks


Using jsoup or wffweb will be the simplest way to build HTML from Java code. You can dynamically generate HTML using it.

Eg for jsoup:

Document doc = Jsoup.parse("<html></html>");
doc.body().addClass("body-styles-cls");
doc.body().appendElement("div");
System.out.println(doc.toString());

will print

<html>
 <head></head>
 <body class=" body-styles-cls">
  <div></div>
 </body>
</html>

Eg for wffweb:

Html rootTag = new Html(null).give(html -> {
    new Head(html);        
    new Body(html).give(body -> {
        new NoTag(body, "Hello World");            
    });
});
rootTag.setPrependDocType(true);
System.out.println(rootTag.toHtmlString());

will print

<!DOCTYPE html>
<html>
   <head></head>
   <body>
      Hello World
   </body>
</html>

You can also write to OutputStream in specified charset encoding using toOutputStream​(OutputStream os, String charset) method.


Good way is extracting the style=""s into the head?

sb.append("<style>" +
"td { padding: 6px; border: 1px solid #ccc; text-align: left; }" + 
"th { background: #333; color: white; font-weight: bold; padding: 6px; border: 1px solid #ccc; text-align: left;}" +
"</style>");

helper methods:

void appendTag(StringBuilder sb, String tag, String contents) {
    sb.append('<').append(tag).append('>');
    sb.append(contents);
    sb.append("</").append(tag).append('>');
}
void appendDataCell(StringBuilder sb, String contents) {
    appendTag(sb, "td", contents);
}
void appendHeaderCell(StringBuilder sb, String contents) {
    appendTag(sb, "th", contents);
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜