2012-01-03 20 views

risposta

39

Non è supportato dall'API Servlet per avere il carattere jolly del pattern URL * al centro del mapping. Consente solo il carattere jolly * alla fine della mappatura come /prefix/* o all'inizio della mappatura come *.suffix.

Con la sintassi standard del pattern URL consentita la soluzione migliore è mapparla su /xyz/* ed estrarre le informazioni sul percorso utilizzando HttpServletRequest#getPathInfo().

Quindi, dato un <url-pattern>/xyz/*</url-pattern>, ecco un esempio di base kickoff come estrarre le informazioni sul percorso, controlli nulli e indice di array fuori dai limiti controlli omessi:

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

Se si desidera un controllo più a grana più fine come possibile con Apache HTTPD mod_rewrite, quindi è possibile guardare Tuckey URL rewrite filter.

+0

Grazie! Questo risolve il mio problema. – BlackEagle

+0

È davvero * il modo * necessario per estrarre i parametri url che non sono parametri GET? Questo sembra abbastanza gonfio, difficile da mantenere, incline a bug di offset e il 1995 in generale. – Herbert

+2

@Herbert: basta usare un framework sopra l'API Servlet che supporta i parametri del percorso, come JAX-RS o MVC. – BalusC

3

Supporta il mapping di tale URL; ma non offre alcuna convalida.

Nel vostro Web XML, si potrebbe fare questo ....

/xyz/* 

Ma questo non garantisce che il finale test è presente e che è l'ultimo elemento. Se stai cercando qualcosa di più sofisticato, dovresti provare urlrewritefilter.

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

0

Come detto sopra, i servlet di base non supporta i modelli come specificato nella sua interrogazione. Spring MVC supporta i pattern. Here è un collegamento alla sezione pertinente nello Spring Reference Document.

0

Non dovrebbe fare che in web.xml, piuttosto si può puntare ogni richiesta per il filtro (Patternfilter) e in grado di verificare la presenza di 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 
    } 

} 
7

Come altri hanno indicato, la specifica servlet non consente tali modelli; tuttavia, è possibile considerare JAX-RS che consente tali modelli, se questo è appropriato per il tuo caso d'uso.

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

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

} 

Oppure:

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

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

} 

(Relativo a:. https://stackoverflow.com/a/8303767/843093)

-2

È possibile utilizzare questa libreria: http://zerh.github.io/ServletIO/, in modo da poter convertire i servlet nel controller MVC e utilizzare gli URL

+1

In base al dominio/URL del tuo link (s) che sono gli stessi o contenenti il ​​tuo nome utente, sembra che tu abbia collegato al tuo sito. Se lo fai, devi * comunicare che si tratta del tuo sito *. Se non comunichi che si tratta di un tuo sito, è spesso considerato spam. Vedi: [** Cosa significa "Buono" auto-promozione? **] (// meta.stackexchange.com/q/182212) e [Come non essere uno spammer] (// stackoverflow.com/help/promotion). – Makyen

+0

Un collegamento a una potenziale soluzione è sempre il benvenuto, ma per favore [aggiungi contesto intorno al link] (// meta.stackoverflow.com/a/8259) così i tuoi utenti avranno un'idea di cosa sia e perché è lì. ** Cita sempre la parte più rilevante di un link importante, nel caso in cui il sito target sia irraggiungibile o sia permanentemente offline. ** Considera che essere _barely più di un link a un sito esterno_ è una possibile ragione per [Perché e come vengono eliminate alcune risposte?] (// stackoverflow.com/help/deleted-answers). – Makyen