6

What is the 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) ?

2
  • Depends on from what you are creating that HTML but, from what you have mentioned in your question i will say StringBuilder! Commented Jul 28, 2011 at 8:40
  • This SO answer must be helpful. Commented Sep 18, 2017 at 11:47

5 Answers 5

7

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.

Sign up to request clarification or add additional context in comments.

Comments

6

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

5 Comments

when you say encoding, do you mean UTF-8 etc? or the "&gt;" thing?
Yes, UTF-8. I say about something like that htmlBuilder.append("<head><title>Hello Łódź</title></head>");
Java use UTF-8 encoding internally, so whatever you type in Java is in UTF-8 encoding already. Does that answer your question?
If you know that the String will be longer than sixteen characters, better allocate a large initial buffer: new StringBuilder(1000)
Just for completion, values of attributes can be incorporated using String.format, i.e: htmlBuilder.append(String.format("<option value=\"%s\">%s</option>", value, label));
2

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

Comments

1

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.

Comments

0

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.