在同一个域上的两个URL之间传递字符串(但不在会话中?)

时间:2010-06-22 20:02:08

标签: jsp servlets

我有一个servlet将请求转发到同一域中的另一个url。我想在两者之间传递一个字符串,如:

// ServletVerifyUser.java:
public void doGet(HttpServletRequest req, HttpServletResponse resp) {
    // do some work..

    req.setAttribute("message", "Thanks for signing up!");

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

// login.jsp
<%
    // message is null.
    String message = request.getAttribute("message");

    <p><%= message %></p>
%>

请求对象不能像这样工作吗?

在我的情况下,当用户点击我在注册后为他们生成的网址时,我正在运行ServletVerifyUser。最后,我想将它们重定向到我的登录页面,但是在请求中嵌入了该消息。然后,登录页面可以呈现验证servlet为其准备的任何内容,

由于

------------------编辑-------------------------

好的,看起来问题是我的登录页面实际位于:

/login/index.jsp

在我的本地测试机器上,我正在使用此字符串作为url:

“/登录”

(我试图通过显示“/login.jsp”使上面的例子更简单,因为我认为这不会有所作为,在浏览器中网址仍然可以解决)。

但是当我使用:“/ login”时,属性消失了,如果我使用完整路径:“/ login / index.jsp”,则属性存在。

我将登录jsp放在这样一个单独的文件夹中,以便保持更好看的网址,例如我可以给用户:

www.mysite.com/login

而不是:

www.mysite.com/login.jsp

但是也有更好的方法可以做到这一点(对此仍然很新)

谢谢

1 个答案:

答案 0 :(得分:0)

首先,您通常会使用EL (Expression Language)来显示它:

<p>${message}</p>

其次,如果您实际使用response.sendRedirect("/login.jsp")对视图执行重定向,则视图中的请求属性可能为null。即使代码显示您正在执行转发,但您告知您正在重定向到登录页面。重定向基本上指示客户端创建新请求,因此包含其所有属性的原始请求将被包含在内。

另见:


更新根据您的更新,/login/index.jsp显然正在进行重定向。我建议摆脱它,只有一个/login.jsp。您最终可以在/WEB-INF/login.jsp中隐藏它,以便您可以继续使用不错的URL。重写LoginServlet(其中我假设它正在聆听url-pattern /login),如下所示:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    User user = userDAO.find(username, password);
    if (user != null) {
        request.getSession().setAttribute("user", user);
        response.sendRedirect("home");
    } else {
        request.setAttribute("message", "Unknown user, please try again");
        request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
    }
}

另请参阅我在上面的参见列表中发布的第二个链接。