ここで、オークションで購入したアイテムの管理を目的としたアプリケーション例を考えてみましょう。このアプリケーションは、リスト 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 として取得することです。そうすることによって、意図したとおりのものを実際に送信していることのチェックとして、このデータをブラウザーに戻して出力することができます (リスト 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. インスタンス文書
では、このデータを実際に処理するにはどうするのでしょう。幸い、既に 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 samples | xforms_java_.source.zip | 5KB | HTTP |
-
ディスカッション・フォーラムに参加してください。
-
このシリーズは、XForms を使い始めるためのガイドとして最適です。
- alphaWorks の Visual XForms Designer について学ぶには、ここから出発してください。
- Java リソースの宝庫、Java ゾーンを訪れてください。
-
developerWorks のXML ゾーンには、XForms や他の XML 技術に関するスキルの向上に役立つ資料が豊富に用意されています。
-
Technology bookstore には、この記事や他の技術的な話題に関する本が豊富に取り揃えられています。
