本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

XForms のヒント: XForms データを Java で受け付ける

Nicholas Chase (nicholas@nicholaschase.com), President, Chase and Chase, Inc.
Nicholas Chase は、Lucent Technologies や Sun Microsystems、Oracle、the Tampa Bay Buccaneers などの会社で Web 開発に携わってきました。彼は高校の物理の先生であり、低レベル放射性廃棄物施設の管理者であり、オンライン SF 雑誌の編集者であり、マルチメディアのエンジニアであり、Oracle インストラクターであり、あるインタラクティブ・コミュニケーション会社の最高技術責任者でもあります。『XML Primer Plus』(Sams 刊) を含めて、何冊かの著作があります。

概要: XForms の機能で、対話機能と XML で情報を送信できる機能については、さまざまなことが行われてきました。しかしそうした機能も、サーバーにデータを送信した後、そのデータを分析する方法がなければ役に立ちません。このヒントでは、送信された XML データにアクセするするために、Java サーブレットを使う方法について説明します。

日付:  2006年 10月 03日
レベル:  中級 この記事の原文:  英語
アクティビティー: 3191 ビュー
お気軽にご意見・ご感想をお寄せください: 


テスト対象のブラウザー

このヒントで説明する XForms のサンプルは、(XForms エクステンションをインストールした) Firefox 1.5 と、Formsplayer コントロールをインストールした Microsoft Internet Explorer 6 でテストされ、動作しています。ダウンロードには、Firefox 用の XHTML ファイルと IE 用の HTML ファイルが含まれています。

インスタンス・データ

ここで、オークションで購入したアイテムの管理を目的としたアプリケーション例を考えてみましょう。このアプリケーションは、リスト 1 のようなものです。



リスト 1. インスタンス・データ
                
<auctionRecords  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
   <auctionItem itemID="1"> 
      <purchaseDate>9/18/06</purchaseDate>
      <auctionLength xsi:type="xsd:int">86</auctionLength>
      <purchasePrice>20</purchasePrice>
      <description>McCoy train decanter (red)</description> 
      <estimatedValue>35</estimatedValue>
   </auctionItem>
   <auctionItem itemID="2">
      <purchaseDate>9/18/06</purchaseDate>
      <auctionLength xsi:type="xsd:int">32</auctionLength>
      <purchasePrice>10</purchasePrice>
      <description>Vintage hair dryer</description>
      <estimatedValue>N/A</estimatedValue>
   </auctionItem>
</auctionRecords>

このフォームは、既存のアイテムを編集、削除する機能を持ち、また新しいアイテムを追加する機能も持っています。


フォーム

フォームを作成する際には送信オプションがいくつかありますが、このヒントでは単純な POST リクエストを取り上げます (リスト 2)。


リスト 2. フォーム
                
<?xml version="1.0" encoding="ASCII"?>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ev="http://www.w3.org/2001/xml-events"  
    xmlns:xforms="http://www.w3.org/2002/xforms">
  <head>
    <title>Instance Data-To-XHTML/XForms Example</title>
    <xforms:model id="model_auctionRecords">

      <xforms:instance id="instance_model_auctionRecords" 
                                           src="auctions.xml"/>
      <xforms:submission id="submit_model_auctionRecords" method="post"
           action="http://localhost:8080/MakeItWork/AcceptData" />

    </xforms:model>
    <link href="gen_default.css" rel="stylesheet"/>
  </head>
  <body>
  
    <h1 align="center">Auction Item Inventory</h1>
  
    <xforms:repeat model="model_auctionRecords" 
        id="repeat_auctionItem_model_auctionRecords"
        nodeset="/auctionRecords/auctionItem">
      <xforms:input ref="." model="model_auctionRecords">
        <xforms:label>Auction Item</xforms:label>
      </xforms:input>
      <xforms:input ref="./@itemID" model="model_auctionRecords">
        <xforms:label>ItemID</xforms:label>
      </xforms:input>
      <xforms:input ref="purchaseDate" model="model_auctionRecords">
        <xforms:label>Purchase Date</xforms:label>
      </xforms:input>
      <xforms:input ref="auctionLength" model="model_auctionRecords">
        <xforms:label>Auction Length</xforms:label>
        <xforms:message level="modal" ev:event="xforms-invalid">The 
                  Auction Length is the duration of the auction for 
                  This item, in seconds.  It must be an integer 
                  value.</xforms:message>
      </xforms:input>
      <xforms:input ref="purchasePrice" model="model_auctionRecords">
        <xforms:label>Purchase Price</xforms:label>
      </xforms:input>
      <xforms:input ref="description" model="model_auctionRecords">
        <xforms:label>Description</xforms:label>
      </xforms:input>
      <xforms:input ref="estimatedValue" model="model_auctionRecords">
        <xforms:label>Estimated Value</xforms:label>
      </xforms:input>
      <xforms:upload ref="image" model="model_auctionRecords">
        <xforms:label>Upload Photo</xforms:label>
        <xforms:filename ref="./@filename"  />
        <xforms:mediatype ref="./image/@mediaType" />
      </xforms:upload>
    </xforms:repeat>
    <xforms:group>
      <xforms:trigger>
        <xforms:label>Add Auction Item</xforms:label>
        <xforms:insert ev:event="DOMActivate" 
            at="index('repeat_auctionItem_model_auctionRecords')"
            position="after" nodeset="/auctionRecords/auctionItem"/>
      </xforms:trigger>
      <xforms:trigger>
        <xforms:label>Delete Auction Item</xforms:label>
        <xforms:delete ev:event="DOMActivate" 
            at="index('repeat_auctionItem_model_auctionRecords')"
            nodeset="/auctionRecords/auctionItem"/>
      </xforms:trigger>
    </xforms:group>
    <xforms:submit submission="submit_model_auctionRecords">
      <xforms:label>Submit</xforms:label>
    </xforms:submit>
  </body>
</html>

リスト 2 を見ても、データに関して何もおかしなことをしていないことに注意してください。おかしなエンコーディング方式もなく、宛先 (つまり action) は単純な Java™ サーブレットです。この方法で送信されるフォームは、XML インスタンス文書を、単純に POST リクエストの内容として送信します。


基本的なサーブレット

データは POST リクエストとして送信されるため、必要なことは doGet() メソッドを実装することだけです (リスト 3)。


リスト 3. 基本的なサーブレット
                
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

public class AcceptData extends javax.servlet.http.HttpServlet 
                               implements javax.servlet.Servlet {
   
   protected void doPost(HttpServletRequest request, 
                         HttpServletResponse response) 
                     throws ServletException, IOException {

      int length = request.getContentLength();
      response.getWriter().print(length);
   }               
}

このサーブレットは、サーブレットの他の部分のために必要なインポート文の他に、POST の内容を含んだリクエストのサイズを単純に取得し、それを Web ページに出力します。このフォームを送信すると、例えば 748 のような数字がブラウザーに出力されます (図 1)。


図 1. 単純なサーブレットを実行する

これは取得すべきデータがあることを示していますが、このデータには、もっと他にも有効な使い道があるのです。


String としてデータを取得する

次のステップは、実際のデータを String として取得することです。そうすることによって、意図したとおりのものを実際に送信していることのチェックとして、このデータをブラウザーに戻して出力することができます (リスト 4)。


リスト 4. データを String として取得する
                
...
public class AcceptData extends javax.servlet.http.HttpServlet 
                               implements javax.servlet.Servlet {

   private String getRequestAsString(HttpServletRequest request) 
                                          throws java.io.IOException {

      BufferedReader requestData = new BufferedReader(
                      new InputStreamReader(request.getInputStream()));
      StringBuffer stringBuffer = new StringBuffer();
      String line;
      try{
         while ((line = requestData.readLine()) != null) {
            stringBuffer.append(line);
         }
      } catch (Exception e){
      }
      return stringBuffer.toString();

   }
   
   protected void doPost(HttpServletRequest request, 
                         HttpServletResponse response) 
                     throws ServletException, IOException {

      try {
         int length = request.getContentLength();
        
         String content = 
             String content = getRequestAsString(request);
         response.getWriter().println(content);
                   
      } catch (Exception e){
         e.printStackTrace();
      }
   }
}

ご覧のとおり、サーブレット・リクエストはこれを、InputStream としてのデータにアクセスするための手段として提供しています。そして、このオブジェクトを使うことによって、データを単純な String オブジェクトに変換することができます。このフォームを送信すると、インスタンス文書がエコー・バックされるはずです (図 2)。


図 2. インスタンス文書


DOM Document として XML にアクセスする

では、このデータを実際に処理するにはどうするのでしょう。幸い、既に String として XML を持っているので、問題はありません (リスト 5)。


リスト 5. XML データを処理する
                
...
   protected void doPost(HttpServletRequest request, 
                         HttpServletResponse response) 
                     throws ServletException, IOException {
      try {
         int length = request.getContentLength();
      
         String content = 
                                    getRequestAsString(request);
      
      DocumentBuilder builder = 
        DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document saveDocument = 
           builder.parse(new InputSource(new StringReader(content)));
      
        response.getWriter().println("The root element is "
                   +saveDocument.getDocumentElement().getNodeName());
              
      } catch (Exception e){
         e.printStackTrace();
      }
   }
}

まず、新しい DocumentBuilder を作成し、この DocumentBuilder を使って String の内容を構文解析することで、新しい Document を作成します。それから後は、ここで行ったように、例えばルート要素の名前を出力するなど、この Document を他の DOM Document とまったく同じように使うことができます。


まとめ

XML データは POST リクエストの本体として送信されるため、そのリクエストのストリング値を取得し、構文解析することによって、その XML データに Java サーブレットから容易にアクセスすることができます。それから後は、従来の方法で取得したデータとまったく同じように扱うことができます。



ダウンロード

内容ファイル名サイズダウンロード形式
Java XForms samplesxforms_java_.source.zip5KBHTTP

ダウンロード形式について


参考文献

著者について

Nicholas Chase

Nicholas Chase は、Lucent Technologies や Sun Microsystems、Oracle、the Tampa Bay Buccaneers などの会社で Web 開発に携わってきました。彼は高校の物理の先生であり、低レベル放射性廃棄物施設の管理者であり、オンライン SF 雑誌の編集者であり、マルチメディアのエンジニアであり、Oracle インストラクターであり、あるインタラクティブ・コミュニケーション会社の最高技術責任者でもあります。『XML Primer Plus』(Sams 刊) を含めて、何冊かの著作があります。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML
ArticleID=243051
ArticleTitle=XForms のヒント: XForms データを Java で受け付ける
publish-date=10032006
author1-email=nicholas@nicholaschase.com
author1-email-cc=dwxed@us.ibm.com

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。