来自servlet的ArrayList在返回到start(index.html)之后替换旧的输入值

时间:2016-03-07 10:39:11

标签: java html servlets arraylist

我将index.html的值发送到ServletOne。在指定的servlet上,我从index.html获取的值将通过会话存储,我将传递给ServletTwo,其中ServletOne的会话值1}}将使用ArrayList存储。

因此,ServletTwo被链接回index.html以便另一个乘客申请,并且程序将重复,唯一的区别是第一个乘客应用程序的值应存储在ArrayList中

我对这个问题的猜测是,当我从ServletTwo迭代回index.html时,它实际上会实例化一个新的ArrayList。

以下是代码:

index.html

<html>
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <form action="ServletOne">
            Choose your destination:
            <input type="radio" name="destination" value="1"> STOP 1
            <input type="radio" name="destination" value="2"> STOP 2
            <input type="radio" name="destination" value="3"> STOP 3
            <input type="radio" name="destination" value="4"> STOP 4
            <input type="radio" name="destination" value="5"> STOP 5
            <input type="radio" name="destination" value="6"> STOP 6
            Enter Last Name : <input type="text" name="lastName"><br>
            Enter First Name: <input type="text" name="firstName"><br>
            <input type="submit" value="Enter">
        </form>
    </body>
</html>

这是ServletOne

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        HttpSession session = request.getSession();
        int fare = 0;
        String lName = request.getParameter("lastName");
        String fName = request.getParameter("firstName");
        String dest = request.getParameter("destination");

        //acquiring the fare of the current passenger
        if(dest.equals("1")){
            fare = 1;
        }else if(dest.equals("2")){
            fare = 3;
        }else if(dest.equals("3")){
            fare = 5;
        }else if(dest.equals("4")){
            fare = 7;
        }else if(dest.equals("5")){
            fare = 9;
        }else if(dest.equals("6")){
            fare = 11;
        }
        //storing values into session
        session.setAttribute("fName", fName);
        session.setAttribute("lName", lName);
        session.setAttribute("dest", dest);
        session.setAttribute("fare", fare);

        out.print("Name: "+lName+", "+fName+"<br>");
        out.print("Destination: "+dest+"<br>");
        out.print("P"+fare+".00<br>");
        out.print("<a href=ServletTwo>go</a>");    

    }

这是ServletTwo

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        HttpSession session = request.getSession(false);

        ArrayList<String> lNames = new ArrayList<String>();


        String lName = (String)session.getAttribute("lName");


        //store an element into arraylist
        lNames.add(lName);

        //print the ArrayList
        out.print(lNames);

        //return to index.html to add a passenger
        out.print("<a href=index.html>Again</a>");   


}

如果我的术语不正确,我提出问题的方式以及其他任何内容,我感到非常抱歉。如果你有更好的解决方案来解决这个问题,请同时给它,这里唯一的静态是我必须使用一个ArrayList和两个servlet。我只使用互联网编写了这个(以及我们班级练习中的一些类似的东西,这些都是非常非常简单的程序)然后我们的教授给我们提供了一些复杂的问题让我们去做。我们唯一的来源是互联网,没有给出教授的任何内容。

2 个答案:

答案 0 :(得分:0)

每次使用具有相同键的session属性时,它都会将旧值替换为新值。我想每次你只得到当前选定的值。 ArrayList仅在对象销毁之前保持不变。如果您希望将所有选定值存储在会话中,请使用jsonArray作为lName

  • 创建jsonArray
  • 添加您的lName
  • 将其存储在session.setAttribute(“lName”,jsonArray.toString());
  • 中 servlet2中的
  • 再次转换数组并显示它。
  • servlet1中的
  • 从session获取值并将它们添加到同一个jsonArray然后添加到session

答案 1 :(得分:0)

在类级别将数组列表对象声明为静态变量。 也就是说,不是在doPost方法中创建arraylist,而是在servlet类级别声明并创建它。 警告:在servlet中声明实例变量会导致许多多线程错误,但在您的情况下,它将满足您的项目需求。