如何在转发请求时从一个servlet传递请求参数到另一个servlet

8

我的目标是现在无法实现的:

我有一个servlet,叫做'ReportServlet'。它接收一个请求参数,叫做'p'。 我可以显然地通过以下方式获取参数:

 request.getParameter("p");

我JSP中的查询字符串是:

<a href="<c:url value="/report"/>?p=value">report</a>

一切都很顺利。

现在,我有另一个servlet,称为“PreProcessingServlet”。我想将PreProcessingServlet转发到ReportServlet,并传递在PreProcessingServlet中计算的“p”参数。我尝试过:

RequestDispatcher rd = getServletContext().getRequestDispatcher("/report?p="+value);
rd.forward(request, response);   

但是参数'p'要放在请求的queryString成员中,而不是参数中。

我该如何使用查询参数传递'p'参数,以便我可以从JSP和forward中以相同的方式检索'p'。

我不想使用请求属性,因为我希望得到一个从JSP和forward都能获取参数的唯一解决方案

我猜我错过了什么,但我找不到!


4
如果你正在转发请求,就不需要传递参数,因为它们已经存在于同一个请求对象中。 - Sotirios Delimanolis
2
@SotiriosDelimanolis 你应该将其发布为答案。 - Joeri Hendrickx
1
“我显然不想使用请求属性。” - 为什么这是显而易见的呢? - Balázs Németh
请澄清PreProcessingServlet中参数是如何计算的。它们不是来自查询字符串吗? - Sotirios Delimanolis
1
老实说,注入或修改查询字符串没有意义。客户端请求他们想要的URI。服务器负责处理给定的请求。使用请求属性。无论您将其发送到哪个资源,它们都将在“转发”后可用。 - Sotirios Delimanolis
显示剩余4条评论
1个回答

21

当你有疑问时,总是去看一下规范。在这种情况下,请参阅第9.1.1节 查询字符串中的请求分派器路径

ServletContextServletRequest 方法使用路径信息创建 RequestDispatcher 对象允许将查询字符串信息附加到路径中(可选)。例如,开发人员可以使用以下代码获取一个 RequestDispatcher

String path = "/raisins.jsp?orderno=5"; 
RequestDispatcher rd = context.getRequestDispatcher(path);    
rd.include(request, response);

查询字符串中指定的参数会优先于传递给包含的servlet的同名其他参数,用于创建RequestDispatcher。与RequestDispatcher关联的参数仅适用于包含或转发调用的持续时间。

RequestDispatcher rd = getServletContext().getRequestDispatcher("/report?p="+value);
rd.forward(request, response);   

参数p仅适用于映射到处理指定路径的资源所提供的HttpServletRequest,即在此情况下为/report。 如果是HttpServlet,则可以使用以下方式进行访问:

request.getParameter("p");

这里,requestHttpServletRequest方法参数。

forward(..)调用结束并且执行回到你的PreProcessingServlet时,在本地HttpServletRequest对象中该参数将不再可用。


非常感谢您指出规范的这一部分。这正是我在寻找的。所以它可以工作。我会去检查一下。再次感谢。 - Gabriel Glenn
好的,是我的错:它之前一直正常工作……我想我可能被Eclipse的调试器视图或其他东西搞糊涂了。非常感谢:这帮助我把注意力从问题上解脱出来 :) - Gabriel Glenn
将参数通过用于创建RequestDispatcher的查询字符串传递,这样做是否是不良实践?或者说这是可以接受的? - kerafill
@kerafill 我不认为这是不好的做法,但你现在传递信息时就像它来自客户端一样。那可能会造成困惑。 - Sotirios Delimanolis
@SotiriosDelimanolis 是的,我同意。我决定通过setAttribute传递它们。我的servlet检查任何get/post参数,然后通过setAttribute传递值并将其转发到.jsp视图。.jsp不再从param[]中检查,而是从requestScope[]中检查。这样更清洁。我也不需要转义任何URL,因为setAttribute处理非常规字符。 - kerafill
需要注意的是,window.location.search 不会随查询参数更新。它们只在请求本身上设置。因此,您不能仅转发或包含无法访问 HttpServletRequest 本身的 HTML 页面。 - Andrew T Finnell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接