• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Nie wyszukuje pliku resources? Próba wyświetlenia obrazka z folderu - SPRING

VPS Starter Arubacloud
0 głosów
227 wizyt
pytanie zadane 9 października 2018 w Java przez must Bywalec (2,980 p.)
edycja 9 października 2018 przez must

Cześć. Chciałbym wyświetlić obrazek z folderu recources/images. 

Dodałem 

<mvc:resources location="/resources/" mapping="/resource/**"/>

do pliku konfiguracyjnego.

Tak wygląda mój pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.packt</groupId>
    <artifactId>webstore</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <warSourceDirectory>webapp</warSourceDirectory>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Hierarchia folderów wygląda tak: 

Gdy wpisuje: http://localhost:8080/resource/images/P1234.png

Wywala mi po prostu błąd: 

09-Oct-2018 09:37:01.219 WARNING [http-nio-8080-exec-9] org.springframework.web.servlet.DispatcherServlet.noHandlerFound No mapping found for HTTP request with URI [/resource/images/P1234.png] in DispatcherServlet with name 'DefaultServlet'

Wiecie co powinienem poprawić? Próbowałem już kilka konfiguracji lokacji folderu ze zdjęciami ale ze skutkiem marnym.

1 odpowiedź

+1 głos
odpowiedź 9 października 2018 przez mbabane Szeryf (79,280 p.)
wybrane 9 października 2018 przez must
 
Najlepsza

Dzieje się tak, ponieważ DsipatcherServlet domyślnie wszystkie żądania próbuje powiązać z metodą kontrolera i nie wie że stosując P1234.png odwołujesz się do statycznego pliku.

W xml w konfiguracji trzeba zdaje się dodać coś takiego:

 <mvc:default-servlet-handler/>

Na marginesie, ucz się konfiguracji Springa w Javie nie w XML.

A zdjęcia, które mają być dostępne z przeglądarki, raczej należy umieszczać w WEB-INF niż w src.

Jedna rzecz jeszcze. Powiedz czy Ty coś widzisz na tym screenie bo ja nic, można przecież wkleić kod konfiguracji w bloki code, a do hierarchii wstawić mały obrazek z samym panelem bocznym intellij'a).

komentarz 9 października 2018 przez mbabane Szeryf (79,280 p.)
A czy jest coś innego napisane (merytorycznie)?
komentarz 9 października 2018 przez Wiciorny Ekspert (269,120 p.)

no ty mu sugerujesz  blad w konfiguracji pakietowow i zależności, a nie po prostu sugerujesz napisac KLASE- do obslugi zapytania URL... co wystarcza w tym wypadku , a nie rozumiem co masz na mysli "merytorycznie" 

też jak sie mam czepiac to nie merytoryczne jest  stwierdzenie 

 DsipatcherServlet domyślnie wszystkie żądania próbuje powiązać z metodą kontrolera

z metodami, on wysyla je do kontenera- który przechowuje wszystkie controlery aplikacji, a kolega chyba tego controlera nie ma po prostu :) wiec zadanie  do kontrolera DS trafia ale dalej nie ma jak byc pokierowane do obslugi 

 

Na marginesie, ucz się konfiguracji Springa w Javie nie w XML.

 zależy komu i co jest potrzebne, ale z góry nie mozesz zakladac ze konfiguracja w XML JEST PASE i sie nie powinno jej uczyc :) 

komentarz 9 października 2018 przez mbabane Szeryf (79,280 p.)

Czy Ty wiesz na czym w ogóle polega ten błąd? Mam wrażenie, że nie wiesz o co tutaj chodzi.

Chodzi o to że tak jak piszesz, domyślnie DS żądanie przekierowuje do klasy kontrolera. Natomiast jeśli chcesz się odwołać do statycznego zasobu np. własnie obrazu to DS również próbuje np. adres:

http://localhost:8080/resource/images/P1234.png

zamienić na (niedosłownie oczywiście):

@Controller
public class Controller
{
       @GetMapping("/resource/images/P1234.png")
         public String method()
          {
              return "cosTam"
          }
}

Chodzi o to że po pierwsze nie ma takiego kontrolera (czy to z mapowanego URL), a po drugie nie taki jest cel tego żądania. Celem jest pobranie statycznego obrazu z zadanej lokalizacji.

Dlatego wymagana jest dodatkowa konfiguracja, która zapobiega przekierowywaniu wszystkiego do klas kontrolerów. W Javie robi się to tak (nadpisując metodę interfejsu WebMvcConfigurer):

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

w XML tak:

<mvc:default-servlet-handler/>

Dodatkowo, jest jeszcze kwestia mapowania adresu na odpowiedni zasób. Trzeba zatem zmapować URL na zasób w tym przypadku tak:

<mvc:resources mapping="/resources/**" location="classpath:/resources/images/"/>

Gdy się tego nie zrobi to zwróci 404 bo nie znajdzie zasobu.

 

Gdybyś zrobił to poprzez kontroler czyli np. tak:

@Controller
public class Controller
{
       @GetMapping("/resource/images/P1234.png")
         public String method()
          {
              return "/resource/images/P1234.png"; //pomijając już fakt że jest to resources
          }
}

To już kłopotliwe może być zwrócenie samego obrazu png trzeba to chyba zwracać jako tablicę bajtów (ale tutaj nie wiem dokładnie), a po drugie to ViewResolver zrobi robotę, bo zwracając zasób dodaje przed adres prefix i suffix. I druga rzecz powodzenia jeśli na serwerze jest więcej statycznej treści i każdą z osobna mapować w kontrolerze...

komentarz 9 października 2018 przez must Bywalec (2,980 p.)

Dokłądnie tak jak mbabane mówi.

Niestety nie podziałało dodanie 

location="classpath:/resources/images/

Spróbowałem stworzyć folder resources w WEB-INF tak jak mówiłeś, czyli linijka wyglądała by tak:

<mvc:resources location="/resources/" mapping="/resource/**"/>

Zniknęło "message", natomiast błąd ten sam.

Dodam, że w konsoli nie ma napisanego błędu, że nie ma mapowania.

komentarz 9 października 2018 przez mbabane Szeryf (79,280 p.)

jeśli w WEB-INF to w location zdaje się też musi być on uwzględniony:

<mvc:resources location="/WEB-INF/resources/"

Podobne pytania

+1 głos
0 odpowiedzi 283 wizyt
0 głosów
0 odpowiedzi 287 wizyt
pytanie zadane 10 maja 2018 w Java przez m_rience Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 193 wizyt
pytanie zadane 3 sierpnia 2017 w Java przez Jonki Dyskutant (8,180 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...