Różnica między / i/ * we wzorcu URL mapowania serwleta

Znany kod:

<servlet-mapping>
    <servlet-name>main</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

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

Rozumiem, że /* mapuje do http://host:port/context/*.

A może /? Na pewno nie mapuje tylko do http://host:port/context root. W rzeczywistości zaakceptuje http://host:port/context/hello, ale odrzuci http://host:port/context/hello.jsp.

Czy ktos moze wyjasnic jak to jest http://host:port/context/hello mapowane?

Author: BalusC, 2010-11-10

5 answers

<url-pattern>/*</url-pattern>

/* na serwletie nadpisuje wszystkie inne serwlety, w tym wszystkie serwlety dostarczone przez servletcontainer, takie jak domyślny servlet i servlet JSP. Cokolwiek wystrzelisz, skończy się w serwletie. Jest to więc zły wzór URL dla serwletów. Zazwyczaj chcesz użyć /* na Filter tylko. Jest w stanie pozwolić, aby żądanie było kontynuowane do dowolnego serwleta nasłuchującego na bardziej określonym wzorze adresu URL, wywołując FilterChain#doFilter().

<url-pattern>/</url-pattern>

/ nie nadpisuje żadnego innego servletu. Zastępuje on tylko wbudowany w servletcontainer domyślny servlet dla wszystkich żądań, który nie pasuje do żadnego innego zarejestrowanego servleta. Jest to zwykle wywoływane tylko na statycznych zasobach (CSS / JS / image / etc) i na listach katalogów. Wbudowany w servletcontainer domyślny servlet jest również zdolny do obsługi żądań pamięci podręcznej HTTP, przesyłania strumieniowego multimediów (audio / wideo) i wznawiania pobierania plików. Zazwyczaj nie chcesz nadpisać domyślny serwlet, ponieważ w przeciwnym razie musisz zająć się wszystkimi jego zadaniami, co nie jest trywialne (JSF utility library OmniFaces ma open source przykład ). Jest to zatem również zły wzór URL dla serwletów. Co do tego, dlaczego strony JSP nie trafiają w ten servlet, to dlatego, że servletcontainer wbudowany servlet JSP zostanie wywołany, który jest już domyślnie mapowany na bardziej specyficznym wzorze adresu URL *.jsp.

<url-pattern></url-pattern>

Wtedy jest też pusty ciąg URL wzór . This will be invoked when the context root is requested. This is different from the <welcome-file> podejście, że nie jest wywoływany, gdy żądany jest dowolny podfolder. Jest to najprawdopodobniej wzorzec URL, którego szukasz w przypadku, gdy chcesz "Strona główna servlet". Muszę tylko przyznać, że intuicyjnie oczekiwałem pustego ciągu URL wzór i Ukośnik URL wzór / być zdefiniowane dokładnie na odwrót, więc mogę zrozumieć, że wiele osób zaczęło się pomylić na tym. Ale jest jak jest.

Front Controller

W przypadku, gdyfaktycznie zamierzasz mieć serwlet kontrolera przedniego, najlepiej odwzoruj go na bardziej specyficznym wzorze URL, takim jak *.html, *.do, /pages/*, /app/*, itd. Możesz ukryć wzorzec URL kontrolera przedniego i przykryć statyczne zasoby na wspólnym wzorzec URL, takim jak /resources/*, /static/*, itp. za pomocą filtra servleta. Zobacz także Jak zapobiec statycznym zasobom z obsługi przez serwlet kontrolera przedniego który jest mapowany na / * . Należy zauważyć, że Spring MVC ma wbudowany statyczny serwlet zasobów, dlatego możesz mapować jego przedni kontroler na /, jeśli skonfigurujesz wspólny wzorzec URL dla statycznych zasobów w Spring. Zobacz także jak obsługiwać statyczną zawartość w Spring MVC?

 231
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:09

Chciałbym uzupełnić odpowiedź Balusca o zasady mapowania i przykład.

Zasady mapowania ze specyfikacji Servlet 2.5:

  1. Dokładny Adres URL Mapy
  2. Mapa wieloznaczne ścieżki
  3. rozszerzenia Map
  4. Mapuj do domyślnego servletu

W naszym przykładzie są trzy serwlety. / jest domyślnym servletem zainstalowanym przez nas. Tomcat instaluje dwa serwlety do obsługi jsp i jspx. Więc do map http://host:port/context/hello

  1. brak zainstalowanych serwletów URL, następny.
  2. No wildcard paths Servlets installed, next.
  3. nie pasuje do żadnych rozszerzeń, następny.
  4. Mapuj do domyślnego servletu, return.

Do mapy http://host:port/context/hello.jsp

  1. no exact URL servlets installed, next.
  2. No wildcard paths Servlets installed, next.
  3. znaleziono rozszerzenie servlet, return.
 40
Author: Candy Chiu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-29 16:12:23

Być może musisz też wiedzieć, jak mapowane są adresy URL, ponieważ cierpiałem 404 przez wiele godzin. Istnieją dwa rodzaje obsługi wniosków. BeanNameUrlHandlerMapping i SimpleUrlHandlerMapping. Kiedy zdefiniowaliśmy servlet-mapping, używamy SimpleUrlHandlerMapping. Jedną rzeczą, którą musimy wiedzieć, jest to, że te dwa manipulatory mają wspólną właściwość o nazwie alwaysUseFullPath, która domyślnie wynosi false.

false oznacza to, że Spring nie użyje pełnej ścieżki do zmapowania adresu url do kontrolera. Co to znaczy? Oznacza to, że gdy zdefiniujesz servlet-mapping:

<servlet-mapping>
    <servlet-name>viewServlet</servlet-name>
    <url-pattern>/perfix/*</url-pattern>
</servlet-mapping>

Opiekun użyje części *, aby znaleźć kontroler. Na przykład, następujący kontroler będzie napotkał błąd 404, gdy zażądasz go za pomocą /perfix/api/feature/doSomething

@Controller()
@RequestMapping("/perfix/api/feature")
public class MyController {
    @RequestMapping(value = "/doSomething", method = RequestMethod.GET) 
    @ResponseBody
    public String doSomething(HttpServletRequest request) {
        ....
    }
}
To idealne dopasowanie, prawda? Ale dlaczego 404. Jak wspomniano wcześniej, domyślną wartością alwaysUseFullPath jest false, co oznacza, że w Twoim zapytaniu tylko /api/feature/doSomething jest używane do znalezienia odpowiedniego kontrolera, ale żaden kontroler nie dba o tę ścieżkę. Musisz zmienić adres URL na /perfix/perfix/api/feature/doSomething lub usunąć perfix z bazy MyController @RequestingMapping.
 18
Author: hakunami,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-23 02:52:59

Myślę, że odpowiedź Candy jest w większości poprawna. Myślę, że jest jeszcze jedna mała część.

Do mapowania hosta: port / context / hello.jsp

  1. no exact URL servlets installed, next.
  2. Found wildcard paths servlets , return.

Uważam, że dlaczego "/ * "nie pasuje do host:port/context/hello, ponieważ traktuje "/ hello " jako ścieżkę zamiast pliku (ponieważ nie ma rozszerzenia).

 7
Author: hehe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-14 09:41:43

Zasadnicza różnica pomiędzy /* i / jest taka, że servlet z mapowaniem /* zostanie wybrany przed serwletem z mapowaniem rozszerzenia (jak *.html), podczas gdy servlet z mapowaniem / zostanie wybrany dopiero po rozważeniu mapowania rozszerzenia (i będzie używany dla każdego żądania, które nie pasuje do niczego innego- - - jest to "domyślny servlet").

W szczególności mapowanie /* będzie zawsze zaznaczone przed mapowaniem /. Posiadanie albo uniemożliwia jakiekolwiek żądania od dotarcia do domyślnego serwletu kontenera.

Albo będą wybierane tylko po mapowaniu serwletów, które są dokładnymi dopasowaniami (jak /foo/bar) i tymi, które są mapowaniami ścieżek dłuższymi niż /* (jak /foo/*). Zwróć uwagę, że odwzorowanie pustego ciągu jest dokładnie dopasowane do głównego kontekstu (http://host:port/context/).

Patrz rozdział 12 specyfikacji Java Servlet, dostępnej w wersji 3.1 pod adresem http://download.oracle.com/otndocs/jcp/servlet-3_1-fr-eval-spec/index.html .

 0
Author: Robert Tupelo-Schneck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-27 20:49:00