Come utilizzare @WebServlet per accettare argomenti (in modo RESTFul)?

supponiamo di voler accettare i seguenti URL:

http://myserver/myapplication/posts http://myserver/myapplication/posts/ http://myserver/myapplication/posts//delete 

come posso usare il decoratore servlet @WebServlet per farlo? Sto studiando il value e urlPatterns ma non capisco come farlo. Per esempio,

 @WebServlet(urlPatterns={"/posts", "/posts/*"}) [..] String param = request.getPathInfo(); 

mi dà qualche risultato, ma come usarlo? Inoltre, request.getPathInfo() sembra restituire il valore del carattere jolly, ma cosa succede se voglio più parametri come in http://http://myserver/myapplication/posts//delete/ ?

Nelle specifiche della servlet, non si hanno nozioni di variabili di percorso. Alcuni framework MVC li supportano, ad esempio Struts o Spring MVC.

Per un punto di vista servlet, un URL è:

 scheme://host.domain/context_path/servlet_path/path_info?parameters 

dove una qualsiasi parte (a partire dal percorso di contesto può essere nullo)

Specifiche per gli stati servlet 3.0:

  • Percorso contesto: il prefisso del percorso associato al ServletContext di cui questo servlet fa parte. Se questo contesto è il contesto “predefinito” che si trova alla base dello spazio dei nomi URL del server Web, questo percorso sarà una stringa vuota. Altrimenti, se il contesto non è rootato nella radice dello spazio dei nomi del server, il percorso inizia con un carattere / ma non termina con un carattere /.
  • Percorso servlet: la sezione del percorso che corrisponde direttamente alla mapping che ha triggersto questa richiesta. Questo percorso inizia con un carattere ‘/’ tranne nel caso in cui la richiesta sia abbinata al modello ‘/ *’ o “”, nel qual caso è una stringa vuota.
  • PathInfo: la parte del percorso della richiesta che non fa parte del percorso di contesto o del percorso del servlet. È nullo se non esiste alcun percorso aggiuntivo o è una stringa con un ‘/’ iniziale.

I seguenti metodi esistono nell’interfaccia HttpServletRequest per accedere a queste informazioni:

  • getContextPath
  • getServletPath
  • getPathInfo

È importante notare che, ad eccezione delle differenze di codifica URL tra l’URI della richiesta e le parti del percorso, la seguente equazione è sempre vera:

 requestURI = contextPath + servletPath + pathInfo 

Ciò significa che devi solo usare @WebServlet(urlPatterns={"/posts"}) , e quindi decodificare manualmente la parte pathInfo per estrarre comandi e parametri

Penso che non puoi farlo utilizzando solo l’annotazione @WebServlet . UrlPatterns funge solo da direttiva al Servlet per indicare quali modelli di URL devono essere presenti. E come puoi vedere da questi documenti https://docs.oracle.com/javaee/6/api/javax/servlet/annotation/WebServlet.html il valore è proprio il caso in cui urlPatterns è una stringa invece di una matrice di essi . Come affermato brso05, sarà necessario analizzare dalla richiesta i parametri.