Java 如何在forwaring时将请求参数从一个servlet传递到另一个servlet

Java 如何在forwaring时将请求参数从一个servlet传递到另一个servlet,java,servlets,parameters,forward,Java,Servlets,Parameters,Forward,有一个我目前无法实现的目标: 我有一个servlet,比如“ReportServlet”。它接受一个请求参数,比如'p'。 我显然可以通过以下方式获得参数: request.getParameter("p"); 我的JSP中的查询字符串是: <a href="<c:url value="/report"/>?p=value">report</a> 但是参数“p”在请求的queryString成员中,而不是在参数中 我如何使用查询参数传递'p'参数,就像从

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

我有一个servlet,比如“ReportServlet”。它接受一个请求参数,比如'p'。 我显然可以通过以下方式获得参数:

 request.getParameter("p");
我的JSP中的查询字符串是:

<a href="<c:url value="/report"/>?p=value">report</a>
但是参数“p”在请求的queryString成员中,而不是在参数中

我如何使用查询参数传递'p'参数,就像从JSP和forward检索'p'一样

我不想使用request属性,因为我想要一个唯一的解决方案来从JSP和forward获取参数


我想我错过了什么,但我找不到什么

有疑问时,一定要去医院。在这种情况下,请参见第9.1.1章“请求调度程序路径中的查询字符串”

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

String path = "/raisins.jsp?orderno=5"; 
RequestDispatcher rd = context.getRequestDispatcher(path);    
rd.include(request, response);
用于创建查询的查询字符串中指定的参数
RequestDispatcher
优先于同一类型的其他参数 传递给包含的servlet的名称与某个参数关联的参数
RequestDispatcher
的范围仅适用于 包括或转发呼叫。

所以你可以做得很好

RequestDispatcher rd = getServletContext().getRequestDispatcher("/report?p="+value);
rd.forward(request, response);   
并且参数
p
将仅对
HttpServletRequest
可用,该请求被提供给映射到处理指定路径的资源,即在这种情况下为
/report
。如果这是一个
HttpServlet
,那么您可以使用

request.getParameter("p");
其中
request
将是
HttpServletRequest
方法参数


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

如果您正在转发,则不需要传递参数,它们已经存在,它是同一个请求对象。@SotiriosDelimanolis您应该将其作为answer@SotiriosDelimanolis这就是问题所在:参数不在请求中。它是从PreProcessingServlet中的其他源计算的。我编辑了问题“我显然不想使用请求属性”-为什么这么明显?老实说,插入或修改查询字符串没有意义。客户端向他们想要的URI发出他们想要的请求。由服务器来处理给定的请求。使用请求属性。无论您将其发送到哪个资源,它们都将在
转发后可用。非常感谢您指出规范的这一部分。这正是我要寻找的。所以它可以工作。我要去看看这个。再次感谢。好吧,我的错:它工作得很好。。。我想我一定是被eclipse调试器检查器之类的东西弄糊涂了。非常感谢:这有助于我走出困境:)通过用于创建RequestDispatcher的查询字符串传递参数是一种不好的做法吗?还是可以接受?@kerafill我不认为这是一个坏习惯,但你现在传递的信息好像来自客户。这可能会让人困惑。@SotiriosDelimanolis是的,我同意。我决定改为通过setAttribute传递它们。我的servlet检查任何get/post参数,然后通过setAttribute传递值并将其转发到.jsp视图。jsp不再在param[]中进行检查,而是从requestScope[]进行检查。那样更干净。我也不需要转义任何URL,因为setAttribute处理非普通字符。
request.getParameter("p");