我在WinXP、Eclipse Indigo和Google Web插件上开发一个Web应用程序。
我有一个简单的表单,让用户输入一个值(例如电子邮件),将其传递给名为SignIn.java
的Servlet进行处理,并将电子邮件值保存到会话中。
SignIn
代码非常简单,下面是它的doGet
主要操作:
String email = req.getParameter("email"); //getting the parameter from html form
...
...
HttpSession session = req.getSession(); //create a new session
session.setAttribute("email", email);
目前为止一切顺利,我已经验证了这些值在此时不是null
。现在出现了问题,我想重定向到另一个需要进行更多处理的servlet(ShowOnline.java
)。当我编写以下代码时:
resp.sendRedirect(resp.encodeRedirectURL("/ShowOnlineServlet"));
ShowOnline
获取 null
会话值(我在一秒钟前保存的相同电子邮件属性现在为null
)
当我写
getServletConfig().getServletContext().getRequestDispatcher("/ShowOnlineServlet");
一切都很好,之前的“email”属性不是null
!
发生了什么?sendRedirect()
只会让你的浏览器发送一个新请求,它不应该影响会话范围。我已经检查过cookie,并且它们没问题(肯定是相同的会话,因为这是我的Web应用程序创建的第一个且唯一的会话,而且我甚至还特意检查了会话ID,两个请求的ID是相同的)。
sendRedirect()
和forward()
之间为什么会有区别?简单的解决方案是使用forward()
,但在放手之前我想要弄清楚这个问题,我认为理解发生了什么很重要。对于这些基本概念,我不确定自己不知道发生了什么(因为我是初学者,所以我的整个Web应用程序非常简单和基础)。
任何想法或建议都将受到热烈欢迎!