如何在会话中将JavaBeans添加到ArrayList?

时间:2013-03-30 06:14:24

标签: jsp arraylist javabeans

这是我们教授的练习。我有点卡住了。首先,他希望我们将公司名称和价格存储在我们将创建的JavaBean中 - 每个实例一个价格和公司。这意味着我们需要三个bean实例。

请注意,他希望我们使用上述方法对三家公司和价格进行硬编码。

然后,他希望我们将JavaBeans添加到会话中的ArrayList中。转发到JSP进行显示。

这就是我现在的意思,

    <jsp:useBean id="company1" class="beans.Invoice" scope="session"></jsp:useBean>
    <jsp:useBean id="company2" class="beans.Invoice" scope="session"></jsp:useBean>
    <jsp:useBean id="company3" class="beans.Invoice" scope="session"></jsp:useBean>

    <jsp:setProperty property="companyName" name="company1" value="Telco" />
    <jsp:setProperty property="price" name="company1" value="23" />

    <jsp:setProperty property="companyName" name="company2" value="Telcos" />
    <jsp:setProperty property="price" name="company2" value="25" />

    <jsp:setProperty property="companyName" name="company3" value="Telcoi" />
    <jsp:setProperty property="price" name="company3" value="27" />

在同一个jsp上,我这样做,

<%
        ArrayList<Object> disp = new ArrayList();
        disp.add(company1);
        disp.add(company2);
        disp.add(company3);

        HttpSession sess = request.getSession();
        session.setAttribute("disp", disp);

%>

然后在他要求的下一个JSP上,我正在这样做,

   <%
        ArrayList<String> list = (ArrayList<String>) request.getSession()
                .getAttribute("disp");

        for (String r : list) {
            out.println(r);
        }
    %>

这是我得到的错误

java.lang.ClassCastException: beans.Invoice cannot be cast to java.lang.String

我可能做错了什么?

2 个答案:

答案 0 :(得分:1)

您将Invoice的实例存储在ArrayList<Object>的第一个JSP中。但是在第二个JSP中,你试图让Strings脱离这个列表。 Invoice不是String。这是一个Invoice

所以第二个JSP的代码应该是

List<Invoice> list = (List<Invoice>) request.getSession().getAttribute("disp");
for (Invoice r : list) {
    out.println(r);
}

请注意,您的第一个JSP代码也可以进行改进。为什么在你想要的时候使用List<Object>实际上是List<Invoice>?它的代码应该是

List<Invoice> disp = new ArrayList<Invoice>();
disp.add(company1);
disp.add(company2);
disp.add(company3);

您还应该为变量和属性使用“disp”之外的其他名称。像“发票”这样更具描述性的东西呢?

最后,JSP根本不应使用scriplets,不应该用于在会话中存储对象。第一个JSP只包含代码,不生成任何标记。它应该作为servlet实现,而不是作为JSP实现。它应该将发票存储在请求属性中而不是会话中。该会话应仅用于存储具有会话生命周期的内容(如当前用户的名称,首选项或类似内容)。

第二个JSP应该使用JSP EL和JSTL而不是使用scriptlet。

答案 1 :(得分:0)

&lt;%ArrayList&lt;对象&gt; list =(ArrayList&lt; object&gt;)请求。 getSession()。 getAttribute(“disp”); for(yourClassName r:list){out。 println(r.companyName等); }%&gt;你的con't将对象类型转换为字符串......