java列表对于jsp中jsp页面上的每个重新加载项都为空
我不熟悉使用JSP,我以前使用过JSF,但现在需要用JSP构建portlet
每次用户按下submit按钮时,我都会在java代码的列表中放入一个字符串。但每次列表被清除,只有1的大小,我不知道为什么。我想每次重新阅读页面时,我都会得到一个新的Main实例
我该如何解决这个问题
我的JSP:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<jsp:useBean id="Main" class="com.classes.Main" />
<div>
La Till: <%= request.getParameter("inputText")%>
<form name="myForm" action="" method="post" >
<input type="text" name="inputText" >
<input type="submit" value="Lägg till!">
</form>
<%
String name = request.getParameter("inputText");
if (name != null && !name.isEmpty()) {
Main.addToList(name);
}
%>
<c:forEach var="name" items="${Main.list}">
<tr>
<c:out value="${name}"></c:out>
</tr>
</c:forEach>
我的Java:
public class Main extends HttpServlet {
private List <String> pplList = new ArrayList();
public void addToList(String inName)
{
pplList.add(inName);
}
public List <String> getList()
{
return pplList;
}
public void setList(List <String> inList)
{
pplList = inList;
}
}
# 1 楼答案
从哪里开始。。。您似乎对如何组合servlet和JSP有误解,可能是因为您之前接触过JSF。所以你可能想先读一下Java EE tutorial on servlets and JSPs
话虽如此,让我们看看你的代码
首先,您必须理解(概念上)JSP在每个请求上都是完整执行的。这也意味着
<jsp:useBean>
标记会在每个请求上进行评估。这个标记在您当前的请求属性中查找名为Main
的bean。如果它不存在,它将实例化一个新的因此在这种情况下,在每次渲染时,都会实例化一个新的
Main
对象,这意味着每个请求都会执行字段初始值设定项private List <String> pplList = new ArrayList();
这个问题可以通过在
<jsp:useBean>
上使用scope
属性来解决,如下所示:现在,标签将在会话属性中查找名为
Main
的bean;因此,将在每个后续请求中返回一个现有的Main
实例这就解决了你眼前的问题
然而,你的
Main
类很奇怪您使用
Main
作为模型(在MVC术语中),因此不需要扩展HttpServlet
。这样做的事实表明,您想要实现一个Model 2servlet。我再次请你参考Java EE tutorial最后,您提到需要构建一个portlet。不幸的是,Portlet API与Servlet API有些不同,让上述代码正常工作将无法帮助您有效地实现Portlet