簡體   English   中英

使用Java-to-schema映射對象作為Freemarker數據模型

[英]Using Java-to-schema mapped object as Freemarker data model

背景:我有一個以前只收到xml請求的web服務,但現在需要返回html進行瀏覽器訪問。 我有一個使用XmlRootElement注釋映射到XML的Java類。

我正在使用Freemarker基於此Java類生成HTML,但無法直接找到這樣做的方法。

目前我使用NodeModel.parse將xml解析為freemarker數據模型,但由於NodeModel.parse接受File,我首先將Java對象寫入文件。 這顯然是一種效率低下的方法,但它確實起到了作用。

有沒有人知道如何在不首先將其寫入XML文件的情況下從這個Java類中獲取freemarker數據模型?

以下是我的代碼:

Java-to-Schema映射類:

@XmlRootElement(name = "report")
public class Report {
    private String id;  
    private String time;    

    public Report() {}

    public String getTime() {return time;}
    public void setTime(String time) {this.time = time;}

    public String getId() {return this.id;}    
    public void setId(String id) {this.id = id;}    
}

將數據與模板合並:

public String getReportsAsHtml(@QueryParam("lastUpdate") String lastUpdate){
    MySQLAccess dao = new MySQLAccess();
    List<Report> reports = dao.readReports(lastUpdate);
Template  temp = TemplateConfiguration.getInstance().getTemplateConfiguration().getTemplate("list_template.ftl");
    **HashMap<String, NodeModel> root = new HashMap<String, NodeModel>();**
    **root.put("doc", NodeModel.parse(Java2XML.getXMLFromJava(reports)));**
    StringWriter output = new StringWriter();
    temp.process(root, output);
    output.flush();
    return output.toString();
}

NodeModel有一個wrap(org.w3c.dom.Node)方法,因此您肯定不必創建XML文件。 您只需要一個org.w3c.dom.Node對象的樹,而FreeMarker並不關心它來自何處。 實際上,如果你使用FreeMarker的默認對象包裝器,你甚至不需要處理NodeModel ,只需將org.w3c.dom.Node放入數據模型中,就像任何其他POJO一樣,FreeMarker會將其識別為XML。

另請注意,FreeMarker具有此ObjectWrapper抽象。 它將實際對象與從模板中看到的對象分開。 所以你甚至可能不需要從這些對象中創建一個Node -s樹,只需創建一個直接理解那些帶注釋對象的ObjectWrapper實現。 了解DefaultObjectWrapper如何擴展BeansWrapper ,自動包裝Node -s,Jython對象等。您可以遵循相同的模式。 但是編寫自己的ObjectWrapper當然是額外的工作,特別是如果你也需要XPath支持(提示:Jaxen不需要Node -s)。

我使用以下代碼從Java-Schema注釋類生成節點樹:

public static Node getNodeFromReport(Object report){
    JAXBContext context = JAXBContext.newInstance(report.getClass());
    Marshaller marshaller = context.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

    DocumentBuilderFactory docFac = DocumentBuilderFactory.newInstance();
    Document result = docFac.newDocumentBuilder().newDocument();

    marshaller.marshal(report, result);

    return result;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM