2

在 JSP/JSTL 中,如何为 class="java.util.ArrayList" 的 usebean 设置值。

如果我尝试使用 c:set 属性或值,我会收到以下错误:javax.servlet.jsp.JspTagException: Invalid property in : "null"

4

1 回答 1

2

这是直接不可能的。有<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>标签吞噬/破解一些预处理逻辑。

也可以看看:

于 2011-05-17T00:36:33.707 回答