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());
}
}
}
手順は以下のとおり。
- Digesterクラスのインスタンスを生成。
- ルールを設定する。
- 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>

