2012-01-13 6 views
0

背景: これまではxmlのリクエストを受信しただけでしたが、ブラウザアクセスのためにhtmlを返す必要があるwebserviceがあります。 XmlRootElementアノテーションを使用してXMLにマップされたJavaクラスがあります。FreemarkerデータモデルとしてJava-to-schemaのマップオブジェクトを使用する

私はこのJavaクラスに基づいてHTMLを生成するためにFreemarkerを使用していますが、その方法を直接見つけることはできません。

現在のところ、NodeModel.parseを使用してxmlをfreemarkerデータモデルに解析していますが、NodeModel.parseがFileを受け取るので、まずJavaオブジェクトをファイルに書き込みます。それは明らかにそれを行うには非効率的な方法ですが、それは仕事です。

XMLファイルに書き込むことなく、このJavaクラスからfreemarkerデータモデルを取得する方法を知っている人はいますか?

次は私のコードです:

Javaからスキーママッピングされたクラス:

@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(); 
} 
+0

すでにXMLを持っていたので、あなたが出力HTMLまたはちょうど約何もXSLTを使用することができます。 – Viruzzo

+0

私はXMLをまだ持っていません。私は、スキーマからJavaへの注釈で注釈が付けられたオブジェクトのリストを持っています。 – Marmoy

+0

私はあなたがすでにその部分の世代コードを持っていることを意味しました。 – Viruzzo

答えて

1

NodeModelwrap(org.w3c.dom.Node)方法を持っています、 XMLファイルを作成する必要はありません。必要なのは、org.w3c.dom.Nodeというオブジェクトのツリーだけで、FreeMarkerはどこから来たか気にしません。実際にFreeMarkerのデフォルトのオブジェクトラッパーを使用している場合は、NodeModelを処理する必要はなく、他のPOJOと同じようにorg.w3c.dom.Nodeをデータモデルにドロップするだけで、FreeMarkerはそれをXMLとして認識します。

FreeMarkerには、このObjectWrapper抽象化があります。実際のオブジェクトは、テンプレートからどのように見えるかを区別します。だから、これらのオブジェクトからNode -sのツリーを作成する必要はないかもしれません。ただ、その注釈付きオブジェクトを直接理解する実装をObjectWrapperにしてください。 DefaultObjectWrapperBeansWrapperをどのように拡張し、自動的にNode -s、Jythonオブジェクトなどをラッピングするかを参照してください。同じパターンに従うことができます。しかし、あなた自身もObjectWrapperを書くことは特別な作業です。特にXPathサポートが必要な場合は特にそうです(ヒント:JaxenはNode -sを必要としません)。

+0

ありがとうございます。ポイントは、私はすでにJava-to-SchemaアノテーションでPOJOの形でツリー構造を持っており、FreeMarkerがこの構造を認識できることを期待していました。それがないと、ノードオブジェクトのツリーをデータモデルにドロップする方法を拡張しますか? – Marmoy

+0

FreeMarkerはこれらの注釈をすぐに認識することはできませんが、私が言ったように、それを拡張することができます。したがって、それらのPOJO-sから 'Node'-sのツリーを取得する方法も、FreeMarkerのすぐに利用できる機能の外にあります。それらからXMLファイルを作成するものは、代わりに 'Node'-sのツリーを返すことはできませんか? – ddekany

1

私はJavaからスキーマ注釈付きクラスからノードツリーを生成するには、次のコードを使用しています

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; 
} 
関連する問題