如何向 jsp:useBean 引用的 ArrayList 添加值?

发布于 2024-11-07 19:09:46 字数 149 浏览 7 评论 0原文

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

如果我尝试使用 c:set 属性或值,则会收到以下错误: javax.servlet.jsp.JspTagException:无效属性:“null”

In JSP/JSTL, how can I set values for a usebean of class="java.util.ArrayList".

If I try using c:set property or value, I get the following error:
javax.servlet.jsp.JspTagException: Invalid property in : "null"

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

乞讨 2024-11-14 19:09:46

这不可能直接实现。 标记允许您通过 setter 方法在完整的 javabean 中设置属性。但是,List 接口没有 setter,只有一个 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" />

但这没有什么意义。如何正确解决取决于单独的功能需求。如果您想在 GET 请求时保留一些 List,那么您应该使用预处理 servlet。创建一个 servlet,它在 doGet() 方法中执行以下操作:

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}

无需即可使用老式的 标记。在 servlet 中,您可以自由地以通常的方式编写 Java 代码。这样,您就可以仅使用 JSP 进行纯演示,而无需通过 标记来吞噬/破解一些预处理逻辑。

另请参阅:

That isn't directly possible. There are the <c:set> and <jsp:setProperty> tags which allows you to set properties in a fullworthy javabean through a setter method. However, the List interface doesn't have a setter, just an add() method.

A workaround would be to wrap the list in a real javabean like so:

public class ListBean {

    private List<Object> list = new ArrayList<Object>();

    public void setChild(Object object) {
        list.add(object);
    }

    public List<Object> getList() {
        return list;
    }
}

and set it by

<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" />

But that makes little sense. How to solve it rightly depends on the sole functional requirement. If you want to preserve some List upon a GET request, then you should be using a preprocessing servlet. Create a servlet which does the following in doGet() method:

List<String> list = Arrays.asList("foo", "bar", "waa");
request.setAttribute("list", list);
request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response);

When you invoke the servlet by its URL, then the list is in the forwarded JSP available by

${list}

without the need for old fashioned <jsp:useBean> tags. In a servlet you've all freedom to write Java code the usual way. This way you can use JSP for pure presentation only without the need to gobble/hack some preprocessing logic by <jsp:useBean> tags.

See also:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文