使用response.sendRedirect()传递隐藏参数
我如何传递隐藏的参数? 我想调用一个页面(test.jsp),但也传递2个隐藏参数,如post。
response.sendRedirect("/content/test.jsp");
TheNewIdiot的答案成功地解释了问题以及您无法通过重定向在请求中发送属性的原因。 可能的解决方案:
-
使用转发。 这将使请求属性可以传递给视图,您可以使用
ServletRequest#getAttribute
forms或使用表达式语言和JSTL 。 简短的例子(重用TheNewIdiot的答案)代码)。控制器(你的servlet)
request.setAttribute("message", "Hello world"); RequestDispatcher dispatcher = servletContext().getRequestDispatcher(url); dispatcher.forward(request, response);
查看(您的JSP)
使用scriptlet:
<% out.println(request.getAttribute("message")); %>
这仅供参考 。 必须避免使用Scriptlet: 如何避免JSP文件中的Java代码? 。 下面是使用EL和JSTL的示例。
-
如果您不能使用转发(因为您不喜欢它或者您不喜欢它或因为您必须使用重定向),那么选项会将消息保存为会话属性,然后重定向到您的视图,恢复视图中的会话属性并将其从会话中删除 。 请记住始终只使用相关数据进行用户会话。 代码示例
调节器
//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"); %>
通常,您无法使用sendRedirect()方法发送POST请求。 您可以使用RequestDispatcher在同一Web应用程序中使用相同上下文的参数转发()请求。
RequestDispatcher dispatcher = servletContext().getRequestDispatcher("test.jsp"); dispatcher.forward(request, response);
HTTP规范规定所有重定向必须采用GET(或HEAD)的forms。 如果安全性存在问题,您可以考虑加密查询字符串参数。 另一种方法是你可以通过方法POST隐藏表单并在加载页面时使用javascript提交它来POST到目标。
使用session
,我使用servlet#1中的response.sendRedirect
成功地将参数( name
)从servlet#1传递到servlet#2。 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,您可以在JSP网页上name
这种方式显示name
:
Welcome ${name}