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?
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 .
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 .)
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.
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
}
}
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 .