注册过程的forward()/ redirect()用法?

时间:2010-07-11 07:18:24

标签: jsp servlets

我正在尝试为我的webapp完成注册过程,但我对servlet转发/重定向(再次)感到困惑。流程如下:

// /signup/index.jsp
<form action='/user/signup'>
</form>
<% 
if (request.getAttribute("msg") != null) {
    %><div><%= request.getAttribute("msg") %><%
}
%>

// Servlet which maps to '/user/signup':
public void doPost(..) {
    // process signup params..

    // I want to show the user /signup/index.jsp again after completion:
    req.setAttribute("msg", "signup worked!");
    req.getRequestDispatcher("/signup/index.jsp").forward(req, resp); 
}

当我使用forward()方法时,浏览器仍会显示帖子操作的网址:

/user/signup

但内容是:

/signup/index.jsp 

这就是forward()应该做的事情。我不确定这是否会让用户感到困惑 - 网址与实际生成内容的网页不同。

我逐步完成了Twitter的工作,看起来他们正在向用户展示:

// twitter.com/signup
if (ok) {
    forward("/find_sources/suggestions");
    if (ok) {
        forward("/find_sources/contacts");
        if (ok) {
            forward("/find_sources/anyone");
            if (ok) {
                forward("/");
            }
        }
    }
else {
    forward("/signup"); // error msg displayed here etc
}

在上面,如果你搞砸了初始注册页面,你的浏览器会显示/ account / create url,但页面的内容看起来像/注册 - 所以我猜他们做的是我做同样的事情(我只是假设所有http服务器的底层forward()/ redirect()选项都是相同的,而不是特定于jsp)。

我的流程正常吗?我应该以其他方式这样做吗?我猜选项是:

  1. 使用forward()并接受该网址将是操作网址。
  2. 使用redirect()并存储我想在会话中向用户显示的任何消息。
  3. 谢谢

1 个答案:

答案 0 :(得分:1)

如果你想做twitter做的事情 - 在线进行所有验证 - 即用AJAX显示验证错误。然后用户只有在他们已经正确完成所有事情并且使用前进这一事实不会有太大问题时才会点击“注册”。

但是,在一般情况下,尝试找到一些会话框架(如spring web flow),或类似于JSF @ViewScope的东西 - 即请求和会话之间的内容以适应此用例。

另一种选择是使用重定向并清除刚刚设置的会话内容。