SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

今からでも遅くない、JAXPを学ぼう!

今からでも遅くない JAXPを学ぼう!(前編)
XPathとXSLTを体験する

まずはXPathとXSLTの理解から


ダウンロード サンプルコード (3.2 KB)

実際に変換する

変換するための準備

 「JAXPとは何か」では抽象的な表現を使いましたが、XSLTを例にすると、XSLTスタイルシートを使うにはXSLTプロセッサが必要です。XSLTプロセッサとは実際にXSLTスタイルシートの規則を適用し、変換を行うものです。JDBCがRDBの違いを、JMSがMOM製品の違いを、JPAがO/Rマッパーの違いを吸収してくれるのと同じく、JAXPもXSLTプロセッサの違いを吸収し、XSLTプロセッサを意識することなくコーディングできるようになっています。

 今回はJAXPのAPIをSerlvet上に記述するため、WebアプリケーションサーバであるGlassFishを使います。開発環境は皆さんの使い慣れたものを使ってください。今回はNetBeansを使って説明します。

 GlassFishとNetBeansは「GlassFishとNetBeansのインストール」を参考にインストールしてください。XSLTプロセッサのインストールは必要ありません。

プロジェクトを作成

 Eclipseなどの開発ツールをご使用の方は同等の操作をお願いします。NetBeansでプロジェクトを作成するには[ファイル]-[新規プロジェクト]を選択すると[新規プロジェクト]画面が開きます。[カテゴリ]のリストから「Java Web」を選択するとプロジェクトに複数の選択肢が表示されます。今回、JAXPのAPIはServlet内に記述するため「Web アプリケーション」を選択します。[プロジェクト名]に「JAXPSample1」を入力し[次へ]ボタンをクリックします。[コンテキストパス]は入力可能ですが、そのままで構いません。今回はフレームワークは使わないため、[次へ]ボタンではなく[完了]ボタンをクリックします。NetBeansの左ペインにJAXPSample1というプロジェクトが作成されているはずです。

XMLからHTML変換するクラスを実装

 では、JAXPのAPIを使ってMeigara.xmlファイルをHTMLファイルに変換しブラウザに表示するためのServletを作成します。JAXPSample1プロジェクトを右クリックし、[新規]-[サーブレット]を選択します。[サーブレット]が選択肢にない場合、[その他]から[サーブレット]を選択してください。エディタが右ペインに開きます。詳細な説明は後述するので、まずはリスト3のように入力するか、ページトップにあるサンプルコードのNonAttributeServlet.javaの内容をコピー&ペーストしてください。

リスト3.NonAttributeServlet.java抜粋
001:package jp.kawakubo;
002:
003:import java.io.IOException;
004:import java.io.PrintWriter;
005:import javax.servlet.ServletException;
006:import javax.servlet.http.HttpServlet;
007:import javax.servlet.http.HttpServletRequest;
008:import javax.servlet.http.HttpServletResponse;
009:import javax.xml.transform.Transformer;
010:import javax.xml.transform.TransformerConfigurationException;
011:import javax.xml.transform.TransformerException;
012:import javax.xml.transform.TransformerFactory;
013:import javax.xml.transform.stream.StreamResult;
014:import javax.xml.transform.stream.StreamSource;
015:
016:/**
017: *
018: * @author tomoharu
019: */
020:public class NonAttributeServlet extends HttpServlet {
021:
022:    private static final String XSLT_PATH = "file:///Users/tomoharu/Documents/XSLSample/XSLTSample01.xsl";
023:    private static final String SOURCE_PATH = "file:///Users/tomoharu/Documents/XMLSample/Meigara.xml";
024:   
025:    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
026:    throws ServletException, IOException {
027:
028:        response.setContentType("text/html; charset=UTF-8");
029:        PrintWriter pw = response.getWriter();
030:
031:        try {
032:            TransformerFactory transformerFactory = TransformerFactory.newInstance();
033:            Transformer transformer = transformerFactory.newTransformer(new StreamSource(XSLT_PATH));
034:            StreamSource ss = new StreamSource(SOURCE_PATH);
035:            StreamResult sr = new StreamResult(pw);
036:            // Meigara文書をXSTSample01スタイルシートでHTMLファイルに変換
037:            transformer.transform(ss, sr);
038:        } catch (TransformerConfigurationException tce) {
039:            tce.printStackTrace();
040:        } catch (TransformerException te) {
041:            te.printStackTrace();
042:        } catch (Exception e) {
043:            e.printStackTrace();
044:        }
045:    }

 非常にシンプルなコードで驚かれた方も多いと思います。順に説明します。

  • 22行目でXSLTスタイルシートのパスを、23行目でXML文書のパスを指定しています。
  • 32行目で実際に変換を行うTransformerを生成するためのTransformerFactoryを生成しています。
  • 33行目でTransformerFactoryからTransformerオブジェクトを生成しています。引数は22行目で指定したパス名より生成したStreamSourceオブジェクトです。
  • 34行目で変換対象のXML文書を引数としてStreamSourceを生成しています。DOMやSAXを扱う場合、DOMSourceやSAXSourceとなります。
  • 35行目はPrintWriterを引数にStreamResultを生成しています。入力同様、出力もDOMやSAXの場合、DOMResultやSAXResultとなります。
  • 36行目でTransformerのtransformメソッドを使い、入力ツリーを出力ツリーに変換しています。XSLTの場合、ノード(要素や属性など)から構成されるツリーを変換対象とするため文書とは呼ばずツリーと呼ばれます。transformメソッドの第1引数が入力ツリーで、第2引数が出力ツリーです。第1引数の型はSourceインターフェースでSreamSource、DOMSource、SAXSourceがその具象クラスです。第2引数の型はResultインターフェースでStreamResult、DOMResult、SAXResultが具象クラスです。目的に応じインスタンス化したものを引数に渡す必要があります。今回はStreamSourceとStreamResultを使用しています。ここは難しく考えず、変換元がSource、変換後がResultという器に入っていると考えてください。

Servletを呼び出すJSPを記述

 [プロジェクトを作成]で[Web アプリケーション]を選択しましたが、プロジェクト作成後、JAXPSample1のWebページの直下にindex.jspがデフォルトで作成されるので、リスト4のように書き換えます。

リスト4.index.jsp
001:<%@page contentType="text/html" pageEncoding="UTF-8"%>
002:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
003:   "http://www.w3.org/TR/html4/loose.dtd">
004:
005:<html>
006:    <head>
007:        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
008:        <title>XSLTテスト1</title>
009:    </head>
010:    <body>
011:        <h1>XSLTのテスト(ソースXMLに属性がない場合)</h1>
012:        <form action="/JAXPSample1/NonAttributeServlet">
013:            <input type="submit" value="銘柄リストへ"/>
014:        </form>
015:    </body>
016:</html>

 以上で、準備は整いました。

次のページ
XSLTSample01スタイルシート解説

この記事は参考になりましたか?

今からでも遅くない、JAXPを学ぼう!連載記事一覧
この記事の著者

川久保 智晴(カワクボ トモハル)

haruプログラミング教室(https://haru-idea.jp/)主宰。COBOL、FORTRANで13年、Javaを中心としたWeb開発で11年。3つしか言語知らないのかというとそうでもなく、sed/awk、Perl、Python, PHP,  C#, JavaScriptなども一時期は業...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5137 2010/05/31 16:41

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー