Zajmuję się tworzeniem aplikacji internetowej przy użyciu Spring MVC 3 i DispatcherServlet
przechwytywanie wszystkich żądań do „/” w ten sposób (web.xml):
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Teraz działa to tak, jak w reklamie, ale jak mogę obsługiwać zawartość statyczną? Wcześniej przed użyciem adresów URL RESTful wychwyciłem na przykład wszystkie pliki * .html i wysłałem je do DispatcherServlet
, ale teraz jest inna gra w piłkę.
Mam folder / static /, który zawiera / styles /, / js /, / images / etc i chciałbym wykluczyć / static / * z DispatcherServlet
.
Teraz mogłem uruchomić statyczne zasoby, kiedy to zrobiłem:
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app/</url-pattern>
</servlet-mapping>
Ale chcę, żeby miał ładne adresy URL (chodzi mi o to, że korzystam z Spring MVC 3), a nie o stronę docelową, którą jest www.domain.com/app/
Nie chcę też rozwiązania połączonego z tomcat lub innym kontenerem serwletów, a ponieważ jest to (stosunkowo) mały ruch, nie potrzebuję serwera WWW (takiego jak apache httpd) przed.
Czy istnieje na to czyste rozwiązanie?
źródło
Odpowiedzi:
Ponieważ spędziłem dużo czasu na tej kwestii, pomyślałem, że podzielę się moim rozwiązaniem. Od wiosny 3.0.4 wywoływany jest parametr konfiguracyjny
<mvc:resources/>
(więcej o tym na stronie z dokumentacją referencyjną ), który może być używany do obsługi zasobów statycznych przy jednoczesnym użyciu DispatchServlet w katalogu głównym witryny.Aby tego użyć, użyj struktury katalogów, która wygląda następująco:
Zawartość plików powinna wyglądać następująco:
src / springmvc / web / HelloWorldController.java:
WebContent / WEB-INF / web.xml:
WebContent / WEB-INF / springmvc-servlet.xml:
WebContent / jsp / index.jsp:
Mam nadzieję że to pomoże :-)
źródło
Ten problem został rozwiązany wiosną 3.0.4. ZWOLNIENIE, w którym można użyć
<mvc:resources mapping="..." location="..."/>
elementu konfiguracyjnego w pliku konfiguracyjnym programu uruchamiającego wiosnę .Sprawdź dokumentację wiosenną
źródło
W Spring 3.0.x dodaj następujące elementy do pliku servlet-config.xml (plik skonfigurowany w pliku web.xml jako contextConfigLocation. Musisz również dodać przestrzeń nazw mvc, ale po prostu google, jeśli nie wiesz jak !;)
To działa dla mnie
pozdrowienia
Ayub Malik
źródło
Jeśli dobrze rozumiem twój problem, myślę, że znalazłem rozwiązanie twojego problemu:
Miałem ten sam problem, w którym wyświetlane były surowe dane wyjściowe bez stylów css, skryptów javascript lub plików jquery.
Właśnie dodałem mapowania do „domyślnego” serwletu. Do pliku web.xml dodano:
Powinno to odfiltrować żądania plików javascript i css z obiektu DispatcherRequest.
Znów nie jestem pewien, czy tego właśnie szukasz, ale dla mnie to zadziałało. Myślę, że „default” to nazwa domyślnego serwletu w JBoss. Nie jestem pewien, co to jest dla innych serwerów.
źródło
<url-pattern>
tagi w tym samym<servlet-mapping>
Jest jeszcze jeden słupek przepełnienia stosu, który ma doskonałe rozwiązanie .
Nie wydaje się być specyficzny dla Tomcata, jest prosty i działa świetnie. Wypróbowałem kilka rozwiązań w tym poście z wiosenną wersją mvc 3.1, ale potem miałem problemy z udostępnieniem mojej zawartości dynamicznej.
Mówiąc krótko, dodaje mapowanie serwletu w następujący sposób:
źródło
Znalazłem sposób na obejście tego za pomocą filtra urlrewrite Tuckeya. Jeśli masz taką odpowiedź, podaj lepszą odpowiedź!
W pliku web.xml:
W pliku urlrewrite.xml:
Oznacza to, że każdy uri z „.” w nim (na przykład style.css) nie zostanie przepisany.
źródło
<mvc:resources/>
, jak pokazał @Joris.Właśnie zmagałem się z tym problemem w Spring MVC 3.0 i początkowo wybrałem opcję UrlRewriteFilter. Jednak nie byłem zadowolony z tego rozwiązania, ponieważ „nie czułem się dobrze” (nie jestem jedyny - zobacz powyższy link do wiosennych forów, na których słowo „hack” pojawia się kilka razy).
Wymyśliłem więc podobne rozwiązanie do powyższego „Nieznany (Google)”, ale pożyczyłem pomysł, aby wszystkie statyczne treści były podawane z / static / (wzięte z wersji Spring Roo aplikacji Pet Store). „Domyślny” serwlet nie działał dla mnie, ale działał ResourceServlet Spring Webflow (również pobrany z aplikacji generowanej przez Spring Roo).
Web.xml:
Jedyną zmianą, którą wprowadziłem do stron JSP, było dodanie / static / path do adresów URL dla CSS, JS i obrazów. Np. „$ {PageContext.request.contextPath} /static/css/screen.css”.
dla użytkowników Maven zależność dla „org.springframework.js.resource.ResourceServlet” wynosi:
źródło
Moje własne doświadczenia z tym problemem są następujące. Większość stron i książek związanych ze wiosną wydaje się sugerować, że najbardziej odpowiednia składnia jest następująca.
Powyższa składnia sugeruje, że możesz umieścić swoje zasoby statyczne (CSS, JavaScript, obrazy) w folderze o nazwie „zasoby” w katalogu głównym aplikacji, tj. / Webapp / resources /.
Jednak z mojego doświadczenia (używam Eclipse i wtyczki Tomcat), jedyne podejście, które działa, to umieszczenie folderu zasobów w WEB_INF (lub META-INF). Polecam więc następującą składnię.
Na stronie JSP (lub podobnej) odwołaj się do zasobu w następujący sposób.
Nie trzeba dodawać, że całe pytanie powstało tylko dlatego, że chciałem, aby mój serwlet dyspozytorski Spring (kontroler frontowy) przechwytywał wszystko, wszystko dynamiczne, to znaczy. Więc mam następujące w moim pliku web.xml.
Wreszcie, ponieważ korzystam z bieżących najlepszych praktyk, mam następujące serwlety kontrolera xml (patrz wyżej).
I mam następujące w mojej rzeczywistej implementacji kontrolera, aby upewnić się, że mam domyślną metodę obsługi wszystkich przychodzących żądań.
Mam nadzieję, że to pomoże.
źródło
Mam ten sam problem i uważam, że odpowiedź Jorisa była bardzo pomocna. Ale dodatkowo muszę dodać
do pliku konfiguracyjnego serwletu. Bez tego mapowanie zasobów nie będzie działać, a wszystkie programy obsługi przestaną działać. Mam nadzieję, że to komuś pomoże.
źródło
URLRewrite to swego rodzaju „hack”, jeśli chcesz to tak nazwać. Wszystko sprowadza się do tego, że od nowa wymyślasz koło; ponieważ istnieją już rozwiązania. Inną rzeczą do zapamiętania jest Http Server = zawartość statyczna i serwer aplikacji = zawartość dynamiczna (w taki sposób zostały zaprojektowane). Przenosząc odpowiednie obowiązki na każdy serwer, maksymalizujesz wydajność ... ale obecnie jest to prawdopodobnie tylko problem w środowiskach o krytycznym znaczeniu i coś takiego jak Tomcat najprawdopodobniej działałoby dobrze w obu rolach przez większość czasu; ale nadal należy o tym pamiętać.
źródło
Rozwiązałem to w ten sposób:
Działa to na Tomcat i oczywiście Jboss. Jednak ostatecznie zdecydowałem się skorzystać z rozwiązania zapewnianego przez Spring (jak wspomniano przez rozky), które jest znacznie bardziej przenośne.
źródło
Użyłem obu sposobów, czyli urlrewrite i adnotacji opartych na wersji wiosennej mvc 3.0.x, i odkryłem, że podejście oparte na adnotacjach jest najbardziej odpowiednie, to znaczy
Tak więc podejście oparte na adnotacjach będzie dobrym rozwiązaniem.
źródło
Od wiosny 3 wszystkie zasoby muszą być mapowane w inny sposób. Musisz użyć znacznika, aby określić lokalizację zasobów.
Przykład:
Postępując w ten sposób, kierujesz serwletem programu rozsyłającego, aby sprawdził zasoby katalogu w poszukiwaniu zawartości statycznej.
źródło
Moim sposobem rozwiązania tego problemu jest umieszczenie wszystkich swoich działań z określonym prefiksem, takim jak „web” lub „service” i skonfigurowanie, aby wszystkie adresy URL z tym prefiksem były przechwytywane przez DispatcherServlet.
źródło
Właśnie dodałem trzy reguły przed wiosną domyślną regułą (/ **) do urlrewritefilter Tuckeya (urlrewrite.xml), aby rozwiązać problem
źródło
Wiem, że istnieje kilka konfiguracji używania zawartości statycznej, ale moje rozwiązanie polega na tym, że po prostu tworzę zbiorczy folder aplikacji sieciowej w twoim kocurku. Ta „masowa aplikacja internetowa” obsługuje tylko całą zawartość statyczną bez udostępniania aplikacji. Jest to bezbolesne i łatwe rozwiązanie do podawania statycznych treści do rzeczywistej wiosennej aplikacji internetowej.
Na przykład używam dwóch folderów aplikacji internetowych na moim tomcat.
Jeśli chcę użyć javascript, po prostu dodaję identyfikator URI do mojego pliku javascript.
EX> /resources/path/to/js/myjavascript.js
W przypadku obrazów statycznych używam tej samej metody.
EX> /resources/path/to/img/myimg.jpg
Na koniec postawiłem „ ograniczenie bezpieczeństwa koniec ” na moim kocurku, aby zablokować dostęp do rzeczywistego katalogu. Ustawiam rolkę użytkownika „none” na ograniczenie, aby strona generowała „błąd 403 zabroniony”, gdy ludzie próbowali uzyskać dostęp do ścieżki zawartości statycznej.
Jak dotąd działa dla mnie bardzo dobrze. Zauważyłem również, że wiele popularnych stron internetowych, takich jak Amazon, Twitter i Facebook, używają różnych URI do udostępniania treści statycznych. Aby się tego dowiedzieć, kliknij prawym przyciskiem myszy dowolną treść statyczną i sprawdź jej identyfikator URI.
źródło
To zrobiło prawdziwą robotę w moim przypadku
w pliku web.xml:
...
źródło
W przypadku wiosennej konfiguracji opartej na języku Java można użyć następujących opcji
Korzystanie z ResourceHandlerRegistry która przechowuje rejestracje procedur obsługi zasobów do obsługi zasobów statycznych.
Więcej informacji @ WebMvcConfigurerAdapter, który definiuje metody wywołania zwrotnego w celu dostosowania konfiguracji opartej na Javie dla Spring MVC włączonej przez @EnableWebMvc.
źródło
Po spotkaniu i przejściu tego samego procesu decyzyjnego opisanego tutaj, zdecydowałem się na propozycję ResourceServlet, która działa całkiem nieźle.
Zwróć uwagę, że więcej informacji na temat korzystania z przepływu w procesie kompilacji maven znajduje się tutaj: http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch01s05.html
Jeśli używasz standardowego centralnego repozytorium Maven, artefaktem jest (w przeciwieństwie do wyżej wspomnianego pakietu źródeł źródłowych):
źródło
Można to osiągnąć na co najmniej trzy sposoby.
Rozwiązania :
Aby uzyskać pełne przykłady kodu, jak to osiągnąć, proszę odnieść się do mojej odpowiedzi w innym poście: Jak mapować żądania do pliku HTML w Spring MVC?
źródło
Problem dotyczy URLPattern
Zmień wzorzec adresu URL w mapowaniu serwletu z „/” na „/ *”
źródło
a jeśli chcesz użyć konfiguracji opartej na adnotacjach, użyj poniższego kodu
źródło
Umieść zawartość statyczną, taką jak css, js w następującej ścieżce
źródło