我有一个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
但是也有更好的方法可以做到这一点(对此仍然很新)
谢谢
答案 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);
}
}
另请参阅我在上面的参见列表中发布的第二个链接。