在 JSP/JSTL 中,如何为 class="java.util.ArrayList" 的 usebean 设置值。
如果我尝试使用 c:set 属性或值,我会收到以下错误:javax.servlet.jsp.JspTagException: Invalid property in : "null"
这是直接不可能的。有<c:set>
and<jsp:setProperty>
标记允许您通过 setter 方法在完全有价值的 javabean 中设置属性。但是,该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 请求中保留一些内容,那么您应该使用预处理 servlet。创建一个在doGet()
方法中执行以下操作的 servlet:
List<String> list = Arrays.asList("foo", "bar", "waa");
request.setAttribute("list", list);
request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response);
当您通过其 URL 调用 servlet 时,该列表位于转发的 JSP 中,可通过
${list}
无需老式<jsp:useBean>
标签。在 servlet 中,您可以自由地以通常的方式编写 Java 代码。这样,您可以仅将 JSP 用于纯表示,而无需通过<jsp:useBean>
标签吞噬/破解一些预处理逻辑。