2014-12-01 18 views
6

Ok, wiem, że jest tutaj 20 takich postów z tym samym problemem, ale żaden z nich nie wydaje mi się pomocny, więc prawdopodobnie będzie to duplikat, ale przeszedłem wszystkie inne posty i żaden z nich nie rozwiązał mojego problemu, więc musi być coś, co robię źle lub nie robię odpowiednich modyfikacji z odpowiedzi na poprzednie pytania.Spring RequestMapping 404 status

Próbuję zrobić małą aplikację przy użyciu Spring, a ja wciąż eksperymentuję z nią, ale spędziłem 4 dni próbując dowiedzieć się, co jest nie tak i po prostu nie mogę. Nadal otrzymuję status HTTP 404 za każdym razem, gdy próbuję odzyskać jsp z kontrolera. Nic, tylko 404 statusu przez Tomcat, nic innego ...

WebAppController:

@Controller 
public class WebAppController { 

    @RequestMapping(value="/login", method = RequestMethod.GET) 
    public String login() { 
     System.out.println("You have entered the login maprequest"); 
     return "test1"; 
    } 

} 

web.xml:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5"> 
    <display-name>Hotel Application</display-name> 
    <servlet> 
     <servlet-name>WebApp</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>WebApp</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
    <welcome-file-list> 
     <welcome-file>login.jsp</welcome-file> 
    </welcome-file-list> 
</web-app> 

webApp.xml:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> 
    <context:component-scan base-package="com.iquestgroup" /> 

    <bean 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix"> 
      <value>/jsp/</value> 
     </property> 
     <property name="suffix"> 
      <value>.jsp</value> 
     </property> 
    </bean> 
</beans> 

Taka konfiguracja robót w prostym projekcie maven tylko z wyżej wymienionym w nim. Problem polega na tym, że dokładnie to samo nie działa w projekcie maven z 3 modułami (persistence, service i webapp). W webappie skopiowałem dokładnie to samo, a kiedy uruchomię go na serwerze, uzyskuję status HTTP 404 ... mimo że moduły budują z powodzeniem.

L.E. Pierwsza część zaakceptowanej odpowiedzi odnosi się do wspólnego błędu mapowania serwerów serwletów popełnionego przez tych, którzy zaczynają od wiosny. Mój problem nie był z nim związany i ostatecznie usunąłem go po wstępnej odpowiedzi. Aby nie stać się kłopotliwe dla czytelników, pierwsza część przyjętej odpowiedź odnosi się do następującego kodu:

<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 
+0

Usunąłeś problem "/ *" poza pytaniem! Teraz odpowiedź nie ma sensu. Mówi, żeby zmienić '/*', ale _to *** nie pojawia się *** w pytaniu. –

+0

@StephenP Pytanie zostało zredagowane po wstępnej odpowiedzi i ogłosiłem to w odpowiedzi na komentarz. Wydaje się bezcelowe, aby zachować/*, mimo że nie był to mój problem i jest wiele innych pytań na temat Stack Overflow, które odnoszą się do tego właśnie. Rozumiem twój punkt widzenia i myślę, że masz rację, może to być mylące, więc dodam wzmiankę o tym na końcu pytania. –

Odpowiedz

6

Zmień

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

do

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

Obecnie Twój odwzorowanym DispatcherServlet jest oznaczony jako obsługujący wszystkie żądania z powodu /*. Oznacza to, że będzie również próbował obsłużyć żądanie wysłane do /WEB-INF/jsp/test1.jsp. Oczywiście nie ma do tego obsługi i zawiedzie.

Wzór / jest wyjątkowy pod tym względem, że jest domyślnym zastępczym, jeśli żaden inny wzór nie pasuje. Jeśli istnieje Servlet odwzorowujący ścieżkę żądania, ten Servlet zostanie wybrany przed mapowaniem DispatcherServlet.

Większość (prawdopodobnie wszystkie) kontenery serwletów są mapowane z Servlet, aby obsłużyć renderowanie stron JSP za pomocą url-pattern z *.jsp. To będzie mieć pierwszeństwo przed twoim DispatcherServlet zmapowanym na /.

Jeśli jesteś nadal uzyskanie 404 po tych zmianach, istnieje kilka możliwości.

Wiosenne logi na poziomie INFO dowolnych metod obsługi (metody z adnotacjami w obrębie fasoli @Controller), które rejestruje. Jeśli nie widzisz żadnego z nich w dziennikach, oznacza to, że Twoja aplikacja internetowa nie została poprawnie wdrożona/pomyślnie.

Jeśli kontener serwletu jest osadzony w IDE, sprawdź odpowiednią kartę/widok zainstalowanych aplikacji. Jeśli jest samodzielny, sprawdź, czy wygenerowany plik .war znajduje się w odpowiednim katalogu i jest poprawnie rozwinięty.

+0

Zmieniłem/na/* z odpowiedzi na inne pytanie podobne do mojego, poprzednio miałem to tak, jak powiedziałeś, ale nadal nie działało. –

+0

@drag Następnie będziemy potrzebować więcej szczegółów. Zmień swoje logi wiosenne na DEBUG, wyślij prośbę i opublikuj wyniki jako zmianę w swoim pytaniu. –

+0

@drag Wyjaśnij także adres URL, do którego wysyłasz prośbę. –

1

Przede wszystkim można słuchać/żądać przy użyciu dowolnego kontrolera root, jak poniżej.

@Controller 
@RequestMapping ("/") 
public class RootCtrl { 

Logger logger = Logger.getLogger(RootCtrl.class); 

@RequestMapping (value = "/", method = {RequestMethod.GET, RequestMethod.POST}) 
public String index(ModelMap model) { 

    // redirect to login page 
    return "redirect:admin/index"; 
}} 

Za pomocą tego kontrolera zamapujesz wszystkie żądania do roota. Następnie możesz przekierować żądanie do swojego kontrolera logowania.

Wszystko zależy od mapowania żądań. Twój loginController lub webController shold nasłuchują żądania, które powinny być określone wcześniej. W mojej aplikacji kontroler logowania nasłuchuje/ścieżek żądań administratora. Następnie mój kontroler logowania wygląda następująco:

@Controller 
@RequestMapping ("/admin") 
public class LoginCtrl { 

@RequestMapping (value = "/index", method = {RequestMethod.GET, RequestMethod.POST}) 
public String index(@RequestParam (value = "captchaId", defaultValue = "") String captchaId, ModelMap model, HttpServletRequest request, HttpServletResponse response) { 

    if(StringUtils.isNullOrEmpty(captchaId)){ 
     captchaId = RandomGUID.getRandomGUID(); 
    } 

    model.addAttribute("captchaId", captchaId); 

    // redirect to login page 
    return "login"; 
} 

Kiedy pojawi się żądanie z tej ścieżki: localhost/SampleProject/admin/index. Mapowania będą działać.

+0

Dziękuję za odpowiedź, ale kontroler był w porządku, nie było to coś bardzo skomplikowanego, tylko sprawdzian, czy wszystko działa poprawnie (i tym razem nie było). Problem polegał na tym, że nie zainstalowałem poprawnie aplikacji, co sugeruje @Sotirios Delimanolis –

Powiązane problemy