JSP/JSTL で、class="java.util.ArrayList" の usebean に値を設定するにはどうすればよいですか。
c:set プロパティまたは値を使用しようとすると、次のエラーが発生します: javax.servlet.jsp.JspTagException: Invalid property in : "null"
それは直接不可能です。setter メソッドを介して完全な JavaBean にプロパティを設定できる タグ<c:set>
とタグがあります。<jsp:setProperty>
ただし、List
インターフェイスにはセッターがなく、add()
メソッドのみがあります。
回避策は、次のように実際の JavaBean でリストをラップすることです。
public class ListBean {
private List<Object> list = new ArrayList<Object>();
public void setChild(Object object) {
list.add(object);
}
public List<Object> getList() {
return list;
}
}
そしてそれを設定する
<jsp:useBean id="listBean" class="com.example.ListBean" scope="request" />
<jsp:setProperty name="listBean" property="child" value="foo" />
<jsp:setProperty name="listBean" property="child" value="bar" />
<jsp:setProperty name="listBean" property="child" value="waa" />
しかし、それはほとんど意味がありません。それを正しく解決する方法は、唯一の機能要件に依存します。List
GET リクエストで一部を保持したい場合は、前処理サーブレットを使用する必要があります。doGet()
メソッドで次のことを行うサーブレットを作成します。
List<String> list = Arrays.asList("foo", "bar", "waa");
request.setAttribute("list", list);
request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response);
URL でサーブレットを呼び出すと、リストは転送された JSP にあり、
${list}
昔ながらの<jsp:useBean>
タグは必要ありません。サーブレットでは、通常の方法で Java コードを自由に記述できます。このようにして、タグによっていくつかの前処理ロジックをガブリング/ハックする必要なく、純粋なプレゼンテーションのみに JSP を使用でき<jsp:useBean>
ます。