Servlet y parámetros de ruta como / xyz / {value} / test, cómo mapear en web.xml?

¿El servlet admite las URL de la siguiente manera?

/xyz/{value}/test 

donde el valor puede ser reemplazado por texto o número.

¿Cómo mapear eso en el web.xml?

La API de Servlet no admite que tenga el comodín de patrón de URL * en medio de la asignación. Solo permite el comodín * al final de la asignación como so /prefix/* o al inicio de la asignación como so *.suffix .

Con la syntax de patrón de URL permitida estándar, su mejor HttpServletRequest#getPathInfo() en /xyz/* y extraer la información de ruta usando HttpServletRequest#getPathInfo() .

Entonces, dado un /xyz/* , aquí hay un ejemplo básico de kickoff sobre cómo extraer la información de ruta, las comprobaciones nulas y las pruebas de índice fuera de límites omitidas:

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

Si desea un control más detallado como sea posible con mod_rewrite Apache HTTPD, entonces podría ver el filtro de reescritura de URL de Tuckey.

Como otros han indicado, la especificación del servlet no permite tales patrones; sin embargo, puede considerar JAX-RS que permite tales patrones, si esto es apropiado para su caso de uso.

 @Path("/xyz/{value}/test") public class User { public String doSomething(@PathParam("value") final String value) { ... } } 

O:

 @Path("/xyz/{value}") public class User { @Path("test") public String doTest(@PathParam("value") final String value) { ... } } 

(Relacionado con: https://stackoverflow.com/a/8303767/843093 .)

Sí admite el mapeo de esa url; pero no ofrece ninguna validación.

En tu web xml, podrías hacer esto …

 /xyz/* 

Pero eso no garantizará que la test final esté presente y que sea el último elemento. Si buscas algo más sofisticado, debes probar urlrewritefilter.

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

Como se indicó anteriormente, los servlets base no admiten patrones como los especificados en su pregunta. Spring MVC no admite patrones. Aquí hay un enlace a la sección pertinente en el Documento de referencia de spring .

No deberías estar haciendo eso en web.xml sino que puedes dirigir cada solicitud a tu filtro (Patternfilter) y puedes buscar 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 } } 

Puede usar esta biblioteca: http://zerh.github.io/ServletIO/ , para que pueda convertir sus servlets en controladores MVC y usar URL bonitas

Intereting Posts