我的目标是从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>" + " <a href='WordOperations?delete=" + i + "'>Delete</a> <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);
}
}
答案 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
。
希望它有所帮助。