<< SLF4JとNLF4J | Home | 目付きワルっ! >>
PR: 転職    お墓    エコ    通販    結婚相談所    シルバー    質屋    葬式    漫画    エステサロン   

jaxbでちょっと遊び。

servletでprintln(HTML)もイヤだけど、JSPの「"」と「'」のネスト合戦や、EL式やJSTLをこねくりまわすのもイヤ。

んで、ここにxhtml 1.0のdtdが落ちているので、こいつをjaxbに喰わせてやったら全部オブジェクトモデルでxhtmlを表現できるなぁと。

jaxbのxjcに-dtdオプション付けて読ませようとしたら、xhtmlの属性名にclassがあって、これがJavaのclassとぶつかるので、エラー出て変換できない。xsdならbindingルールを指定できるのだけど、dtdではどうもできないっぽい。サクっとあきらめて、trangでdtdからxsdに変換。これに以下のbindingルールを付けてxjcでクラス群に変換。

<jxb:bindings version="1.0"
               xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <jxb:bindings schemaLocation="DTD/xhtml1-strict.xsd" node="/xs:schema">
    <jxb:bindings node="//xs:element[@name='block']">
      <jxb:class name="SmallBlock"/>
      <jxb:property name="SmallBlock"/>
    </jxb:bindings>

    <jxb:bindings node="//xs:element[@name='inline']">
      <jxb:class name="SmallInline"/>
      <jxb:property name="SmallInline"/>
    </jxb:bindings>

    <jxb:bindings node="//xs:element[@name='map']//xs:attribute[@name='class']">
      <jxb:property name="class1"/>
    </jxb:bindings>

    <jxb:bindings node="//xs:attributeGroup[@name='coreattrs']//xs:attribute[@name='class']">
      <jxb:property name="class2"/>
    </jxb:bindings>

    <jxb:bindings node="//xs:attributeGroup[@name='i18n']/xs:attribute[@name='lang']">
      <jxb:property name="langCode"/>
    </jxb:bindings>

    <jxb:bindings node="//xs:element[@name='bdo']//xs:attribute[@name='lang']">
      <jxb:property name="langCode"/>
    </jxb:bindings>

    <jxb:bindings node="//xs:group[@name='head.misc']//xs:choice">
      <jxb:class name="HeadMisc"/>
      <jxb:property name="HeadMisc"/>
    </jxb:bindings>
  </jxb:bindings>
</jxb:bindings>

JavaDoc出してみたら、10分もかかったよ。ドキドキしながらオブジェクトモデルでxhtmlを書いてみる。こんな感じになる。

        Html html = objFactory.createHtml();

        Head head = objFactory.createHead();
        html.setHead(head);

        Title title = objFactory.createTitle();
        head.getContent().add(title);

        title.getContent().add("Hello!");

        Body body = objFactory.createBody();
        html.setBody(body);
 
        final Br BR = objFactory.createBr();
        P p = objFactory.createP();
        body.getBlockOrFormOrMisc().add(p);

        p.getContent().add("Hello");
        p.getContent().add(BR);
        p.getContent().add("World");

これをjaxbのマーシャラに喰わせれば、xhtmlが出力される。

<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Hello!</title>
    </head>
    <body>
        <p>Hello
            <br/>World</p>
    </body>
</html>

傍から見たら、やっぱり狂気だろうか。でも個人的には気に入ってしまった。だってコンパイル段階でかなり静的なチェックできるしマーシャラがある程度の構造のバリデーションしてくれるし、不等号とか&とかエスケープしなくていいし、タグの閉じ忘れとか起こり得ないし、ループとか条件分岐は楽勝だし、テストはオブジェクトモデル段階でassertすればokだし。OOがフル活用できるからデザイン統一とかも楽勝な気がするし、自分のページ全部書き直してみようかな。




コメント追加 トラックバック送信
このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8