有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 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属性来解决,如下所示:

    <jsp:useBean id="Main" class="com.classes.Main" scope="session" /> 
    

    现在,标签将在会话属性中查找名为Main的bean;因此,将在每个后续请求中返回一个现有的Main实例

    这就解决了你眼前的问题

    然而,你的Main类很奇怪

    public class Main extends HttpServlet {...
    

    您使用Main作为模型(在MVC术语中),因此不需要扩展HttpServlet。这样做的事实表明,您想要实现一个Model 2servlet。我再次请你参考Java EE tutorial

    最后,您提到需要构建一个portlet。不幸的是,Portlet API与Servlet API有些不同,让上述代码正常工作将无法帮助您有效地实现Portlet