• 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

Object Storage Arubacloud
0 głosów
238 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,710 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 288 wizyt
0 głosów
0 odpowiedzi 291 wizyt
pytanie zadane 10 maja 2018 w Java przez m_rience Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 194 wizyt
pytanie zadane 3 sierpnia 2017 w Java przez Jonki Dyskutant (8,180 p.)

92,555 zapytań

141,402 odpowiedzi

319,537 komentarzy

61,938 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...