フォーマット文字列に「$」は必要ありません。ご存知かもしれませんが、スクリプトレットの使用は、Java Web 開発を行うのに適した方法ではありません。JSP で Java コードとマークアップを混在させないため、JSTL を使用する方がはるかに優れていると思います。
編集:前に述べたように、 printf メソッドはoutオブジェクトに存在しません。JspWriter と JspWriter は PrintWriter (printf を持つ) から継承されていないためです。ごめん。だから、これを試してみてください(私にとってはうまくいきました)。
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<select>
<%
String[] strings = new String[]{ "aaa", "bbb", "ccc", "ddd" };
for ( int i = 0; i < strings.length; i++ ) {
out.print( String.format( "<option value='%d'>%s</option>", i, strings[i] ) );
}
%>
</select>
</body>
</html>
サーブレットのように PrintWriter を使用する場合は、次のようにします。
<%@page import="java.io.PrintWriter"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<select>
<%
PrintWriter writer = new PrintWriter( out );
String[] strings = new String[]{ "aaa", "bbb", "ccc", "ddd" };
for ( int i = 0; i < strings.length; i++ ) {
writer.printf( "<option value='%d'>%s</option>", i, strings[i] );
}
%>
</select>
</body>
</html>