Domanda

Sto provando a scrivere un'applicazione web usando SpringMVC. Normalmente mapperei solo alcune estensioni di file inventate sul front controller di Spring e vivrei felicemente, ma questa volta vado per URL simili a REST, senza estensioni di file.

Mappare tutto sotto il mio percorso contestuale al front controller (chiamiamolo " app ") significa che dovrei occuparmi anche dei file statici, cosa che preferirei non fare (perché reinventare l'ennesimo weel?), quindi una combinazione con il servlet predefinito di tomcat (chiamiamolo " tomcat ") sembra essere la strada da percorrere.

Ho fatto funzionare la cosa facendo qualcosa del genere

<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>tomcat</servlet-name>
  <url-pattern>*.ext</url-pattern>
</servlet-mapping>

e ripetendo quest'ultima per ciascuna delle estensioni di file del mio contenuto statico. Mi chiedo solo perché le seguenti configurazioni, che per me sono equivalenti a quella sopra, non funzionano.

<!-- failed attempt #1 -->
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>tomcat</servlet-name>
  <url-pattern>*.ext</url-pattern>
</servlet-mapping>

<!-- failed attempt #2 -->
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>tomcat</servlet-name>
  <url-pattern>/some-static-content-folder/*</url-pattern>
</servlet-mapping>

Qualcuno può far luce?

È stato utile?

Soluzione

Penso di sapere cosa sta succedendo.

Nel tuo web.xml funzionante hai impostato il servlet come servlet predefinito (/ di per sé è il servlet predefinito chiamato se non ci sono altre corrispondenze), risponderà a qualsiasi richiesta che non corrisponde ad un'altra mappatura.

In Failed 1 la tua mappatura / * sembra essere una mappatura di percorso valida. Con la mappatura / * in web.xml risponde a tutte le richieste tranne le altre mappature del percorso. Secondo la specifica, i mapping delle estensioni sono mapping impliciti che vengono sovrascritti da mapping espliciti. Ecco perché la mappatura dell'estensione non è riuscita. Tutto è stato esplicitamente mappato sull'app.

In Failed 2, l'app è responsabile di tutto, tranne i contenuti che corrispondono alla mappatura dei contenuti statici. Per mostrare cosa sta succedendo nel test rapido che ho impostato. Ecco un esempio / some-static-content-folder / contiene test.png

Sto provando ad accedere a test.png Ho provato:

/some-static-content-folder/test.png

e il file non è stato trovato. Comunque provando

/some-static-content-folder/some-static-content-folder/test.png

si presenta. Quindi sembra che il servlet predefinito Tomcat (almeno 6.0.16) lasci la mappatura del servlet e proverà a trovare il file usando il percorso rimanente. Secondo questo post Servlet per servire contenuto statico Jetty indica il comportamento che tu ed io ci aspettavamo.

C'è qualche motivo per cui non puoi fare qualcosa come mappare una directory root per le tue chiamate di riposo. Qualcosa come un'app mappata su / rest_root / * di quanto tu sia responsabile di tutto ciò che accade nella cartella rest_root, ma in qualsiasi altro luogo dovrebbe essere gestito da Tomcat, a meno che tu non faccia un'altra mappatura esplicita. Suggerisco di impostare il servlet di riposo su una mappatura del percorso, perché dichiara meglio l'intento. L'uso di / o / * non sembra appropriato, poiché è necessario mappare le eccezioni. Usando SO come esempio, le mie mappe di riposo sarebbero qualcosa come

  

/ users / * per il servlet utente

     

/ posts / * per il servlet dei post

Ordine di mappatura

  1. Explicit (Path mapping)
  2. Implicito (mapping delle estensioni)
  3. Predefinito (/)

Per favore, correggi tutto ciò che ho sbagliato.

Altri suggerimenti

Per riferimento, il tentativo "fallito n. 2" è perfettamente corretto nella versione di Tomcat > = alla 6.0.29.

Era il risultato di un bug Tomcat che veniva corretto nella versione 6.0.29:

https://issues.apache.org/bugzilla/show_bug.cgi? id = 50026

<!-- Correct for Tomcat >= 6.0.29 or other Servlet containers -->
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>/some-static-content-folder/*</url-pattern>
</servlet-mapping>

Non ho mai provato a mappare un servlet come questo, ma direi che / * tecnicamente entrambi iniziano con / e finiscono con / *, anche se lo stesso carattere è usato per entrambi le partite.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top