【问题标题】:HttpSession doesn't persist from JSP to ServletHttpSession 不会从 JSP 持续到 Servlet
【发布时间】:2015-06-03 18:15:04
【问题描述】:

我有一个InitializeServlet,它创建并实例化一个HttpSession,然后重定向到一个JSP (betFinalize.jsp)。在这里我可以处理我的会话。当我从那个 JSP 重定向(通过表单)到另一个 Servlet 时,FinalizeServlet 我失去了我的会话。我不知道为什么。以下代码。

InitializeServlet.java

public class InitializeServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String fName = request.getParameter("fName");
        String lName = request.getParameter("lName");
        String result = request.getParameter("result");


        Bet s = new Bet();
        s.setFirstLastName(fName + " " + lName);
        s.setResult(result);
        s.setMultiplier(calculateMultiplier());

        request.getSession(true).setAttribute("bet", s);

        RequestDispatcher rd = getServletContext().getRequestDispatcher("/betFinalize.jsp");
        rd.forward(request, response);
    }

    private double calculateMultiplier() {

        return 0.8;
    }

}

betFinalized.jsp

<%@ page import="it.unibo.tw.model.beans.Bet"%>
<%@ page import="it.unibo.tw.model.beans.Bets"%>

<%@ page session="true"%>

<jsp:useBean id="bet" class="it.unibo.tw.model.beans.Bet" scope="session"></jsp:useBean>
<jsp:useBean id="finalizedBets" class="it.unibo.tw.model.beans.Bets" scope="application"></jsp:useBean>

<!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">
</head>
<body>

    <h1>Hi, <%= bet.getFirstLastName() %></h1>
    <h2>Current bet: <i><%= bet.toString() %></i></h2>

    <form action="finalize" method="get">
        <input id="import" type="number" name="import" onkeyup="calculateWin()" ><br />
        <input id="win" type="text" name="win" readonly ><br />
        <input type="submit">
    </form>

    <hr />

    <ul>
        <%  for(Bet s : finalizedBets.getList()) { %>
        <li><%= s.toString() %></li>
        <%  } %>
    </ul>
</body>

<script>
    function calculateWin() {
        var multiplier = <%= bet.getMultiplier() %>

        var imp = document.getElementById("import").value
        document.getElementById("win").value = imp * multiplier
    }


</script>

</html>

FinalizeServlet.java

public class FinalizeServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        double vincita = Double.parseDouble(request.getParameter("win"));

        Bet s = (Bet) request.getSession().getAttribute("bet");
        if(s != null)   {

            // NEVER REACH HERE

            s.setWin(vincita);
            s.setFinalized(true);


            Bets scommesseFinalized = (Bets) getServletContext().getAttribute("scommesseFinalized");
            scommesseFinalized.getList().add(s);


        }

        request.getSession().invalidate();

        RequestDispatcher rd = getServletContext().getRequestDispatcher("/start.html");
        rd.forward(request, response);
    }
}

【问题讨论】:

  • 是的,你是对的,它创建了一个新会话,但在 servlet 中我想处理旧会话。
  • 所以..你必须在 FinalizeServlet 中有一个空指针异常。你用什么容器?
  • 我使用tomcat作为Web Container。
  • 你能详细说明一下吗?哪个变量在会话中不再可用??
  • InitializeServlet 中设置的Bet s 在JSP 中可用,但在最终的FinalizeServlet 中不可用。

标签: java jsp session servlets


【解决方案1】:

您试图获取错误的属性。当您设置会话变量时:

request.getSession(true).setAttribute("scommessa", s);

当您尝试阅读时:

request.getSession().getAttribute("bet");

应该是:

request.getSession().getAttribute("scommessa");

改为。

【讨论】:

  • Psssh, &lt;jsp:useBean&gt; :/
  • 抱歉,这只是一个翻译错误。在将这个问题的代码翻译成英文之前,它是意大利语。我很确定这不是问题所在。
【解决方案2】:

在表单的action中编码session id如下:

<form action="<%=response.encodeURL("finalize")%>" method="get">

【讨论】:

  • 你能在提交表单后看到 url 的结尾吗 => ;jsessionid="long alphanumerical string"
  • 查看页面的源代码并检查表单的 action 属性中的内容。
猜你喜欢
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 2012-12-07
  • 2011-06-25
相关资源
最近更新 更多