将ArrayList设置为servlet中的属性并在jsp

时间:2017-09-30 16:04:13

标签: java jsp servlets java-ee

我正在尝试将String的Array列表设置为servlet中的session属性,并尝试在jsp中访问此Array的Array列表。 但只是jsp中的一个值(最后一个值)访问。 我想访问所有属性列表。

我在这里和那里搜索过多,但我没有找到我的问题。

表格jsp:

<form action="/CompleteServlet" method="get">
<%String completeTasks=((ArrayList<String>)session.getAttribute("todoList")).get(i);%>
 <input type="hidden" name="completeTasks" value="<%=completeTasks%>" />
 <input type="submit" value="Completed">
</form>
来自CompleteServlet的

 String v=req.getParameter("completeTasks");
        HttpSession session=req.getSession();

        ArrayList<String> arrOfCompleteTask = new ArrayList<>();
        arrOfCompleteTask.add(v);
        session.setAttribute("completeTasks", arrOfCompleteTask);

        req.getRequestDispatcher("/complete.jsp").forward(req,resp);

表单complete.jsp

<%
int size=((List<String>)session.getAttribute("tryCom")).size();
    for(int i=0;i<size;i++)
        {%>
<%=((List<String>)session.getAttribute("tryCom")).get(i)%>``
       <%}%>

2 个答案:

答案 0 :(得分:1)

通过一些编辑,比如声明我在形式的脚本中使用jsp 实际上可以正常工作但是因为我听说非常不推荐我会提供另一种解决方案,即JSTL。

<强> jsfile.jsp

<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<html>
<head>
<title>Any title</title>
</head>
<body>
    <table>
        <tr>
            <c:forEach begin="0" end="${fn:length(completeTasks) - 1}" var="index">
                <td><c:out value="${completeTasks[index]}" /></td>
            </c:forEach>
        </tr>
    </table>
</body>
</html>

<强> form.jsp

<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Form</title>
</head>
<body>
    <form
        action="<c:out value="${pageContext.servletContext.contextPath}" />/CompleteServlet"
        method="get">
        <input type="text" name="new-task" value="add new task" /> <input
            type="submit" value="Completed" />
    </form>
</body>
</html>

<强> Sclass.java

import javax.servlet.http.*;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.*;

public class Sclass extends HttpServlet {

    private static final long serialVersionUID = 7806370535291118571L;

       public void init() throws ServletException {
          // Do required initialization
          System.out.println("init()");
       }

       public void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
          System.out.println("doGet() called");

          HttpSession session= request.getSession();
          String submittedTask = (String) request.getParameter("new-task");
          System.out.println(submittedTask);
          @SuppressWarnings("unchecked")
        ArrayList<String> arrOfCompleteTask = (ArrayList<String>) session.getAttribute("completeTasks");

          if (arrOfCompleteTask == null)
              arrOfCompleteTask = new ArrayList<>();

          System.out.println(arrOfCompleteTask.size());

          if (arrOfCompleteTask.size() >= 1)
          {
              for (int i = 0 ; i < arrOfCompleteTask.size(); ++i) {
                  System.out.println(arrOfCompleteTask.get(i));
              }
          }

          if (submittedTask != null) 
          {
              arrOfCompleteTask.add(submittedTask);
          }

          session.setAttribute("completeTasks", arrOfCompleteTask);

          request.getRequestDispatcher("/jfile.jsp").forward(request,response);
       }

       public void destroy() {
           System.out.println("destroy()");
       }

}

<强>的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>TestServlet</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>


  <servlet>
  <servlet-name>sname</servlet-name>
  <servlet-class>Sclass</servlet-class>
  </servlet>

  <servlet-mapping>
   <servlet-name>sname</servlet-name>
   <url-pattern>/CompleteServlet</url-pattern>
</servlet-mapping>


</web-app>

答案 1 :(得分:0)

你不能这样做,甚至声明“”在哪里?:

<form action="/CompleteServlet" method="get">
<%String completeTasks=((ArrayList<String>)session.getAttribute("todoList")).get(i);%>
 <input type="hidden" name="completeTasks" value="<%=completeTasks%>" />
 <input type="submit" value="Completed">
</form>

自2010年以来,人们不鼓励使用Scriptlets(这些东西:&lt; %%&gt;)。有足够的list理由说明为什么你应该尽可能避免使用它们。

你应该做的是:

<form action="/CompleteServlet" method="get">
 <input type="hidden" name="completeTasks" value="${todoList}" />
 <input type="submit" value="Completed">
</form>

然后在CompleteServlet中获取 completeTasks 的最后一个值,或者在表单视图中发送之前设置最后一个值。后者是更简单的选择。前者涉及将completeTasks作为String,然后通过拆分每个值(通常使用逗号)使其成为ArrayList。有这样的事情:

String v=req.getParameter("completeTasks");
ArrayList<String> myList = new ArrayList<String>(Arrays.asList(v.split(",")));