27

我将如何传递隐藏参数?我想调用一个页面(test.jsp),但也传递 2 个隐藏参数,如帖子。

response.sendRedirect("/content/test.jsp");
4

5 回答 5

50

TheNewIdiot 的回答成功地解释了问题以及您无法通过重定向在请求中发送属性的原因。可能的解决方案:

  1. 使用转发。这将使请求属性可以传递给视图,并且您可以以表达式语言JSTLServletRequest#getAttribute的形式或通过使用它们来使用它们。简短示例(重用 TheNewIdiot 的答案] 代码)。

    控制器(您的 servlet)

    request.setAttribute("message", "Hello world");
    RequestDispatcher dispatcher = servletContext().getRequestDispatcher(url);
    dispatcher.forward(request, response);
    

    查看(您的 JSP)

    使用小脚本:

    <%
        out.println(request.getAttribute("message"));
    %>
    

    这仅供参考必须避免使用 Scriptlets :如何避免 JSP 文件中的 Java 代码?. 下面是使用 EL 和 JSTL 的示例。

    <c:out value="${message}" />
    
  2. 如果您不能使用转发(因为您不喜欢它,或者您不这么认为,或者因为您必须使用重定向),那么一个选项是将消息保存为会话属性,然后重定向到您的视图,在您的视图中恢复会话属性并将其从会话中删除。请记住始终让您的用户会话只包含相关数据。代码示例

    控制器

    //if request is not from HttpServletRequest, you should do a typecast before
    HttpSession session = request.getSession(false);
    //save message in session
    session.setAttribute("helloWorld", "Hello world");
    response.sendRedirect("/content/test.jsp");
    

    看法

    再次,使用 scriptlet 和 EL + JSTL 显示:

    <%
        out.println(session.getAttribute("message"));
        session.removeAttribute("message");
    %>
    
    <c:out value="${sessionScope.message}" />
    <c:remove var="message" scope="session" />
    
于 2013-06-08T16:22:58.830 回答
5

通常,您不能使用sendRedirect()方法发送 POST 请求。您可以使用RequestDispatcher在相同的 Web 应用程序、相同的上下文中转发()带有参数的请求。

RequestDispatcher dispatcher = servletContext().getRequestDispatcher("test.jsp");
dispatcher.forward(request, response);

HTTP 规范规定所有重定向必须采用 GET(或 HEAD)的形式。如果安全是一个问题,您可以考虑加密您的查询字符串参数。另一种方法是您可以通过使用 POST 方法隐藏表单并在页面加载时使用 javascript 提交它来向目标发布。

于 2013-06-08T15:49:47.123 回答
0

使用session,我成功地将参数 ( name) 从 servlet #1 传递到 servlet #2,response.sendRedirect在 servlet #1 中使用。Servlet #1 代码:

protected void doPost(HttpServletRequest request, HttpServletResponse response) {
    String name = request.getParameter("name");
    String password = request.getParameter("password");
    ...
    request.getSession().setAttribute("name", name);
    response.sendRedirect("/todo.do");

在 Servlet #2 中,您无需name返回。它已经连接到会话。你可以做String name = (String) request.getSession().getAttribute("name");——但你不需要这个。

如果 Servlet #2 调用一个 JSP,你可以name在 JSP 网页上这样显示:

<h1>Welcome ${name}</h1>

于 2016-11-24T15:44:26.853 回答
-1

在 response.sendRedirect() 中通过 URL 发送变量值。我已经将它用于一个变量,您也可以通过适当的连接将它用于两个变量。

字符串值="xyz";

response.sendRedirect("/content/test.jsp?var="+value);

于 2020-04-15T15:47:01.493 回答
-2

用这个:

out.println("<script>window.location.href = \"hoadon?OrderId=" + getIdOrder + "\"\n</script>>");
于 2021-11-30T14:53:47.083 回答