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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21882485/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 11:14:45  来源:igfitidea点击:

How to pass a request parameter from one servlet to a other while forwaring

javaservletsparametersforward

提问by Gabriel Glenn

There is my goal that I can't achieve for now :

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

I have one servlet, say 'ReportServlet'. It takes a request parameter, say 'p'. I can obviously get the parameter by :

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

 request.getParameter("p");

The query string in my JSP is :

我的 JSP 中的查询字符串是:

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

And everythings works fine.

一切正常。

Now : I have another servlet, say 'PreProcessingServlet'. I want to forward PreProcessingServlet to ReportServlet, passing a 'p' parameter which is computed in PreProcessingServlet. I tried :

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

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

But the parameter 'p' goes in the request's queryString member, not in the parameters.

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

How can I pass the 'p' parameter, using query parameter in the way that I can retrieve 'p' the same way from the JSP and from the forward.

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

I don't want to use a request attribute because I want a unique solution to get the parameter from both a JSP and a forward.

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

I guess I'm missing something, but I can't find what !

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

采纳答案by Sotirios Delimanolis

When in doubt, always go to the specification. In this case, see chapter 9.1.1 Query Strings in Request Dispatcher Paths

如有疑问,请始终查看规范。在这种情况下,请参阅章节9.1.1 Query Strings in Request Dispatcher Paths

The ServletContextand ServletRequestmethods that create RequestDispatcherobjects using path information allow the optional attachment of query string information to the path. For example, a Developer may obtain a RequestDispatcherby using the following code:

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

Parameters specified in the query string used to create the RequestDispatchertake precedence over other parameters of the same name passed to the included servlet. The parameters associated with a RequestDispatcherare scoped to apply only for the duration of the include or forward call.

使用路径信息创建对象的ServletContextServletRequest方法 允许将查询字符串信息可选地附加到路径。例如,Developer 可以 使用以下代码获取 a :RequestDispatcherRequestDispatcher

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

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

So you can very well do

所以你可以很好地做到

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

And the parameter pwill be available only for HttpServletRequestthat is given to the resource mapped to handle the specified path, ie. /reportin this case. If that is a HttpServlet, you can then access it with

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

request.getParameter("p");

where requestwould be the HttpServletRequestmethod parameter.

其中request将是HttpServletRequest方法的参数。

When the forward(..)call terminates and execution comes back to your PreProcessingServlet, the parameter will no longer be available in the local HttpServletRequestobject.

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