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