如何在HttpServletRequest中设置参数?

我正在使用javax.servlet.http.HttpServletRequest来实现Web应用程序。

使用getParameter方法获取请求的参数没有问题。 但是我不知道如何在我的请求中设置参数。

你不能,不使用标准API。 HttpServletRequest表示服务器收到的请求,因此添加新参数不是有效选项(就API而言)。

您原则上可以实现HttpServletRequestWrapper的子类,它包装原始请求,并拦截getParameter()方法,并在转发时传递包装的请求。

如果你走这条路,你应该使用Filter来用HttpServletRequest替换你的HttpServletRequestWrapper

 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { if (servletRequest instanceof HttpServletRequest) { HttpServletRequest request = (HttpServletRequest) servletRequest; // Check wether the current request needs to be able to support the body to be read multiple times if (MULTI_READ_HTTP_METHODS.contains(request.getMethod())) { // Override current HttpServletRequest with custom implementation filterChain.doFilter(new HttpServletRequestWrapper(request), servletResponse); return; } } filterChain.doFilter(servletRequest, servletResponse); } 

如果您真的想这样做,请创建一个HttpServletRequestWrapper。

 public class AddableHttpRequest extends HttpServletRequestWrapper { private HashMap params = new HashMap(); public AddableingHttpRequest(HttpServletRequest request) { super(request); } public String getParameter(String name) { // if we added one, return that one if ( params.get( name ) != null ) { return params.get( name ); } // otherwise return what's in the original request HttpServletRequest req = (HttpServletRequest) super.getRequest(); return validate( name, req.getParameter( name ) ); } public void addParameter( String name, String value ) { params.put( name, value ); } } 

从你的问题来看,我认为你要做的是存储一些东西(一个对象,一个字符串……)然后使用RequestDispatcher()将它转移到另一个servlet。 要做到这一点,您不需要设置参数,而是使用属性

 void setAttribute(String name, Object o); 

接着

 Object getAttribute(String name); 

正如之前的post中所提到的,使用HttpServletReqiestWrapper是可行的方法,但是这些post中遗漏的部分是除了覆盖方法getParameter()之外,还应该覆盖其他参数相关的方法以产生一致的响应。 例如,自定义请求包装器添加的param的值也应该包含在方法getParameterMap()返回的参数映射中。 这是一个例子:

  public class AddableHttpRequest extends HttpServletRequestWrapper { /** A map containing additional request params this wrapper adds to the wrapped request */ private final Map params = new HashMap<>(); /** * Constructs a request object wrapping the given request. * @throws java.lang.IllegalArgumentException if the request is null */ AddableHttpRequest(final HttpServletRequest request) { super(request) } @Override public String getParameter(final String name) { // if we added one with the given name, return that one if ( params.get( name ) != null ) { return params.get( name ); } else { // otherwise return what's in the original request return super.getParameter(name); } } /** * *** OVERRIDE THE METHODS BELOW TO REFLECT PARAMETERS ADDED BY THIS WRAPPER **** */ @Override public Map getParameterMap() { // defaulf impl, should be overridden for an approprivate map of request params return super.getParameterMap(); } @Override public Enumeration getParameterNames() { // defaulf impl, should be overridden for an approprivate map of request params names return super.getParameterNames(); } @Override public String[] getParameterValues(final String name) { // defaulf impl, should be overridden for an approprivate map of request params values return super.getParameterValues(name); } } 

抱歉,为什么不使用以下结构:

 request.getParameterMap().put(parameterName, new String[] {parameterValue});