パラメータのバインディング


HttpServletRequest から getPrameter してJavaBeans にバインディングする
コードのサンプルを作ってみました。
multipart/form-data の場合をサポートしてないけど、まぁいいや。
あっ、下のコードで import JavaBeansClass ってのは


public interface JavaBeansClass {
}


って空っぽのインターフェースです。
このインターフェースを implements したクラスを bind の第2引数に渡す。

あっ、下のコードを実行するにはASFのcommons-beanutils.jarとか必要。
そのへんのjarファイルは自分で集めて下さい。m(_ _)m



import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import JavaBeansClass;

/**
* パラメータバインダークラスです
*/
public class ParameterBinder {

/**
* from から取得した値を to のプロパティに設定します

* @param from
* HttpServletRequest
* @param to
* バインドしたいロジック用JavaBeans
*/
public static void bind(HttpServletRequest from,
JavaBeansClass to) {

// TODO MIMEタイプが multipart/form-data の場合もbindで可能にする?
// try {
//
// Map formDataMap = getFormData(from);
// formDataMap.toString();
//
// } catch (ServletException e1) {
//
// e1.printStackTrace();
// }

Enumeration paramNames = from.getParameterNames();
Class toClass = to.getClass();
for (; paramNames.hasMoreElements();) {

String paramName = (String) paramNames.nextElement();
String paramValue = from.getParameter(paramName);
try {

// JavaBeansからリクエストパラメータと一致す
// るプロパティのディスクリプターを取得
PropertyDescriptor toPd
= new PropertyDescriptor(paramName, toClass);

// プロパティ名に対するセッターメソッドを取得
Method toSetter = toPd.getWriteMethod();

// プロパティのクラスを取得
Class propertyClass = toPd.getPropertyType();

// リクエストパラメータの値をプロパティ
// のクラスに変換してセッターを実行
toSetter.invoke(to, ConvertUtils.convert(paramValue,
propertyClass));

} catch (IntrospectionException e) {

e.printStackTrace();

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();
}
}
}

/**
* MIMEタイプがmultipart/form-dataの場合のフォームデータ取得
*
* @param request
* HttpServletRequest
* @throws ServletException
* ServletException
*/
public static Map getFormData(HttpServletRequest request)
throws ServletException {

// ファクトリー生成
DiskFileItemFactory factory = new DiskFileItemFactory();

ServletFileUpload upload = new ServletFileUpload(factory);

try {

List items = upload.parseRequest(request);

// 全フィールドに対するループ
HashMap formMap = new HashMap();
for (Object val : items) {

FileItem item = (FileItem) val;
if (item.isFormField()) {

// type="file"以外のフィールド
processNotFileField(item, formMap);

} else {

// type="file"のフィールド
processFileField(item, formMap);
}
}

return formMap;

} catch (Exception e) {

// TODO Exception を細かく分ける?
throw new ServletException(e);
}

}

/**
* MIMEタイプがmultipart/form-dataの場合のフォームデータ取得

* inputtype="file"以外のフィールドデータを取得します
*
* @param item
* フォームデータアイテム
* @param formMap
* フォームデータ格納用マップ
* @throws ServletException
* ServletException
*/
private static void processNotFileField(FileItem item,
HashMap formMap) throws ServletException {

try {

// TODO 文字コード指定は設定ファイル or staticにする
formMap.put(item.getFieldName(), item.getString("UTF-8"));

} catch (UnsupportedEncodingException e) {

e.printStackTrace();
}
}

/**
* MIMEタイプがmultipart/form-dataの場合のフォームデータ取得

* input type=fileのフィールドデータを取得します
*
* @param item
* フォームデータアイテム
* @param formMap
* フォームデータ格納用マップ
* @throws ServletException
* ServletException
*/
private static void processFileField(FileItem item,
HashMap formMap) throws ServletException {

formMap.put(item.getFieldName(), item.get());
}
}

0 コメント: