モバイルにも対応したページを実現するにはJavaTips 〜JSP/サーブレット編

» 2005年03月23日 10時00分 公開
[山田祥寛@IT]

 PCと携帯電話などのモバイル端末の両方に対応した「マルチデバイス対応」のページ作成の方法を紹介しましょう。XMLとXSLT(Extensible Stylesheet Language Transformations)の組み合わせによって、コンテンツそのものはXML文書として統一的に用意しておき(One Source)、あとは用途に応じて異なるXSLTスタイルシートを介することで、状況に応じたフォーマットで出力することができます(Multi Use)。

サーブレットクラスを作成する

 XSLT変換を行うためのサーブレットクラスを定義します。本サンプルで利用するXML文書(music.xml)、XSLTスタイルシート(pc.xsl、mobile.xsl)はあらかじめアプリケーションルート配下の「/WEB-INF/data」フォルダに配置してあるものとします。なお、music.xml、pc.xsl、mobile.xslについては、本TIPSでは扱いません。

 ここではXSLTを利用したコーディングの流れを理解していただき、コードのロジックについてはコード内のコメントを参照してください。

  1. 入出力のためのStreamSource/StreamResultオブジェクトを用意(
  2. Transformerオブジェクト(XSLTプロセッサ)の生成(
  3. XSLT変換の実行(

 ここではサンプルをシンプルにするために、単にUser-Agentヘッダの値から判定してif命令で分岐しているだけですが、データベースでデバイス機器とXSLTスタイルシートとの対応表を管理しておいて、これを動的に読み出すようにすれば、より実践的なマルチデバイス対応アプリケーションを作成することもできるでしょう。また、今回はあらかじめ用意した静的なXML文書を読み出していますが、もちろん、XML文書そのものを動的に作成し、XSLTスタイルシートで変換することも可能です。

MultiDevice.java
package to.msn.wings.javatips;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class MultiDevice extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    String xml,xsl;
    ServletContext application=this.getServletContext();
    response.setContentType("text/html; charset=Windows-31J");
    PrintWriter out=response.getWriter();
    try {
      xml=application.getRealPath("WEB-INF/data/music.xml");
       // User-Agentヘッダに"DoCoMo"という文字が含まれるかどうかで
      // アクセスしてきたデバイスがiモード対応端末かどうかを
      // 判定/振り分け

      if(request.getHeader("user-agent").indexOf("DoCoMo")==-1){
        xsl=application.getRealPath("WEB-INF/data/pc.xsl");
      }else{
        xsl=application.getRealPath("WEB-INF/data/mobile.xsl");
      }
       // 入力元となるXML、XSLTを表すStreamSourceオブジェクトを生成
      StreamSource objXml=new StreamSource(xml);
      StreamSource objXsl=new StreamSource(xsl);
       // 変換結果の出力先を表すStreamResultオブジェクトを生成
      StreamResult objOut=new StreamResult(out);

      // Transformerオブジェクトを生成
      TransformerFactory objFac=TransformerFactory.newInstance();
      Transformer objTrn=objFac.newTransformer(objXsl);

      // 変換処理
      objTrn.transform(objXml,objOut);

    } catch (TransformerConfigurationException e) {
      e.printStackTrace(System.err);
    } catch (TransformerFactoryConfigurationError e) {
      e.printStackTrace(System.err);
    } catch (TransformerException e) {
      e.printStackTrace(System.err);
    } 
  }
}


デプロイメント・ディスクリプタにサーブレットクラスを登録する

 サーブレットクラスを実行するにあたっては、あらかじめデプロイメント・ディスクリプタ(web.xml)に対して、サーブレットの登録を行っておく必要があります。<url-pattern>要素に「/multi.html」のように指定しておくことで、サーブレットクラスをあたかも静的なHTMLファイルであるかのように見せることができます(基礎から学ぶサーブレット/JSP 第11回「JSPとサーブレットの違いを明らかにする」)も合わせて参照してください)。

web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"
  version="2.4">
  <servlet>
    <servlet-name>MultiDevice</servlet-name>
    <servlet-class>to.msn.wings.javatips.MultiDevice</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>MultiDevice</servlet-name>
    <url-pattern>/multi.html</url-pattern>
  </servlet-mapping>
</web-app>


実行結果

 コードの実行結果は、以下のようになります。

IEからアクセスした場合の実行結果 IEからアクセスした場合の実行結果
iモード対応端末からアクセスした場合の実行結果 iモード対応端末からアクセスした場合の実行結果

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。