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

Controller nie wywołuje mi strony

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
1,839 wizyt
pytanie zadane 26 marca 2017 w Java przez Jonki Dyskutant (8,180 p.)

Posiadam w resources w folderze templates folder login.html. Chciałbym tą stronę wywołać metodą w kontrolerze

@ResponseBody
    @RequestMapping(value = "login", method = RequestMethod.GET)
    public String company() {
        return "login";
    }

jednak zamiast wywołać stronę, to wypisuje mi na stronie tekst "login".

komentarz 26 marca 2017 przez Maniti Obywatel (1,220 p.)

3 odpowiedzi

0 głosów
odpowiedź 26 marca 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Adonotacja @ResponseBody powoduje że zwracany jest string login zamiast strony.
komentarz 26 marca 2017 przez Jonki Dyskutant (8,180 p.)

Zmieniłem na 

@RestController
public class Company {

    @RequestMapping(value = "login", method = RequestMethod.GET)
    public String company() {
        return "login";
    }
}

i dalej to samo.

komentarz 26 marca 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Masz restcontroller. Jesli chcesz aby zwracal ci strone zmien na zwykly controller.

Api restowe nie zwraca danych w formie pliku html.
komentarz 26 marca 2017 przez Jonki Dyskutant (8,180 p.)

Doszedłem do momentu, gdy mam 

@Controller
public class Company {
 
    @RequestMapping("login")
    public ModelAndView company(ModelAndView model) {
        model.addObject("login");
        return model;
    }
}

i przy próbie wejścia pod ten adres wywalą wyjątek

javax.servlet.ServletException: Circular view path [login]: would dispatch back to the current handler URL [/login] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)

 

0 głosów
odpowiedź 26 marca 2017 przez Jonki Dyskutant (8,180 p.)

Doszedłem do momentu, gdy mam 

@Controller
public class Company {
 
    @RequestMapping("login")
    public ModelAndView company(ModelAndView model) {
        model.addObject("login");
        return model;
    }
}

i przy próbie wejścia pod ten adres wywalą wyjątek

javax.servlet.ServletException: Circular view path [login]: would dispatch back to the current handler URL [/login] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.
komentarz 27 marca 2017 przez ShiroUmizake Nałogowiec (46,300 p.)
Czy miałeś w ogóle do czynienia serveletami?

Jeżeli nie to bięgnę z pomocą:

Controler nie serwuje treści, controler mówi co ma się stać (mówiąc prościej odpowiada za logikę typowo "ruchową" do odpowiednich serveletów)

Servelet, jest "wątkiem webowym" rozszerzanym o klasę httpServlet, obsługiwanym po przez Server. To on odpowiada za widok odpowiadając na request oraz response.

Błąd jasno ci wskazuje, że nie może znależć serveletu do którego ma wskazać Controler...
0 głosów
odpowiedź 27 marca 2017 przez K0XM4N Gaduła (3,640 p.)

Zacznijmy od początku. 

Aby w springu MVC zwrócić stronę po wejściu na dany adres musisz rozróżnić kilka adnotacji i to w jaki sposób działa sam spring.
Gdy definujesz sobie klasę kontrolera może ona zawierać adnotacje @Controller lub @RestController.
Adnotacja @Controller pozwoli Ci manipulować widokami, czyli efekt który chcesz uzyskać. Gdzieś tam niżej zdefiniowałeś sobie @RestController i jak Mateusz51 wspomniał jest to kontroller RESTowy. Co to znaczy? TO znaczy, ze zwracasz dane z metody kontrolera, a nie widoki. Poczytaj sobie o RESTcie, na pewno Ci się przyda gdy będziesz pisać aplikacje w springu.

Idąc dalej. @RequestBody nad metodą mówi springowi: hej! teraz chce zebyś zwracała mi dane, a nie jakieś widoki.
 

By otrzymać widok z konkretnej metody w kontrolerze musisz:

  • zadeklarować odpowiedni mapping na tą metode (czyli adres URL) czyli: @RequestMapping("/login")
    i wtedy wchodzisz na ten adres. Jeśli chesz otrzymać stronę to powinieneś użyć @GetMapping. Wtedy od razu określasz typ metody HTTP jako: GET
  • zwrócić String, który odpowiada nazwie twojego widoku html, jsp etc.

Dlaczego tak? Zachodzi wtedy taka komunikacja:

Controller -> View Resolver -> Model

Tak w skrócie to:
Kontroler wysyła stringa do view resolvera. Następnie view resolver rozpoznaje stringa i kojarzy go z stroną html, zwraca widok i przesyła go dalej do modelu. W tym momencie model generuje Ci konkretny widok. 

komentarz 27 marca 2017 przez Jonki Dyskutant (8,180 p.)

Mam teraz

@Controller
public class Company {
 
    @RequestMapping("/login")
    public ModelAndView company() {
        return new ModelAndView("login");
    }
}

a mimo to https://zapodaj.net/d0924bcd48762.png.html

komentarz 27 marca 2017 przez K0XM4N Gaduła (3,640 p.)
edycja 27 marca 2017 przez K0XM4N

@Controller

public class Company {

  

    @RequestMapping("/login")

    public ModelAndView company() {

        return new ModelAndView("login");

    }

}

Popatrz na typy. Potrzebujesz zwrócić w metodzie Stringa.

 

@Controller
public class Company {
  
    @RequestMapping("/login")
    public String company() {
        return "login";
    }
}

 

Podobne pytania

0 głosów
0 odpowiedzi 282 wizyt
pytanie zadane 3 marca 2019 w Java przez must Bywalec (2,980 p.)
0 głosów
1 odpowiedź 285 wizyt
pytanie zadane 3 marca 2019 w Java przez must Bywalec (2,980 p.)
0 głosów
0 odpowiedzi 317 wizyt
pytanie zadane 26 listopada 2018 w Nasze projekty przez mycha Nowicjusz (140 p.)

93,440 zapytań

142,431 odpowiedzi

322,678 komentarzy

62,802 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

...