[英]Getting a null value on my arraylist.set(). using jsp
我的目标是从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);
}
}
这是一个逻辑错误。
您正在运行servlet WordOperations.java
两次 ,这是为了编辑该单词,一次传递edit
参数,然后一次传递userChange
参数,而不是一起传递userChange
参数,这将解决问题。
这是错误。
但是,首先设置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
列出时。 它包含
Word Delete_link Edit_link
现在Delete_link> <a href='WordOperations?delete=" + i + "'>Delete</a>
可以正常工作,因为您只是使用参数delete = i
将其重定向到WordsOperations.java
并从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);
}
但
在EDIT_LINK> <a href='WordOperations?edit=" + i + "'>Edit</a>
要调用servlet的WordsOperations.java
只有参数edit = i
和不通过userChange
参数吧。
因此, newLink
在上为NULL
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
为true
。 但是它将在Arraylist words
添加恰好为NULL的newLink
。 因此,会将null添加到您的列表中。
Arraylist.set()
方法没有问题。
现在,在上面的代码中,您在添加newLink
之后调用了edit.jsp
。 但是,当从edit.jsp
形式调用WordsOperation.java
时,它只是传递了userChange参数,而没有传递执行Servlet WordsOperations.java
的else if(edit!=null)
块所需的edit
参数。
<form action="WordOperations?" method="POST">
New Link:<input type="text" name="userChange">
<input type="submit" name="userChangePassword" value="Change link">
</form>
休息就在你身上。 只需注意将edit和UserChange参数都传递给Servlet WordsOperations.java即可完成工作。
建议:将edit
参数传递给edit.jsp
,然后将edit and UserChange
参数传递给WordsOperation.java
。
希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.