Java 重定向后访问请求范围内自定义对象的哈希映射

Java 重定向后访问请求范围内自定义对象的哈希映射,java,jsp,servlets,jstl,Java,Jsp,Servlets,Jstl,我使用RequestDispatcher将自定义对象的HashMap传递给JSP,并且我能够使用JSTL访问对象及其属性 但是,如果使用response.sendRedirect()发送参数,代码将失败 我不确定原因是什么以及如何使其工作?响应。sendRedirect()基本上指示客户端(webbrowser)在给定URL上发送一个新的请求。您还会看到浏览器地址栏中的更改反映了这一点 新的请求当然不包含以前(或任何其他)请求的属性。否则,这将打破“请求范围”的整个概念 要预处理GET请求,您需

我使用
RequestDispatcher
将自定义对象的
HashMap
传递给JSP,并且我能够使用JSTL访问对象及其属性

但是,如果使用
response.sendRedirect()
发送参数,代码将失败


我不确定原因是什么以及如何使其工作?

响应。sendRedirect()基本上指示客户端(webbrowser)在给定URL上发送一个新的请求。您还会看到浏览器地址栏中的更改反映了这一点

新的请求当然不包含以前(或任何其他)请求的属性。否则,这将打破“请求范围”的整个概念

要预处理GET请求,您需要在servlet的
doGet()
方法中执行该工作,然后重定向到该servlet的URL

例如

@WebServlet(“/foo”)
公共类FooServlet扩展了HttpServlet{
@凌驾
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
Map foos=fooService.Map();
setAttribute(“foos”,foos);
request.getRequestDispatcher(“/WEB-INF/foo.jsp”).forward(请求,响应);
}
}
请注意,这个问题与在请求范围中拥有自定义对象的hashmap无关

另见:

您不能在response.sendRedirect中共享请求属性,因为它会创建新请求

但是,如果您需要HashMap,在response.sendRedirect中,您可以将其放入会话中,如下所示

request.getSession().setAttribute("myMap", [HashMap object]);

并且可以在servlet和JSP之间共享。这在RequestDispatcher和sendRedirect中都有效。

请注意,当映射包含请求范围的数据而不是会话范围的数据时,这可能会导致不希望的webapp行为和糟糕的用户体验。将请求范围内的数据放入会话范围将在同一会话中的多个浏览器选项卡/窗口上公开它。这是真的,但当要求跨页面共享数据时,我们必须将该映射放入会话中。我对Java是新手,但据我所知,对于每个请求,容器(例如:Tomcat)创建一个新线程,并在处理后立即终止它。因此,在这种重定向情况下,我认为第一个请求的线程在调用response.sendRedirect()后很快就会被终止。那么我们如何在下一个请求(重定向请求)中获取不再存在的资源(本例中为HashMap)?@user1089770如果您观察到该语句,我们将HashMap放在会话中,而不是请求中。会话将是相同的,并持续跨越多个请求(多个页面),直到用户操作或服务器将其销毁。由于这种行为,您也可以在下一个请求中获取HashMap对象。
@WebServlet("/foo")
public class FooServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Map<String, Foo> foos = fooService.map();
        request.setAttribute("foos", foos);
        request.getRequestDispatcher("/WEB-INF/foo.jsp").forward(request, response);
    }

}
request.getSession().setAttribute("myMap", [HashMap object]);