データバインディング

データバインディングについて

SimpleController4Jでは、以下のパラメータを実行メソッドの引数に自動バインディングします。

  • パスパラメータ
    (例:[コンテキスト]/user/1/345/fuga/some)
  • クエリストリング(GETパラメータ)
    (例:[コンテキスト]/user?id=1&account=hoge&flag=0)
  • フォームパラメータ(POSTパラメータ)
    (例:<リクエストボディー>id=1&account=hoge&flag=0)
以下、順を追って説明をしていきます。

パスパラメータ

SimpleController4Jでは、パスパラメータを自動バイディングすることが出来ます。
その際に以下の型に関しては、自動でキャストを実行することが出来ます。

  • int型
  • float型
  • regex型(正規表現)
型指定をしない場合は、String型(文字列型)として自動バインディングされます。
また、regex型(正規表現)の場合に、正規表現にマッチなしない値がリクエストパスとして 送信されてきた場合は、java.lang.IllegalArgumentException例外がスローされます。

/**
 * サンプルコントローラ
 */
@Controller
@Route(path = "/sample")
public class SampleController {

	@Route(path = "/path/<id:int>/<hoge:float>/<fuga:re:f.+>/<some>", method = Method.GET)
	public void pathMethod(float hoge, String fuga, String some, int id, HttpServletResponse response)
						   throws IOException {
		PrintWriter out = response.getWriter();
		out.println("id : " + id);
		out.println("hoge : " + hoge);
		out.println("fuga : " + fuga);
		out.println("some : " + some);
		out.print("path method execute!");
	}
}
■ 実行結果
CW-02:~ XXX$ curl localhost:8080/SimpleControllerSample/sample/path/1/9.9/fugaParam/someParam
id : 1
hoge : 9.9
fuga : fugaParam
some : someParam
path method execute!

クエリストリング(GETパラメータ)

クエリストリング(GETパラメータ)もディスパッチされる実行メソッドの引数に自動バインディングされます。
実行メソッドの引数型に合わせてキャストが実行され、自動バインディングされます。
実行メソッド引数名とパラメータ名が同一である場合に、自動バイディングが実行され、実行メソッド引数名にない パラメータは無視されます。
また、同一名のパラメータが複数存在する場合に、実行メソッドの引数が配列として定義されていない時は、 任意のパラメータ値が自動バインディングされます。

/**
 * サンプルコントローラ
 */
@Controller
@Route(path = "/sample")
public class SampleController {

	@Route(path = "/param", method = Method.GET)
	public void paramMethod(String hoge, int num, long lnum, HttpServletResponse response) 
							throws IOException {
		PrintWriter out = response.getWriter();
		out.println("hoge : " + hoge);
		out.println("num : " + num);
		out.println("lnum : " + lnum);
		out.println("param method execute!");
	}
}
■ 実行結果
CW-02:build XXX$ curl 'localhost:8080/SimpleControllerSample/sample/param?num=5&lnum=999&hoge=hogeParam'
hoge : hogeParam
num : 5
lnum : 999
param method execute!

また、クエリストリングに同一のパラメータが複数存在する場合は、実行メソッドに配列として自動バインディングされます。

/**
 * サンプルコントローラ
 */
@Controller
@Route(path = "/sample")
public class SampleController {

	@Route(path = "/params", method = Method.GET)
	public void paramsMethod(String[] hoge, double[] dnum, HttpServletResponse response) throws IOException {
		PrintWriter out = response.getWriter();
		for (String str : hoge) {
			out.println("hoge : " + str);
		}
		for (double d : dnum) {
			out.println("dnum : " + d);
		}
		out.println("params method execute!");
	}
}
■ 実行結果
CW-02:build XXX$ curl 'localhost:8080/SimpleControllerSample/sample/params?dnum=1.1&dnum=2.2&hoge=hoge1&hoge=hoge2'
hoge : hoge1
hoge : hoge2
dnum : 1.1
dnum : 2.2
params method execute!

フォームパラメータ(POSTパラメータ)

フォームパラメータ(POSTパラメータ)もディスパッチされる実行メソッドの引数に自動バインディングされます。
実行メソッドの引数型に合わせてキャストが実行され、自動バインディングされます。
実行メソッド引数名とパラメータ名が同一である場合に、自動バイディングが実行され、実行メソッド引数名にない パラメータは無視されます。
また、同一名のパラメータが複数存在する場合に、実行メソッドの引数が配列として定義されていない時は、 任意のパラメータ値が自動バインディングされます。

/**
 * サンプルコントローラ
 */
@Controller
@Route(path = "/sample")
public class SampleController {

	@Route(path = "/form", method = Method.POST)
	public void formMethod(String hoge, int num, double dnum, HttpServletResponse response)
						   throws IOException {
		PrintWriter out = response.getWriter();
		out.println("hoge : " + hoge);
		out.println("num : " + num);
		out.println("dnum : " + dnum);
		out.println("form method execute!");
	}

}
■ 実行結果
CW-02:Desktop XXX$ curl -X POST localhost:8080/SimpleControllerSample/sample/form --data 'num=5&dnum=9.9&hoge=hogeParam'
hoge : hogeParam
num : 5
dnum : 9.9
form method execute!

また、フォームパラメータに同一のパラメータが複数存在する場合は、実行メソッドに配列として自動バインディングされます。

/**
 * サンプルコントローラ
 */
@Controller
@Route(path = "/sample")
public class SampleController {

	@Route(path = "/forms", method = Method.POST)
	public void formsMethod(String[] hoge, float[] fnum, HttpServletResponse response)
							throws IOException {
		PrintWriter out = response.getWriter();
		for (String str : hoge) {
			out.println("hoge : " + str);
		}
		for (float f : fnum) {
			out.println("fnum : " + f);
		}
		out.println("forms method execute!");
	}
}
■ 実行結果
CW-02:build shigeru_cw$ curl -X POST localhost:8080/SimpleControllerSample/sample/forms --data 'fnum=1.1&fnum=2.2&hoge=hoge1&hoge=hoge2'
hoge : hoge1
hoge : hoge2
fnum : 1.1
fnum : 2.2
forms method execute!

ユーザ定義クラス引数

ユーザ定義のクラスを実行メソッド引数に指定した場合も、クエリストリング(GETメソッド)・ フォームパラメータ(POSTパラメータ)が、引数に指定したクラスのフィールドに自動バインディングされます。
自動バイディングは、実行メソッドの引数に指定したクラスのフィールドとパラメータ名が一致する場合に実行されます。
以下の例は、データを格納するFormクラス(DTO)を実行メソッドに指定するものです。

■ Formクラス
public class Form {

	private String hoge;
	private int num;
	private boolean flag;

	public String getHoge() {
		return hoge;
	}
	public void setHoge(String hoge) {
		this.hoge = hoge;
	}
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public boolean isFlag() {
		return flag;
	}
	public void setFlag(boolean flag) {
		this.flag = flag;
	}
}
/**
 * サンプルコントローラ
 */
@Controller
@Route(path = "/sample")
public class SampleController {

	@Route(path = "/class")
	public void classMethod(Form form, HttpServletResponse response)
							throws IOException {
		PrintWriter out = response.getWriter();
		out.println("hoge : " + form.getHoge());
		out.println("num : " + form.getNum());
		out.println("flag : " + form.isFlag());
		out.println("class method execute!");
	}
}
■ 実行結果
CW-02:build XXX$ curl -X POST localhost:8080/SimpleControllerSample/sample/class --data 'hoge=hogeParam&num=10&flag=true'
hoge : hogeParam
num : 10
flag : true
class method execute!

その他のメソッド引数

その他、ディスパッチ先の実行メソッドには以下のパラメータを指定可能です。

  • HttpServletRequest
  • HttpServletResponse
  • ServletContext
HttpServletRequest・HttpServletResponseはサーブレットの引数でもありますので、サーブレット感覚で 処理を記述することが出来ます。
また、コントローラ内で各種設定情報を取得するためにServletContextを実行メソッドの引数にすることも出来ます。
以下、クライアントからファイル名を受け取って、ファイルコンテンツをクライアントに返却する処理を例として示します。

/**
 * サンプルコントローラ
 */
@Controller
@Route(path = "/sample")
public class SampleController {

	@Route(path = "/context", method=Method.GET)
	public void contextMethod(HttpServletRequest request, HttpServletResponse response,
							  ServletContext context, String fileName)
							  throws IOException {
		File file = new File(context.getRealPath("/WEB-INF/resources/" + fileName));
		OutputStream os = response.getOutputStream();
		BufferedInputStream reader = new BufferedInputStream(new FileInputStream(file));
        	int len = 0;
        	byte[] buffer = new byte[1024];
        	while ((len = reader.read(buffer)) >= 0) {
           		os.write(buffer, 0, len);
        	}
        	reader.close();
	}
}
■ 実行結果
CW-02:build XXX$ curl localhost:8080/SimpleControllerSample/sample/context?fileName=icon.jpg
????JFIFHH??C??C?,,??   ????
                            ??`?,Az?߀?_i)?????73?=]??.E2a? ?T?p?ڡ??3p?4V?)??Pj
?5???;??????Y?'?^zy(8?r??q??"&???*??uM?n?$"?lrasd?ƙ???28?:ָeic?l??^Hի?{Yv9^d~uL?|??V?Z?ϧW?????.^i????s/??o???
〜以下、省略〜

ご意見・ご感想・バグ報告

×

SimpleController4Jへのご意見やご感想がございましたら、メッセージをお願い致します。
また、SimpleController4Jを使用して頂きまして、バグがございましたらご連絡を頂けると助かります。
皆様からのご意見・ご感想をもとに、SimpleController4Jを改善・拡張をしていきたいと考えております。
皆様からのメッセージは当方で確認をしておりますが、仕事をしながらの開発となる為、すぐにご返信・対応をすることが 出来ない場合がございます。何卒ご容赦ください。

タイトル
メールアドレス
内容