2009-05-21 6 views

Répondre

25

Vous ne pouvez pas utiliser l'API standard. HttpServletRequest représente une requête reçue par le serveur, l'ajout de nouveaux paramètres n'est donc pas une option valide (en ce qui concerne l'API).

Vous pouvez en principe implémenter une sous-classe de HttpServletRequestWrapper qui encapsule la requête d'origine et intercepte les méthodes getParameter(), et transmet la requête encapsulée lorsque vous transférez.

Si vous allez dans cette voie, vous devez utiliser un Filter pour remplacer votre HttpServletRequest avec un 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); 
} 
+2

Je suppose que vous avez obtenu cette mise en œuvre de [ici] (http://stackoverflow.com/questions/1046721/accessing-the- raw-body-of-a-put-ou-post-demande). Le MULTI_READ_HTTP_METHODS était un peu confus, et bien que maintenant je comprenne à quoi il sert, je demande que vous supprimiez cela si entièrement. – Neil

15

De votre question, je pense que ce que vous essayez de faire est de stocker quelque chose (un objet, une chaîne ...) pour l'envoyer ensuite à une autre servlet, en utilisant RequestDispatcher(). Pour ce faire, vous n'avez pas besoin de définir un paramater mais un attribut en utilisant

void setAttribute(String name, Object o); 

puis

Object getAttribute(String name); 
+5

Les attributs et les paramètres ne sont pas interchangeables et représentent des concepts très différents. – skaffman

+2

@skaffman mais peut-être il peut résoudre ce dont il a besoin en utilisant les attributs - il ne devrait pas être nécessaire d'ajouter un nouveau paramètre à une requête au milieu du traitement de la requête. –

+2

la réponse devrait être éditée pour refléter ce paramètre un attribut pourrait être une solution au problème, au lieu d'impliquer la définition de l'attribut définit un paramètre dans la requête. – Chii

17

Si vous voulez vraiment faire cela, créez un 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); 
    } 

} 
+3

ce que la méthode de validation fait? – jomaora

+0

@Jeff, pouvez-vous s'il vous plaît dire ce que cette méthode de validation? –

+4

suffit de le remplacer par - return req.getParameter (nom); – Akvel

-4

Désolé, mais pourquoi ne pas utiliser la construction suivante:

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

Parce que vous obtenez cette exception: java.lang.IllegalStateException: Aucune modification n'est autorisée à une ParameterMap verrouillée – joaopribs

Questions connexes