プログラム

(秘)JavaServlet技法

初心者から上級者まで。Java言語によるプログラミングの真髄をレクチャーします。Webシステム開発のエキスパート「株式会社 慶」が発行。

全て表示する >

(秘)JavaServlet技法

2002/12/23

〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
まぐまぐマガジンID                                             melma! マガジンID
0000073164              ┏━━━━━━━━━━━━━━━┓             m00048716
                               (秘)JavaServlet技法
━━━━━━━━━━━━┻━━━━━━━━━━━━━━━┻━━━━━━━━━━━
                                                           第49号 2002/12/23発行
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━【もくじ】━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ・ServletTips:50回
 ・Javaのお作法:34回
 ・次回予告
 ・編集後記
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━【ServletTips:0050】━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
○XML Document作成用の 便利クラス
 
今回はXMLの締めとして XML文書作成支援クラスを作ってみます。

今回作るCreateDataクラスは、クラスの内部に Documentインスタンスを持たせ
その Documentインスタンスに対してXML操作を行います。
前回まで XMLファイルを読み込んで Documentインスタンスを作成していたのに対して、
今回は 空の Documentから XML文書を作成していきます。

大まかな実装内容は以下の通りです。

1) XML文書を1から作成(Documentを空から作成)
2) XMLツリーの現在位置を覚えておきアクセスを容易にする。

・XML文書を1から作成する理由
   DBやその他形式のファイルを新規XML文書として作成するの場合に使える。
・XMLツリーの現在位置を覚えておく理由
   ツリーの位置を CreateDataクラスで制御することで、XML操作を楽になる。

まだ足りないと思われる機能の追加は、賢明な読者自身にお任せします。

ではソースです。

/* ここから TestMain.java */

import java.io.* ;
import org.w3c.dom.* ;

public class TestMain {
  public static void main(String[] args) {
    try {
      CreateData cd = new CreateData("test") ;
//      CreateData cd = new CreateData() ;
      cd.setAutoCN(true) ;
      for (int i = 0 ; i < 10 ; i++) {
        if (i == 5) {
          // きりのいい所でカレントノードを変えてみる
          cd.changeCullentNode(cd.getDocument().getDocumentElement()) ;
        }
        cd.appendChildElement("element" + i) ;
      }
//      OutputStream os = new FileOutputStream("test1.xml") ;
//      cd.documentOutput(os) ;
//      os.close() ;
        cd.documentOutput(System.out) ;
    }
    catch (Exception e) {
      e.printStackTrace() ;
    }
  }
}

/* ここから CreateData.java */

import java.io.* ;
import javax.xml.parsers.* ;
import javax.xml.transform.* ;
import javax.xml.transform.dom.* ;
import javax.xml.transform.stream.* ;
import org.xml.sax.* ;
import org.w3c.dom.* ;

public class CreateData {

  /** このクラスの核 */
  private Document _document ;
  /** 解析に使えるかもインスタンス */
  private DocumentBuilderFactory _dbf ;
  /** 色々使えるかもインスタンス */
  private DocumentBuilder _db ;
  private String _sysId ;
  private String _pubId ;
  private Node _cullentNode ;
  private boolean _isAutoCN = false ;

  /** 
   * デフォルトコンストラクタ
   * 
   * @throws ParserConfigurationException ビルダ作成時の例外
   */
  public CreateData() throws ParserConfigurationException {
    _dbf = DocumentBuilderFactory.newInstance() ;
    _db = _dbf.newDocumentBuilder() ;
    this._document = _db.newDocument() ;
    this._cullentNode = this._document ;
  }

  /** 
   * ルートノードにパラメータのrootを持つDocumentを作成
   * 
   * @param root ルート(のタグ名)
   * @throws ParserConfigurationException ビルダ作成時の例外
   */
  public CreateData(String root) throws ParserConfigurationException {
    _dbf = DocumentBuilderFactory.newInstance() ;
    _db = _dbf.newDocumentBuilder() ;
    DOMImplementation domi = _db.getDOMImplementation() ;
    DocumentType dt = domi.createDocumentType(root, null, null) ;
    this._document = domi.createDocument(root, root, dt) ;
    this._cullentNode = this._document.getDocumentElement() ;
  }

  public Document getDocument() {
    return _document ;
  }

  public void setAutoCN(boolean b) {
    _isAutoCN = b ;
  }

  public Node changeCullentNode(Node newNode) {
    Node old = _cullentNode ;
    _cullentNode = newNode ;
    return old ;
  }

  public Node appendChild(Node newNode) {
    Node old = _cullentNode ;
    Node n = _cullentNode.appendChild(newNode) ;
    if (_isAutoCN) {
      _cullentNode = n ;
    }
    return old ;
  }

  public Node appendChildElement(String eName) {
    Node old = _cullentNode ;
    Node n = _cullentNode.appendChild(_document.createElement(eName)) ;
    if (_isAutoCN) {
      _cullentNode = n ;
    }
    return old ;
  }

  /** 
   * 内部に持ったDocumentをパラメータのOutputStreamへ出力
   * 
   * @param out 出力先
   * @throws TransformerException 変換例外
   */
  public void documentOutput(OutputStream out) throws TransformerException {
    /* 出力に便利なクラス */
    Transformer t = TransformerFactory.newInstance().newTransformer() ;

    /* 出力オプション指定 */
    // エンコーディング
    t.setOutputProperty(OutputKeys.ENCODING, "Shift_JIS") ;
    // インデント
    t.setOutputProperty(OutputKeys.INDENT, "yes") ;
    // DOCTYPE:SYSTEM
    if (_sysId != null) {
      t.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, _sysId) ;
    }
    // DOCTYPE:PUBLIC
    if (_pubId != null) {
      t.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, _pubId) ;
    }

    /* 出力 */
    t.transform(new DOMSource(_document), new StreamResult(out)) ;
  }

  public String toString() {
    return _document.getDocumentElement().toString() ;
  }
}

------------------------------------------------------------------------------------------------
<実行結果>

上記 TestMainをそのまま実行するとコンソールへ以下の内容が

<?xml version="1.0" encoding="Shift_JIS"?>
<test>
<element0>
<element1>
<element2>
<element3>
<element4/>
</element3>
</element2>
</element1>
</element0>
<element5>
<element6>
<element7>
<element8>
<element9/>
</element8>
</element7>
</element6>
</element5>
</test>

出力先をファイルに変更して 出来たXMLファイルを
IE で見てみるとこんな感じになります。

  <?xml version="1.0" encoding="Shift_JIS" ?> 
- <test>
  - <element0>
    - <element1>
      - <element2>
        - <element3>
            <element4 /> 
          </element3>
        </element2>
      </element1>
    </element0>
  - <element5>
    - <element6>
      - <element7>
        - <element8>
            <element9 /> 
          </element8>
        </element7>
      </element6>
    </element5>
  </test>

---------------------------------------------------------------------------------------------
<解説>

TestMainでの処理は ループでエレメント追加をしているだけです。
CreateDataクラスでは 、
  Documentインスタンス作成
  XMLツリー内での移動
  XMLツリー現在位置への Node 追加
  OutputStreamへの Document出力(変換)
の機能を持たせています。

まず、Documentインスタンスの作成は、便利クラスを作るまでも無く簡単に出来ます。

XMLツリー内での移動、XMLツリー現在位置への Node追加は
Documentを、より直感的に操作できるように加えた機能です。
ファイル、ディレクトリ等を想像すると解りやすいと思います。(現在位置に対して操作をするとか)

Document の出力ですが、今回は Transformerインスタンスを使用して出力しています。
J2SE1.4 に write メソッドを持った org.apache.crimson.tree.XmlDocument と言う
Document実装クラスが存在しますが、このクラスは J2SE1.4 に組み込まれて入るものの
正式な J2SE1.4 パッケージでは無いようです。
(実際 公開されている1.4APIリファレンスにも存在しない)
ちょっと極端な話をすると、今使っている環境では XmlDocument を使用して Document
インスタンスの作成が可能かもしれないが、バージョンアップでパッケージ変更、
実装内容変更等が発生した場合は全然使えないクラスを作成してしまうことになってしまいます。
その為に現在 公開されているインターフェイスを使用して Document作成、
アクセスする必要があります。

で、この場合インターフェイスが変更されてしまっては元も子も無いのですが
それは無いでしょってことで :-P

おまけ:APIリファレンスより
『sun.* パッケージについての注』
http://java.sun.com/products/jdk/faq/faq-sun-packages.html

                                                                  ワタサト
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━【Javaのお作法】━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
○Javaのお作法
第34回目のお題は「可変データのパラメータ渡し」です。

今回のお作法は、Appletです。
表示するためのHtmlファイルも用意してください。

以下のファイルを作成します。
Saho01.html
Saho02.html
Saho01.java
Saho02.java

/* Saho01.html */
<html>
  <head>
    <title>
    applet
    </title>
  </head>

  <body>
    <applet code="Saho01" width="500" height="300">
    </applet>
  </body>
</html>

/* Saho01.java */
import java.awt.* ;
import java.applet.* ;

public class Saho01 extends Applet {
    public void paint(Graphics g) {
        Font  f = new Font("TimesRoman", Font.BOLD, 48) ;
        Color c = new Color(150, 100, 50) ;
        g.setFont(f) ;
        g.setColor(c) ;
        g.drawString("Welcome!", 100, 100) ;
    } // paint()
}

/* Saho02.html */
<html>
  <head>
    <title>
    applet
    </title>
  </head>

  <body>
    <applet code="Saho02" width="500" height="300">
      <!-- パラメータを設定 -->
      <param name="MESSAGE" value="Welcome!">
      <param name="RED" value="150">
      <param name="GREEN" value="100">
      <param name="BLUE" value="50">
    </applet>
  </body>
</html>

/* Saho02.java */
import java.awt.* ;
import java.applet.* ;

public class Saho02 extends Applet {
    String msg_ ;
    int red_ ;
    int green_ ;
    int blue_ ;

    public void init() {
        // Htmlで設定されたパラメータを取得
        msg_   = getParameter("MESSAGE") ;
        red_   = Integer.parseInt(getParameter("RED")) ;
        blue_  = Integer.parseInt(getParameter("GREEN")) ;
        green_ = Integer.parseInt(getParameter("BLUE")) ;
    } // init()

    public void paint(Graphics g) {
        Font  f = new Font("TimesRoman", Font.BOLD, 48) ;
        Color c = new Color(red_, green_, blue_) ;
        g.setFont(f) ;
        g.setColor(c) ;
        g.drawString(msg_, 100, 100) ;
    } // paint()
}

Saho01.java、Saho02.javaをコンパイルしたら、Saho01.html、
Saho02.htmlを実行してみてください。
----------------------------------------------------------------------------
<実行結果>
どちらのファイルも、「Welcome!」という茶色の文字列が表示されます。

----------------------------------------------------------------------------
<解説>
Saho01.htmlもSaho02.htmlも、どちらも同じ画面が表示されますが、
それぞれの要素の取得の仕方が異なっています。
Saho01のほうは、Saho01.javaに直接、表示する言葉と色を書き込んでいます。
一方、Saho02のほうは、Saho02.htmlにパラメータとして指定しています。
どちらがいいかといえば、どちらでもいいのですが、これから変わる要素の場合は、
Saho02のように、Htmlに設定しておいたほうが、再コンパイルの必要がないので楽です。
このことは、もちろん画像にもいえることです。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━【コラム】━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1995年のビッグバン以来、Javaによって作られたソフトウェアは、
ものすごい勢いで私たちの生活の身近な至る所に所に潜り込み、根をおろし、
ひっそりと活躍をし出している。
現在この「JavaDNA」は業務上のコンピュータ内はもちろんのこと、
家庭にあるパソコンで利用されるクライアントソフト、ブラウザの中、
Webサーバーのバックグラウンド、PDFや携帯電話の中、などなど列挙の暇がないほど
広まり、繁殖を続けている。今後「JavaDNA」がどういった方向に成長を続けるのか、
我々プログラマはまさにその渦中にあり、非常に興味深い。]
皆さんも気付かないところでJavaに触れている。それは例えばポカリスウェットの
自動販売機で見かけることができる。
そう、あのCM等で有名な、シンビーノの「ジャワティー」の綴りは「Java Tea」
であることをご存知であろうか?今日び紅茶にもJavaの時代なのである。
しかしこれはむしろ80年代、私が小学生の時からあった気がしたがそれは気のせいだ。
紅茶中で動くJavaは体にプラスに作用する。そんなやさしいデジタル飲料なのである。
また皆さんカレーはお好きだろうか?辛い物が好きな私は、カレーが大好きだ。
辛いカレーと言えばそう、「ジャワカレー」の綴りも「Java Curry」だ。
今やカレーの中にまで…である。こちらは私が幼稚園の70年代からあった気がするが
それももちろん気のせいだ。
「ジャワカレー」のCMで有名なワイルドな魅力が光る俳優、岩城晃一は、
若い頃アンデス山脈を登山中UFOに連れ去られ、宇宙人により右脳にJVMが埋め込まれたと
言う話は案外知られていない。そう、彼はJavaで動いていたのだ。
これを岩城上で動くJavaと言うことで「イワキレット」と名付けられた。
皆さんも身近なJavaを探してみましょう。

                                                                デマつ本 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━【次回予告】━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ・ServletTips:051
 ・Javaのお作法:第35回
 ・コラム
 次回は、1月6日発行予定です。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━【編集後記】━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
最近思うこと。。。冬眠するってどういう気持ちなんだろう?
クマさんとかは冬の間ずーっと寝てるんだよなー。自分もすごくやってみたいのです。                                                                by けん
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
            <Java無料セミナー「サーバーサイドJava入門編」のご案内>

        昨年よりご好評いただいております株式会社慶の無料Javaセミナー。
        今年よりさらに充実した内容にてパワーアップして開催いたしております。
        サーブレットは現在Javaの世界の中でも非常に注目を浴びている技術で、
        サーブレットにより構築されたwebサイトも珍しくなくなってきました。
        是非、この機会にサーブレットの基礎技術を身につけてみませんか?
        当コースではサーブレットの他にもJSPやデザインパターンの学習も予定し
        ております。
        また弊社の最大の武器の1つである「KSFramework」のご紹介もさせて頂く
        予定です。
        是非ご参加ください!

                        内容/日程の詳細については
                    http://www.kei-ha.co.jp/je.html
                            をご参照下さい。
                ★尚、ご応募方法が変更になっております!
                    携帯電話でもセミナー予約ができます。

                                応募方法:
                    お手持ちの携帯電話(またはパソコン)で
                            http://kcode.jpにアクセス!

                ご希望のセミナーを選んでそのままメールを送信!
                送信後、こちらから登録手続きのURL送信致しますので、
                予約、会員登録を行って下さい。
                折り返しこちらから登録完了のご案内を差し上げます。

2)ショッピング
          ////////////////////////////////////////////////////////////
                      K-code 新着情報!!
          ////////////////////////////////////////////////////////////

                    K-codeショップに新しい仲間が誕生しました
                    「空と自衛隊グッズのお店"Blue Max"

           航空ショーのイベントや自衛隊直営の売店でしか手に入らない
           オリジナルグッズがインターネット/ケータイでお求めになります。

                    インターネットの方はこちら↓
                    http://kcode.jp/shop/bluemax

                    ケータイの方はこちら↓
                    http://kcode.jp
                    「ショッピング」をクリック!


                          さらに詳しい内容については
                           http://www.kei-ha.co.jp
                             をご覧いただくか、
                             kcode@kei-ha.co.jp
                           までお問合せください。

               ご登録、ご意見、ご質問、お待ちいたしております!
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
--------------------------------------------------------------------------------
                              このメールマガジンは、
                        インターネットの本屋さん『まぐまぐ』
                  http://www.mag2.com/ (マガジンID:  0000073164)
                      総合メールマガジンポータルサイト melma!
                   http://www.melma.com/ (マガジンID: m00048716)
                            を利用して発行しています。
--------------------------------------------------------------------------------

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
        登録/解除の方法
        http://www.kei-ha.co.jp/mag.html
       「(秘)JavaServlet技法」は 上記URLよりいつでも登録/解除可能です。
        メルマガについてのご意見・ご質問等はこちらまで  mag@kei-ha.co.jp
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
                           Copyright(C) 2001 Kei Corporation All Right Reserved
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

規約に同意してこのメルマガに登録/解除する

メルマガ情報

創刊日:2001-10-02  
最終発行日:  
発行周期:毎週月曜発行  
Score!: - 点   

コメント一覧コメントを書く

この記事にコメントを書く

上の画像で表示されている文字を半角英数で入力してください。

※コメントの内容はこのページに公開されます。発行者さんだけが閲覧できるものではありません。 コメントの投稿時は投稿者規約への同意が必要です。

  • コメントはありません。