web-dev-qa-db-fra.com

Erreur du ressort MVC 404

Je deviens fou et je ne comprends pas quel est le problème:

J'ai la structure suivante: 

SpringMVC
  +WebContent
      -web-inf
        -web.xml
        -springMVC-servlet.xml
      -index.jsp
      -security
           -login.jsp 

web.xml

<display-name>springMVC</display-name> 
<servlet> 
  <servlet-name>springMVC</servlet-name> 
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping>
  <servlet-name>springMVC</servlet-name>
  <url-pattern>*.html</url-pattern>
</servlet-mapping> 
  <servlet-mapping>
  <servlet-name>springMVC</servlet-name>
  <url-pattern>*.do</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
  <servlet-name>springMVC</servlet-name> 
  <url-pattern>/index.html</url-pattern>
</servlet-mapping>
<welcome-file-list> 
  <welcome-file>index.html</welcome-file> 
</welcome-file-list>

springMVC-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xsi:schemaLocation=" http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd     
        http://www.springframework.org/schema/context  
        http://www.springframework.org/schema/context/spring-context-3.0.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd" 
        xmlns:mvc="http://www.springframework.org/schema/mvc"  
        xmlns:aop="http://www.springframework.org/schema/aop" 
        xmlns:context="http://www.springframework.org/schema/context" 
        xmlns:p="http://www.springframework.org/schema/p" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns="http://www.springframework.org/schema/beans"> 

    <context:annotation-config/> 
    <context:component-scan base-package="com.Vanilla.springMVC"/> 

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

</beans>

Mon contrôleur:

package com.Vanilla.springMVC;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.portlet.ModelAndView;

@Controller
public class DefaultController {

    @RequestMapping(value="/index.html", method=RequestMethod.GET)
    public ModelAndView index(){
        ModelAndView mv = new ModelAndView("index");
        return mv;
    }

    @RequestMapping(value="/login.html", method=RequestMethod.GET)
    public ModelAndView loginPage(){
        ModelAndView mv = new ModelAndView("/security/login");
        return mv;
    }
}

Je n'ai aucun problème pour accéder à /index.html

http: // localhost: 8080/SpringMVC/index.html fonctionne parfaitement.

cependant, lorsque je navigue vers http: // localhost: 8080/SpringMVC/login.html , j'ai l'erreur 404.

HTTP Status 404 - /SpringMVC/login.jsp    
type Status report
message /SpringMVC/login.jsp
description The requested resource (/SpringMVC/login.jsp) is not available.

Je ne veux pas déplacer login.jsp au même niveau que index.jsp, mais pourquoi ai-je ce problème?

9
danny.lesnik

HTTP 404 signifie que la ressource est introuvable.

  • Cela signifie que le contrôleur ou une ressource à accès direct (comme un fichier CSS) est introuvable.
  • Cela signifie que NOT signifie que le fichier JSP référencé dans le contrôleur est introuvable (il s'agirait d'une erreur de 500 serveur interne).

Statut HTTP 404 - /SpringMVC/login.jsp 

Il semble que vous envoyiez une requête HTTP /SpringMVC/login.jsp mais que votre méthode de contrôleur soit liée à .html; vous devez donc modifier votre requête HTTP en /SpringMVC/login.html.

En raison du nom (login), votre configuration Spring Security est incorrecte.

2
Ralph

Je vais simplement ajouter ceci ici, car cela résout mon problème 404. Il s'est avéré que mon problème était la valeur url-mapping dans web.xml. Utilisation de Spring WebMVC version org.springframework:spring-webmvc:4.1.6.RELEASE

J'utilisais ce qui suit (qui n'a pas fonctionné):

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

J'aurais dû utiliser la valeur suivante (qui fonctionne):

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

ou

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

Référence: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html

5
Nick Grealy
  1. créez un dossier sous WEB-INF "jsps" pour toutes vos vues et sous "jsps" un dossier "sécurité" pour votre cas. sur ces fichiers. Il est nécessaire pour la sécurité des applications. Pensez à une situation dans laquelle vos JSP donnent des informations personnelles sur votre client et que l'accès doit être accordé/vérifié par votre contrôleur. Si vos fichiers JSP proviennent de WEB-INF, ils sont accessibles avec une demande directement sur eux. 

  2. configurez votre résolveur de vue comme ceci:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
       <property name="prefix" value="/WEB-INF/jsps"/>
       <property name="suffix" value=".jsp"/>
    </bean>

ensuite, placez vos JSP de connexion dans "WEB-INF/jsps/security" et renvoyez "security/login" depuis votre loginPage. 

Désormais, le résolveur de vues recherche les vues sous "WEB-INF/jsps". Comme votre méthode retourne "security/login", le résolveur de vue attend un répertoire sous jsps appelé "security" et un fichier JSP sous celui-ci, appelé "login.jsp" (suffixe = jsp).

2
Erhan Bagdemir

Je soupçonne que ModelAndView mv = new ModelAndView("/security/login"); est où le problème est. Assurez-vous que votre répertoire racine contient un dossier 'security' et qu'il contient un fichier login.jsp. Ou essayez de déplacer le dossier de sécurité dans WebContent

Indiquez le paramètre init contextConfigLocation de votre DispatcherServlet.

 <servlet>
    <servlet-name>appServlet</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
                <init-param>
                        <param-name>contextConfigLocation</param-name>
                        <param-value>/WEB-INF/springMVC-servlet.xml</param-value>
                </init-param>
                <load-on-startup>1</load-on-startup>
        </servlet>
0
gouki

J'utilise Spring MVC avec Eclipse et un système MacOS X et j'ai rencontré une erreur 404 lorsque le contrôleur a renvoyé le nom JSP correct. J'ai plus tard découvert que le fichier jsp problématique ne contenait pas de droit x(execution) sur le système de fichiers. J'ai alors `chmod + x some.jsp 'et le problème est résolu.

0
ZJ Lyu

En ajoutant ceci et juste ici au cas où quelqu'un d'autre serait confronté au même problème. Mon application fonctionnait bien auparavant, puis j'ai mis à niveau la version Spring et, par la même occasion, la version de sécurité Spring. Lorsque j'ai essayé d'accéder à ma page de connexion html, je faisais face à ce problème. J'avais apporté toutes les modifications de configuration nécessaires en raison du changement de version de Spring-Security de 3 à 4. J'ai mentionné ce lien et cela a été très utile.

Je faisais face à ce problème en raison de la configuration ci-dessous dans mon fichier web-servlet.xml

<mvc:resources mapping="/app/*.html" location="/app/*.html" cache-period="0"/>
<mvc:resources mapping="/app/**/*.html" location="/app/**/*.html" cache-period="0"/>

Cela a fonctionné après avoir modifié les deux valeurs d'emplacement en "/app/". Il semble que la version la plus récente de la source corresponde à la chaîne entière ou vérifie si l'emplacement demandé commence par la valeur d'emplacement configurée ci-dessus.

J'ai trouvé le code ci-dessous dans org.springframework.web.servlet.resource.PathResourceResolver:

if (locationPath.equals(resourcePath)) {
    return true;
}
locationPath = (locationPath.endsWith("/") || locationPath.isEmpty() ? locationPath : locationPath + "/");
if (!resourcePath.startsWith(locationPath)) {
    return false;
}

La seconde si la condition était évaluée à false dans mon cas et donc la réponse HTTP 404

Un autre conseil: si vous faites face à une telle erreur, essayez d'activer le plus haut niveau de journalisation Springframework. Vous pourrez peut-être connaître la raison de l'erreur à partir de là.

0
Harshad Vyawahare

Cette réponse est peut-être obsolète pour la question ci-dessus, mais elle aidera les personnes qui commencent tout juste avec le printemps. Je me débattais également avec une erreur 404 WEB-INF/welcome.jsp not found.

Ici, le problème concerne l'importation de ModelAndView

Remplacer

import org.springframework.web.servlet.ModelAndView; 

Avec

import org.springframework.web.portlet.ModelAndView;
0
user3717858