J'utilise un javax.servlet.http.HttpServletRequest pour implémenter une application Web.
Je n'ai aucun problème pour obtenir le paramètre d'une demande en utilisant la méthode getParameter. Cependant, je ne sais pas comment définir un paramètre dans ma demande.
Vous ne pouvez pas, sans utiliser l'API standard. HttpServletRequest
représente une requête reçue par le serveur, et donc l'ajout de nouveaux paramètres n'est 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 transmettre la requête encapsulée lorsque vous transférez.
Si vous suivez cette voie, vous devez utiliser un Filter
pour remplacer votre HttpServletRequest
par 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);
}
Si vous voulez vraiment le faire, 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 );
}
}
D'après votre question, je pense que ce que vous essayez de faire est de stocker quelque chose (un objet, une chaîne ...) pour le transmettre ensuite à un autre servlet, en utilisant RequestDispatcher (). Pour ce faire, vous n'avez pas besoin de définir un paramètre mais un attribut à l'aide
void setAttribute(String name, Object o);
puis
Object getAttribute(String name);
Comme mentionné dans les articles précédents, l'utilisation d'un HttpServletReqiestWrapper est la voie à suivre, mais la partie manquante dans ces articles était que, outre la substitution de la méthode getParameter (), vous devez également remplacer d'autres méthodes liées aux paramètres pour produire une réponse cohérente. par exemple. la valeur d'un paramètre ajouté par l'encapsuleur de demande personnalisé doit également être incluse dans la carte de paramètres renvoyée par la méthode getParameterMap (). Voici un exemple:
public class AddableHttpRequest extends HttpServletRequestWrapper {
/** A map containing additional request params this wrapper adds to the wrapped request */
private final Map<String, String> 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<String, String> getParameterMap() {
// defaulf impl, should be overridden for an approprivate map of request params
return super.getParameterMap();
}
@Override
public Enumeration<String> 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);
}
}
Le remplacement de getParameterMap manquant a fini par être un vrai problème pour moi. Voilà donc ce que je me suis retrouvé avec:
import Java.util.HashMap;
import Java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/***
* Request wrapper enabling the update of a request-parameter.
*
* @author E.K. de Lang
*
*/
final class HttpServletRequestReplaceParameterWrapper
extends HttpServletRequestWrapper
{
private final Map<String, String[]> keyValues;
@SuppressWarnings("unchecked")
HttpServletRequestReplaceParameterWrapper(HttpServletRequest request, String key, String value)
{
super(request);
keyValues = new HashMap<String, String[]>();
keyValues.putAll(request.getParameterMap());
// Can override the values in the request
keyValues.put(key, new String[] { value });
}
@SuppressWarnings("unchecked")
HttpServletRequestReplaceParameterWrapper(HttpServletRequest request, Map<String, String> additionalRequestParameters)
{
super(request);
keyValues = new HashMap<String, String[]>();
keyValues.putAll(request.getParameterMap());
for (Map.Entry<String, String> entry : additionalRequestParameters.entrySet()) {
keyValues.put(entry.getKey(), new String[] { entry.getValue() });
}
}
@Override
public String getParameter(String name)
{
if (keyValues.containsKey(name)) {
String[] strings = keyValues.get(name);
if (strings == null || strings.length == 0) {
return null;
}
else {
return strings[0];
}
}
else {
// Just in case the request has some tricks of it's own.
return super.getParameter(name);
}
}
@Override
public String[] getParameterValues(String name)
{
String[] value = this.keyValues.get(name);
if (value == null) {
// Just in case the request has some tricks of it's own.
return super.getParameterValues(name);
}
else {
return value;
}
}
@Override
public Map<String, String[]> getParameterMap()
{
return this.keyValues;
}
}