【问题标题】:how to message from servlet and display in jsp如何从servlet发送消息并在jsp中显示
【发布时间】:2011-08-28 05:35:28
【问题描述】:

我正在尝试做一些看起来很小但失败的事情。当登录失败但无法登录时,我正在尝试将响应消息发送回 jsp。到目前为止,我只能重定向回 jsp,但无法在其上显示来自 servlet 的消息。这是重定向的 servlet 部分:

                if (count > 0) {
                res.sendRedirect("adminHome.jsp");
            } else {

                res.sendRedirect("index.jsp");
            }

我尝试使用 PrintWriter 和重定向打印消息但失败了,因为我无法了解如何在 JSP 中接收消息。我还读到我不应该重定向,而应该只从 servlet 转发。我怎样才能做到这一点?请帮助提供从 servlet 转发的代码补丁以及在 JSP 中接收的代码补丁。谢谢

【问题讨论】:

  • 永远不要在 servlet 中使用 response.getWriter()getOutputStream(),无论何时使用转发/重定向。你将冒险IllegalStateExceptions。

标签: jsp servlets


【解决方案1】:

如果你坚持使用重定向而不是转发,那么你有两种选择:

  1. 将消息作为请求参数传递

    String message = "hello";
    res.sendRedirect("adminHome.jsp?message=" + URLEncoder.encode(message, "UTF-8"));
    

    这样就可以在JSP中显示如下

    <p>Message: ${param.message}</p>
    

    它也只在浏览器地址栏中可见,您无法通过这种方式传递非标准 Java 对象。

  2. 将其存储在会话中

    String message = "hello";
    req.getSession().setAttribute("message", message);
    res.sendRedirect("adminHome.jsp");
    

    以便您可以在 JSP 中显示(和删除)它,如下所示:

    <p>Message: ${message}</p>
    <c:remove var="message" scope="session" /> 
    

    删除很重要,否则它会在整个会话期间一直存在。


但是,如果您愿意使用转发而不是重定向,它会更优雅:

String message = "hello";
req.setAttribute("message", message);
req.getRequestDispatcher("/adminHome.jsp").forward(req, res);

并在JSP中显示如下

    <p>Message: ${message}</p>

另见:

【讨论】:

  • 感谢@BalusC,我尝试了您的所有选项,它们提供了我需要的显示。唯一的问题是即使我重新启动应用程序,消息也会粘在页面上。如何删除它,使其仅在用户名和密码不正确时显示?现在它甚至在输入用户名和密码之前就显示消息
  • 你用过哪种方式?如果您使用&lt;c:remove&gt; 在会话中不使用 设置它,那么它确实会保留整个会话。关闭并重新启动网络浏览器。至于显示验证消息的正确方式,请单击我的答案“另见”部分的Our Servlets wiki page链接。
  • 我重启了浏览器,消息不见了。非常感谢
【解决方案2】:

将您的消息设置为请求对象的属性:

request.setAttribute("message", messageString);

使用 RequestDispatcher 将请求和响应对象分派到 jsp:

RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("urlString");
dispatcher.forward(request, response);

使用表达式语言语法在您的 JSP 中访问它:

${message}

【讨论】:

  • 感谢@elekwent,现在唯一的问题是即使没有输入任何内容,它也会在页面上显示消息。如何确保仅在输入内容后才显示消息?
【解决方案3】:

可以将消息保存在请求中,然后转发到jsp而不是重定向。

    request.setAttribute("msg", "The actual error message to be displayed");

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

然后在 jsp 页面上,您可以通过请求访问消息。

【讨论】:

  • 谢谢。尽管消息似乎停留在页面上,但它仍然有效。怎么去掉
猜你喜欢
  • 2015-06-07
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
相关资源
最近更新 更多