2

Je voudrais savoir si elle est conforme à la spécification 2.5 du servlet java pour référencer/enregistrer la valeur de retour de request.getParameterMap() entre les demandes.Est-il portable de référencer la carte de paramètres de la requête après un cycle de requête?

La spécification finale indique seulement à la page 203:

Retours: un java.util.Map immuable contenant les noms des paramètres clés comme et les valeurs des paramètres comme valeurs de carte. Les clés de la table de paramètres sont de type . Les valeurs de la table de paramètres sont de type String array.

Mais ce n'est pas clair pour moi:

  • si la carte est immuable à l'application, et non au serveur d'applications

  • s'il est permis que le serveur d'application peut re -utilise l'instance pour une autre requête (par exemple, si les paramètres et leurs valeurs sont les mêmes que dans la demande précédente)

EDIT: La raison pour cela: Je voudrais enregistrer la demande de la carte de chaque demande et en cas d'erreur pour les imprimer à des fins de diagnostic.

+0

Ceci est une odeur de conception. S'il vous plaît élaborer l'exigence fonctionnelle :) Il existe probablement de meilleures solutions que cela. – BalusC

+0

@BalusC: Je voudrais enregistrer les cartes de requête de chaque requête, et en cas d'erreur, je voudrais imprimer chaque carte de paramètres (et d'autres choses) à des fins de diagnostic. – MRalwasser

Répondre

2

si la carte est immuable à l'application, pas au serveur d'applications

C'est immuable dans l'API, oui. Il est également logique, quel est le point de changer la carte de paramètre de demande? La mise en œuvre de servletcontainer à son tour peut bien sûr tenir d'une carte mutable "dans les coulisses". Mais vous ne devriez pas vous inquiéter des détails spécifiques à l'implémentation.

s'il est permis que le serveur d'application peut réutiliser l'instance pour une autre requête (par exemple, si les paramètres et leurs valeurs sont les mêmes que dans la demande précédente)

Non, le serveur ne le fait pas. Il en crée simplement un nouveau. Les paramètres sont liés à une requête spécifique.

Si vous souhaitez collecter les paramètres de chaque requête au cours d'une session, vous devez le faire vous-même. Le meilleur endroit pour cela serait un Filter.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { 
    HttpServletRequest hsr = (HttpServletRequest) request; 
    List<Map<String, String[]>> allParameters = (List<Map<String, String[]>>) hsr.getSession().getAttribute("allParameters"); 
    if (allParameters == null) { 
     allParameters = new ArrayList<Map<String,String[]>>(); 
     hsr.getSession().setAttribute("allParameters", allParameters); 
    } 
    allParameters.add(hsr.getParameterMap()); 
    chain.doFilter(request, response); 
} 
0

Je pense que vous pouvez l'enregistrer en toute sécurité pour la prochaine demande. Je fais ça tout le temps.

Vous n'êtes pas sûr des autres implémentations. Il crée une nouvelle table de hachage pour chaque demande dans Tomcat,

parameters = new HashMap(); 
    parameters = copyMap(getRequest().getParameterMap()); 
    mergeParameters(); 
    parsedParams = true; 
+0

les deux premières lignes de votre code sont étranges. D'abord, vous initialisez une variable, puis vous la réattribuez immédiatement avec autre chose? Cela ne peut pas être ce que vous vouliez dire ... –

+0

Le code provient de Tomcat. Cela pourrait être utile si les paramètres étaient utilisés dans copyMap() mais ce n'est pas le cas. –

1

Pour toutes fins utiles, vous ne pouvez pas modifier le contenu de la carte. Cependant, si vous voulez garder pour référence future, vous pouvez toujours créer votre propre carte, copier toutes les paires clé/valeur, et la conserver dans la session f.e. (Cela causera funkiness si l'utilisateur dispose de 2 fenêtres ouvertes en même temps, mais cette histoire est pour une autre fois ...)

+0

c'est ce que je fais actuellement pour être en sécurité. Mais bien sûr, moins efficace que d'utiliser l'instance directement. c'était l'intention pour laquelle j'ai posé cette question. – MRalwasser