Commons Digester – マッピング

1月 1, 2003 · Posted in Apache Commons · Comment 

XMLファイルの読み込み。

前提

ここでは以下のXMLを利用する。
sample.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<books>
    <book name="i need coffee">
        <price>\3,000</price>
    </book>
    <book name="i love baby">
        <price>\1,500</price>
    </book>
</books>

Digesterでは、どのXMLとJavaクラスをどのようにマッピングするかというルールを開発者が指定できるため、Javaクラスは完全なPOJOで記述することができる。

ここでは一つの本を表すBookクラスと、その集まりを保持するBooksクラスを定義した。

Book.java

public class Book {
    private String name = null;
    private String price = null;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPrice() {
        return price;
    }
    public void setPrice(String price) {
        this.price = price;
    }
}

プロパティとsetter/getterのみ。

Books.java

import java.util.ArrayList;
import java.util.List;

public class Books {
    List books = null;

    public Books(){
        this.books = new ArrayList();
    }

    public void addBook(Book book){
        books.add(book);
    }

    public List getBooks(){
        return this.books;
    }
}

同じくプロパティとsetter/getterのみ。

マッピングする。

CreateBooksObject.java

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.apache.commons.digester.Digester;

public class CreateBooksObject{

    public static void main(String[] args) throws Exception{

        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        Digester digester = new Digester(parser);

        // ルールの設定
        digester.addObjectCreate("books", Books.class);
        digester.addObjectCreate("books/book", Book.class);
        digester.addSetProperties("books/book");
        digester.addSetNext("books/book", "addBook");
        digester.addBeanPropertySetter("books/book/price");

        // インスタンス生成
        InputStream in = new FileInputStream("resource/sample.xml");
        Books books = (Books)digester.parse(in);
        List bookList = books.getBooks();
        for(int i = 0; i < bookList.size(); i++){
            Book book = (Book)bookList.get(i);
            System.out.println(book.getName() + "\t" + book.getPrice());
        }
    }
}

手順は以下のとおり。

  1. Digesterクラスのインスタンスを生成。
  2. ルールを設定する。
  3. Digesterによって生成されたインスタンスを受け取る。

結果

i need coffee	\3,000
i love baby	\1,500

ルール

定義済みルールの一覧はDigester APIドキュメント内のRuleクラスより、サブクラス一覧を参照。

主なルール

ルール 定義
ObjectCreateRule オブジェクト生成
SetPropertiesRule すべての属性をプロパティにセット
BeanPropertySetterRule すべてのテキストノードをプロパティにセット

Commons Digester – 定義ファイルを外部に記述する

1月 1, 2003 · Posted in Apache Commons · Comment 

XMLファイルにルールを定義する

DigesterではXMLファイルにルールを定義することで、定義の局所化を行うことができる。これにより、ルールの追加・変更も容易になる。

各ファイル

sample.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<books>
    <book name="i need coffee">
        <price>\3,000</price>
    </book>
    <book name="i love baby">
        <price>\1,500</price>
    </book>
</books>

Book.java

public class Book {
    private String name = null;
    private String price = null;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPrice() {
        return price;
    }
    public void setPrice(String price) {
        this.price = price;
    }
}

Books.java

import java.util.ArrayList;
import java.util.List;

public class Books {
    List books = null;

    public Books(){
        this.books = new ArrayList();
    }

    public void addBook(Book book){
        books.add(book);
    }

    public List getBooks(){
        return this.books;
    }
}

ルール定義XMLファイル

rule.xml

<?xml version="1.0" encoding="Shift_JIS" ?>
<digester-rules>

    <pattern value="books">
         <object-create-rule classname="Books" />
        <set-properties-rule/>
    </pattern>

    <pattern value="books/book">
         <object-create-rule classname="Book" />
        <set-properties-rule/>
    </pattern>

    <pattern value="books/book">
        <set-next-rule methodname="addBook" classname="Books"/>
    </pattern>

    <pattern value="books/book/price">
        <bean-property-setter-rule/>
    </pattern>

</digester-rules>

マッピングを行う。

CreateBooksObjectByXml.java

import java.io.File;
import java.util.List;

import org.apache.commons.digester.Digester;
import org.apache.commons.digester.xmlrules.DigesterLoader;

public class CreateBooksObjectByXml {

    public static void main(String[] args) throws Exception{
        // ルールが設定されたDigesterオブジェクトの生成
        File file = new File("resource/rule.xml");
        Digester digester = DigesterLoader.createDigester(file.toURL());

        // オブジェクト生成
        Books books = (Books)digester.parse("resource/sample.xml");
        List bookList = books.getBooks();
        for(int i = 0; i < bookList.size(); i++){
            Book book = (Book)bookList.get(i);
            System.out.println(book.getName() + "\t" + book.getPrice());
        }
    }
}

ソース内のルール定義よりも、すっきりとしたコードになった。

結果

i need coffee	\3,000
i love baby	\1,500

HttpClient – GETメソッドを用いた通信

1月 1, 2003 · Posted in Apache Commons · Comment 

GET

GETメソッドで通信を行うためには、GetMethodクラスを利用すればよい。

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;

public class Get {
    public static void main(String[] args) throws Exception{
        GetMethod method = new GetMethod ("http://localhost/DummyProject/");
        HttpClient httpclient = new HttpClient();
        try {
            int result = httpclient.executeMethod(method);
            System.out.println(result);
            System.out.println(method.getName());
            System.out.println(method.getStatusText());
            System.out.println(method.getPath());
            System.out.println(method.getResponseBodyAsString());
        } finally {
            method.releaseConnection();
        }
    }
}

結果

200
GET
OK
/DummyProject
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Dummy Index</title>
</head>
<body>
Hello.
</body>
</html>

« 前ページへ次ページへ »