web-dev-qa-db-fra.com

Servlet et paramètres de chemin comme / xyz / {value} / test, comment mapper dans web.xml?

La servlet prend-elle en charge les URL comme suit:

/xyz/{value}/test

où la valeur pourrait être remplacée par du texte ou un nombre.

Comment cartographier cela dans le web.xml?

31
BlackEagle

Il n'est pas pris en charge par l'API Servlet d'avoir le caractère générique de modèle d'URL * Au milieu du mappage. Il autorise uniquement le caractère générique * À la fin du mappage comme tel /prefix/* Ou au début du mappage comme tel *.suffix.

Avec la syntaxe de modèle d'URL standard autorisée, votre meilleur pari est de le mapper sur /xyz/* Et d'extraire les informations de chemin en utilisant HttpServletRequest#getPathInfo() .

Donc, étant donné un <url-pattern>/xyz/*</url-pattern>, Voici un exemple de démarrage de base pour extraire les informations de chemin, les vérifications nulles et l'index de tableau hors des contrôles omis:

String pathInfo = request.getPathInfo(); // /{value}/test
String[] pathParts = pathInfo.split("/");
String part1 = pathParts[1]; // {value}
String part2 = pathParts[2]; // test
// ...

Si vous voulez un contrôle plus fin comme possible avec mod_rewrite D'Apache HTTPD, alors vous pouvez regarder le filtre de réécriture d'URL de Tuckey .

47
BalusC

Comme d'autres l'ont indiqué, la spécification de servlet ne permet pas de tels modèles; cependant, vous pouvez envisager JAX-RS qui autorise de tels modèles, si cela convient à votre cas d'utilisation.

@Path("/xyz/{value}/test")
public class User { 

    public String doSomething(@PathParam("value") final String value) { ... }

}

Ou:

@Path("/xyz/{value}")
public class User { 

    @Path("test")
    public String doTest(@PathParam("value") final String value) { ... }

}

(Lié à: https://stackoverflow.com/a/8303767/84309 .)

7
shelley

Il prend en charge le mappage de cette URL; mais n'offre aucune validation.

Dans votre XML Web, vous pouvez le faire ....

/xyz/*

Mais cela ne garantit pas que le test de fin est présent et que c'est le dernier élément. Si vous recherchez quelque chose de plus sophistiqué, vous devriez essayer urlrewritefilter.

http://code.google.com/p/urlrewritefilter/

3
Dave

Vous ne devriez pas faire cela dans web.xml, vous pouvez plutôt pointer chaque demande vers votre filtre (Patternfilter) et vérifier l'URL

package com.inventwheel.filter;

import Java.io.IOException;
import Java.util.regex.Matcher;
import Java.util.regex.Pattern;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

/**
 * Servlet Filter implementation class PatternFilter
 */
@WebFilter("/*")
public class PatternFilter implements Filter {

    /**
     * Default constructor. 
     */
    public PatternFilter() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            String servletPath = ((HttpServletRequest)request).getServletPath();
            String requestURI = ((HttpServletRequest)request).getRequestURI();
            Pattern pattern = Pattern.compile(".*"+servletPath+"/(.*)");
            Matcher matcher = pattern.matcher(requestURI);
            if (matcher.matches())
            {
            String param = matcher.group(1);
            // do stuff with param here..
            }

        chain.doFilter(request, response);
    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }

}
0
Sanjay Kumar

Comme indiqué ci-dessus, les servlets de base ne prennent pas en charge les modèles comme vous l'avez spécifié dans votre question. Spring MVC prend en charge les modèles. Ici est un lien vers la section pertinente du Spring Reference Document .

0
DwB