arcanum_jp’s blog

おっさんの日記

WicketでXMLを返す機能を作りたい

 AjaxとかでJavaScript側から呼び出されるAPIの機能を作りたいなぁ、そんなことを思いながらググっていたら・・・当然ありました。さすがインターネッツ。このページを基にWicketでページのHTMLではなくXMLを返すページを作ってみました。

Hi yo'all,

I did quite a lot Googling and searched this forum, but still did not find what I was looking for.
Basically I need to create pages that respond with xml content with "text/xml" content-type.

http://stackoverflow.com/questions/1519392/how-to-prevent-apache-http-client-from-following-a-redirect

まずはとにもかくにもページクラス

public class ApiPage extends WebPage{

  public ApiPage(){
  }


  @Override
  protected void onRender() {

    OutputStreamWriter pw = null;
    try {

      pw = new OutputStreamWriter(((HttpServletResponse) getResponse().getContainerResponse()).getOutputStream(), "utf-8");

      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      DocumentBuilder db = dbf.newDocumentBuilder();
      Document document = db.newDocument();

      Element response = document.createElement("response");
      document.appendChild(response);

      ・
      ・
      ・
      ここにXMLを構築する処理

      StringWriter sw = new StringWriter();
      TransformerFactory tff = TransformerFactory.newInstance();
      Transformer tf = tff.newTransformer();
      DOMSource domsource = new DOMSource(document);
      tf.transform(domsource, new StreamResult(sw));
      pw.write(sw.toString());

    } catch (Exception e) {
      throw new RuntimeException(e);
    }
    finally{
      try {
        if(pw!=null)pw.close();
      } catch (IOException e) {
        throw new RuntimeException(e);
      }
    }
  }


  //@Override
  public final boolean hasAssociatedMarkup() {
    return false;
  }

  @Override
  protected void configureResponse(WebResponse response) {
    super.configureResponse(response);
    response.setContentType("text/xml");
  }

つぎにHTML側

 特に、必要ありません。

ApiPage.html

  <!-- あなたにこのページが見えていますか?ヒャッハー!! -->

あとはページをNiceURLにマウントする。

WebApplication#init()で以下のようにマウント

mountPage("/api", jp.arcanum.hoge.hage.fuga.ApiPage);

あとは、実行すると以下のようにページのHTMLではなく、XMLが取得できるようになります。

<?xml version="1.0" encoding="UTF-8"?>
<response>
  ・・・
</response>