Write HTML file using Java

前端 未结 10 854
我寻月下人不归
我寻月下人不归 2020-11-28 23:55

I want my Java application to write HTML code in a file. Right now, I am hard coding HTML tags using java.io.BufferedWriter class. For Example:

BufferedWrite         


        
相关标签:
10条回答
  • 2020-11-29 00:26

    Templates and other methods based on preliminary creation of the document in memory are likely to impose certain limits on resulting document size.

    Meanwhile a very straightforward and reliable write-on-the-fly approach to creation of plain HTML exists, based on a SAX handler and default XSLT transformer, the latter having intrinsic capability of HTML output:

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

    Note that XSLT transformer will release you from the burden of escaping special characters like >, as it takes necessary care of it by itself.

    And it is easy to wrap SAX methods like startElement() and characters() to something more convenient to one's taste...

    0 讨论(0)
  • 2020-11-29 00:29

    if it is becoming repetitive work ; i think you shud do code reuse ! why dont you simply write functions that "write" small building blocks of HTML. get the idea? see Eg. you can have a function to which you could pass a string and it would automatically put that into a paragraph tag and present it. Of course you would also need to write some kind of a basic parser to do this (how would the function know where to attach the paragraph!). i dont think you are a beginner .. so i am not elaborating ... do tell me if you do not understand..

    0 讨论(0)
  • 2020-11-29 00:30

    If you are willing to use Groovy, the MarkupBuilder is very convenient for this sort of thing, but I don't know that Java has anything like it.

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

    0 讨论(0)
  • 2020-11-29 00:34

    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 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"));
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题