【问题标题】:for loop on ArrayList change the objectArrayList 上的 for 循环更改对象
【发布时间】:2012-08-08 17:10:56
【问题描述】:

我有一个 jsp 页面(说,MyJspPage.jsp) -

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<%
    ArrayList<Person> ownerList = (ArrayList<Person>) request
            .getAttribute("ownerList");
    //set again ..
        request.setAttribute("ownerList",ownerList) ;   

%>
</head>
<body>
        <%
            //itr on all the persons ..;
            for (Person person : ownerList) {
        %>
                    // some HTML code.. 
        <%
            }
        %>
            <form action="servlet123" method="POST">
                   // some fields .. 
                   <input type="submit" value="join" />
    </form>

</body>
</html>

还有一个 servlet -

@WebServlet("/servlet123")
public class servlet123 extends HttpServlet {
    private static final long serialVersionUID = 1L;


    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // get the then set .. 
             ArrayList<Person> ownerList = (ArrayList<Person)request.getAttribute("ownerList"); 
        request.setAttribute("ownerList", ownerList);
             // forward to `MyJspPage.jsp`
            dispather.forward(request, response);
        }

}

首先将另一个 servlet 转发到 MyJspPage.jsp 并且它工作正常,然后在 MyJspPage.jspservlet123 之间就像乒乓球一样。问题是,当第二次到达MyJspPage.jsp 时,它会引发异常 -

type Exception report

message java.lang.NullPointerException

description The server encountered an internal error (java.lang.NullPointerException) that prevented it from fulfilling this request.

exception 

org.apache.jasper.JasperException: java.lang.NullPointerException
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

需要注意的是,当我从 MyJspPage.jsp 中省略 for 循环并将其更改为 -

   <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <%
        ArrayList<Person> ownerList = (ArrayList<Person>) request
                .getAttribute("ownerList");
        //set again ..
            request.setAttribute("ownerList",ownerList) ;   

    %>
    </head>
    <body>
                <form action="servlet123" method="POST">
                       // some fields .. 
                       <input type="submit" value="join" />
        </form>

    </body>
    </html>

MyJspPage.jspservlet123 之间的所有关系都可以正常工作。

【问题讨论】:

  • 我会先检查 ownerList 是否不为空,确保已将其传递到您的页面
  • 请求对象对于每个请求都是新的。您应该保存并从会话中检索列表。
  • @BheshGurung 有什么方法可以按要求做吗?
  • Request 对象在每次提交时都是全新创建的。一旦 JSP 完全呈现,先前的请求对象也会被销毁。

标签: java jsp servlets arraylist request


【解决方案1】:

这是一种方法。

JSP代码如下


不用在request中再次设置arraylist,可以在session中设置如下 session.setAttribute("ownerList",ownerList) ;

在 for 循环中使用 arraylist 之前,您可以检查它是否为 NOT null。

        if (ownerList != null)
        {
          for (Person person : ownerList) {
    %>
                // some HTML code.. 
    <%
          }
        }
    %>

在servlet中你可以写成这样的代码

 HttpSession session = request.getSession(false);
 ArrayList<Person> ownerList = (ArrayList<Person)session.getAttribute("ownerList"); 
 request.setAttribute("ownerList", ownerList);
 session.setAttribute("ownerList", null); // toremove unnecessary code from the session

也可能有其他方法。这个只是更接近你选择的那个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2014-06-10
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多