【问题标题】:How to pass a request parameter from one servlet to a other while forwaring如何在转发时将请求参数从一个 servlet 传递到另一个
【发布时间】:2014-02-19 13:50:31
【问题描述】:

有一个我暂时无法实现的目标:

我有一个 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 和转发中检索“p”的方式相同。

我不想使用请求属性,因为我想要一个独特的解决方案来从 JSP 和转发中获取参数

我想我错过了一些东西,但我找不到什么!

【问题讨论】:

  • 如果是转发,则不需要传参数,参数已经存在,是同一个请求对象。
  • @SotiriosDelimanolis 您应该将其发布为答案
  • @SotiriosDelimanolis 这就是问题所在:参数不在请求中。它是从 PreProcessingServlet 中的其他来源计算的。我编辑问题
  • '我显然不想使用请求属性。' - 为什么这么明显?
  • 老实说,注入或修改查询字符串是没有意义的。客户端向他们想要的 URI 发出他们想要的请求。由服务器来处理给定的请求。使用请求属性。无论您将其发送到什么资源,它们都将在 forward 之后可用。

标签: java servlets parameters forward


【解决方案1】:

如有疑问,请始终联系specification。在这种情况下,请参阅章节9.1.1 Query Strings in Request Dispatcher Paths

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

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

查询字符串中指定的参数用于创建 RequestDispatcher 优先于其他相同的参数 传递给包含的 servlet 的名称。 与 a 相关的参数 RequestDispatcher 的范围仅适用于 包括或转接呼叫。

所以你可以做得很好

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

并且参数p 将仅适用于HttpServletRequest,它被赋予映射以处理指定路径的资源,即。 /report 在这种情况下。如果那是 HttpServlet,那么您可以使用

访问它
request.getParameter("p");

其中request 将是HttpServletRequest 方法参数。

forward(..) 调用终止并返回到您的PreProcessingServlet 时,该参数将不再在本地HttpServletRequest 对象中可用。

【讨论】:

  • 非常感谢您指出规范的这一部分。这就是我一直在寻找的。所以它可以工作。我要去看看这个。再次感谢。
  • 好吧,我的错:它工作得很好......我想我一定是被 Eclipse 调试器检查器或其他东西弄糊涂了。非常感谢:它帮助我摆脱困境:)
  • 通过用于创建 RequestDispatcher 的查询字符串传递参数是不好的做法吗?还是可以接受?
  • @kerafill 我不认为这是一种不好的做法,但是您现在正在传递信息,就好像它来自客户端一样。这可能会令人困惑。
  • @SotiriosDelimanolis 是的,我同意。我决定改为通过 setAttribute 传递它们。我的 servlet 检查任何 get/post 参数,然后通过 setAttribute 传递值并将其转发到 .jsp 视图。 .jsp 不再检查 param[],而是来自 requestScope[]。这样更干净。我也不需要转义任何 URL,因为 setAttribute 处理非常规字符。
猜你喜欢
  • 1970-01-01
  • 2017-02-04
  • 2021-08-24
  • 2017-05-14
  • 2015-03-15
  • 2017-10-29
  • 2016-05-12
  • 2023-04-05
  • 2012-04-24
相关资源
最近更新 更多