【问题标题】:Pass value from "doGet" to "doPost" (within the same servlet)将值从“doGet”传递到“doPost”(在同一个 servlet 中)
【发布时间】:2020-11-07 05:45:41
【问题描述】:

编辑:这不是this 问题的重复,因为我试图在 same servlet 的doGetdoPost 之间发送数据。另一个问题询问如何在不同的 servlet 之间发送数据,但我已经通过将信息附加到 URL 来做到这一点(参见下面的第一个代码 sn-p),我不能在同一个 servlet 中这样做。另外,链接的问题来自 2011 年,使用的是 Tomcat 5.5,而我使用的是 8.5。

我正在开发一个带有两个 servlet 和一个过滤器的小型 Java 8/Tomcat 8.5“应用程序”:如果 servlet 路径是“/hello”,则过滤器将启动并在没有活动会话时执行此操作:

response.sendRedirect(request.getContextPath() + "/login?p="+request.getServletPath());

这会加载“/login” servlet (LoginServlet.java) 及其 html 文件 (LoginHTML.html):

<body>
    <form method="POST" action="login">
        <label for="username">Username:</label><br>
        <input type="text" id="username" name="username"><br>
        <label for="password">Password:</label><br>
        <input type="password" id="password" name="password"><br><br>
        <input type="hidden" id="redirect" value="">
        <input type="submit" value="Login">
    </form>
</body>

点击“登录”按钮应该会加载用户之前尝试访问的页面(通过LoginServlet.doPost),在我的例子中是“/hello”(但也可以是“/hello/bla”或“/你好/thisisatest”——即使那些还不存在)。

LoginServlet.doGet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String redi = request.getParameter("p");
    RequestDispatcher dispatcher = request.getRequestDispatcher("/html/LoginHTML.html");
    dispatcher.forward(request, response);
}

redi 包含之前访问过的路径,但我现在正在寻找一种方法以某种方式将其传递给doPost,以便它可以返回上一页。

正如您在上面的 html 代码中看到的,我已经在表单中添加了隐藏属性 redirect,但是如何在运行时将其值设置为 redi 中的值(可能在 doGet 中),所以我可以在doPostrequest.getParameter("redirect") 中访问它吗?有没有其他方法可以做到这一点?

【问题讨论】:

  • @BalusC 这不是this 问题的重复,因为我试图在 same servlet 的doGetdoPost 之间发送数据。另一个问题询问如何在不同的 servlet 之间发送数据,但我已经通过将信息附加到 URL 来做到这一点(参见下面的第一个代码 sn-p),而我不能在同一个 servlet 中这样做。跨度>
  • @BalusC 感谢您再次提出问题。已接受答案的 JST 部分有效,但您必须使用 jsp 文件。我宁愿保留我在问题中也提到的 html 版本,所以不使用任何额外的库。
  • @BalusC 我的意思是,我宁愿不使用 jsp 文件,因为这需要 JST 库。是否可以在运行时将隐藏属性等内容添加到 html 页面?我试图在LoginServlet.doGet 中的forward 之后简单地写信给PrintWriter,但这并没有添加任何内容。或者是否有完全不同的方式将额外信息从doGet 传递到doPost(不需要额外的库)?

标签: java html servlets


【解决方案1】:

这不是最好的方法,但你可以试试。您可以使用 JavaServer Pages 和 JSTL 或其他类似的东西来代替 HTML。

doGet() 方法中使用request.setAttribute("redi", redi)。 在 JSP 中,在隐藏字段值中使用 ${redi}。 在doPost() 方法中使用request.getParameter("redirect").

【讨论】:

  • 谢谢,我试过了,但不幸的是request.getParameter("redirect")doPost 中返回nullThis is not the best way, but you can try it. - 那么“最好的方法”是什么?是否可以使用 html 文件(而不是 jsp)来执行此操作?
  • 我设法修复它:name="redirect" 不见了。整行是:&lt;input type="hidden" id="redirect" name="redirect" value="${redi}"&gt;。我宁愿不使用jsp,有没有办法只用一个基本的html文件?
  • 如果要使用HTML文件可以使用Thymeleaf,但不是很方便。
  • Servlet 通常与 JSP 一起使用。在一个servlet应用中请求之间传递值有3种方式,有cookies、隐藏字段(你的选择)和应用上下文(使用ServletContextListener实现)
  • 另一种方式是使用会话,在我看来,这种方式更好。您可以通过request.getSession() 使用它。 HttpSession 类有方法 setAttribute()getAttribute()。使用后可以removeAttribute()删除。
猜你喜欢
  • 2014-05-23
  • 2011-07-09
  • 2014-06-02
  • 2011-01-21
  • 2011-08-18
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多