在我的arraylist.set()上获取null值。使用jsp

时间:2015-10-03 05:17:36

标签: java jsp arraylist null set

我的目标是从html表单添加单词,将它们存储在我的数组中,在页面中显示它们,并有两个链接用于删除项目,一个用于编辑项目(用于编辑的单词将输入到另一个HTML格式)。

我使用arrayList来存储来自Input类型的输入。我能够添加和删除我的项目,但当我尝试更改我的arrayList中的项目的值(我使用的是arrayList.set())时,我的值返回null。如果我硬编码set()我看到我的项目更改但由于某种原因我无法从我的输入类型中获取值。想知道我错过了什么。

我有两个jsp页面。 main.jsp和edit.jsp。 一个带有所有验证的java类WordOperations

这是我的代码抱歉,如果它很乱,如果没有显示在这里。这是我第一次在stackoverflow上发帖

任何帮助将不胜感激。感谢

这是我显示项目main.jsp

的表单的代码
 <h3>Word List</h3>
        <form action="WordOperations" method="POST">
            Word: <input type="text" name="newWord">
            <input type="submit" value="Add">
        </form>
        <br/>

            <%
                ArrayList<String> words = (ArrayList<String>) session.getAttribute("words");

                if (words!=null)
                {
                    for (int i=0; i<words.size(); i++)
                    {
                         out.println("<p>" +  "<a href='http://www."+ words.get(i) +".com'>" + words.get(i) +"</a>"  + "&nbsp;&nbsp;<a href='WordOperations?delete=" + i + "'>Delete</a>&nbsp;&nbsp;<a href='WordOperations?edit=" + i + "'>Edit</a></p>");

                    }
                }

            %>

这是我输入新信息edit.jsp

的代码
  <form action="WordOperations?" method="POST">
        New Link:<input type="text" name="userChange">
        <input type="submit" name="userChangePassword" value="Change link">
        </form>

这是验证我的表单WordOperations.java

的代码
 HttpSession session = request.getSession();

        String newWord = request.getParameter("newWord");
        String delete = request.getParameter("delete");
        String edit = request.getParameter("edit");
        String newLink = request.getParameter("userChange");

        if (delete!=null) //delete a word
        {
            int delIndex = Integer.parseInt(delete);

            ArrayList<String> words = (ArrayList<String>) session.getAttribute("words");
            words.remove(delIndex);

            RequestDispatcher rd = getServletContext().getRequestDispatcher("/main.jsp");
            request.setAttribute("message", "Word deleted");
            rd.forward(request, response);  
        }
        else if(edit !=null)
        {   


            int edIndex = Integer.parseInt(edit);
            String link = newLink;
            ArrayList<String> words = (ArrayList<String>) session.getAttribute("words");
            words.set(edIndex,"google");
            words.add(newLink);
                         RequestDispatcher rd = getServletContext().getRequestDispatcher("/edit.jsp");


            request.setAttribute("message", "Word edited");
            rd.forward(request, response);

        }
        else //logging in
        {
            if (newWord!=null && !newWord.equals(""))
            {
                ArrayList<String> words = (ArrayList<String>) session.getAttribute("words");

                words.add(newWord);              

                RequestDispatcher rd = getServletContext().getRequestDispatcher("/main.jsp");
                request.setAttribute("message", "Word added");
                rd.forward(request, response);

            }
            else
            {
                RequestDispatcher rd = getServletContext().getRequestDispatcher("/main.jsp");
                request.setAttribute("message", "Word is required");
                rd.forward(request, response);
            }
        }

1 个答案:

答案 0 :(得分:1)

这是一个合乎逻辑的错误......

您正在运行servlet WordOperations.java 两次来编辑单词并传递edit参数一次并将userChange参数传递给另一个并且 NOT 一起解决问题。

这是错误。

但首先在会话中设置Arraylist words添加第一个单词。你可以这样做:

else //logging in
            {
                if (newWord != null && !newWord.equals("")) {
                    ArrayList<String> words = (ArrayList<String>) s.getAttribute("words");
                    if (words == null) {
                        words = new ArrayList<>();
                        words.add(newWord);
                        s.setAttribute("words", words);
                    } else {
                        words.add(newWord);
                    }

                    RequestDispatcher rd = getServletContext().getRequestDispatcher("/main.jsp");
                    request.setAttribute("message", "Word added");
                    rd.forward(request, response);

                } 

现在出现了错误:

Arraylist中列出words main.jsp时。它包含

  

单词Delete_link Edit_link

现在Delete_link&gt; <a href='WordOperations?delete=" + i + "'>Delete</a>工作正常,因为您只是使用参数WordsOperations.java将其重定向到delete = i并从ArrayList中删除该字。

WordsOperations.java

String delete = request.getParameter("delete");

 if (delete!=null) //delete a word
        {
            int delIndex = Integer.parseInt(delete);

            ArrayList<String> words = (ArrayList<String>) session.getAttribute("words");
            words.remove(delIndex);

            RequestDispatcher rd = getServletContext().getRequestDispatcher("/main.jsp");
            request.setAttribute("message", "Word deleted");
            rd.forward(request, response);  
        }

<强> BUT

在Edit_link&gt; <a href='WordOperations?edit=" + i + "'>Edit</a>您正在使用参数WordsOperations.java NOT 调用servlet edit = i并将userChange参数传递给它。

因此{/ 1}在

NULL

newLink

那么String newLink = request.getParameter("userChange");中的代码就是

WordsOperation.java

else if(edit !=null) { int edIndex = Integer.parseInt(edit); String link = newLink; ArrayList<String> words = (ArrayList<String>) session.getAttribute("words"); words.set(edIndex,"google"); words.add(newLink); RequestDispatcher rd = getServletContext().getRequestDispatcher("/edit.jsp"); request.setAttribute("message", "Word edited"); rd.forward(request, response); } edit!=null即将执行。但它会在Arraylist true中添加newLink,它恰好为NULL。因此null被添加到您的列表中。

words方法没有问题。

现在,在上面的代码中,您在添加Arraylist.set()后呼叫edit.jsp。 但是当从newLink形式调用WordsOperation.java时,它只是传递userChange参数和 NOT edit.jsp参数,这是执行{{1}所需的参数servlet edit的块。

else if(edit!=null)

休息在你身上。只需注意将edit和UserChange参数传递给Servlet WordsOperations.java即可完成工作。

建议:将WordsOperations.java参数传递给<form action="WordOperations?" method="POST"> New Link:<input type="text" name="userChange"> <input type="submit" name="userChangePassword" value="Change link"> </form> ,然后将edit参数传递给edit.jsp

希望它有所帮助。