2017-06-04 125 views
0

我在這裏發現了類似的問題,但我嘗試了這些答案,在這裏我花了一天的時間。我不知道這裏出了什麼問題,我被我的第一個彈簧mvc應用程序困住了。如果任何人都可以幫助我,那麼將不勝感激。我收到錯誤404-未找到。控制檯錯誤 - 「在名爲'mvc-dispatcher'的DispatcherServlet中找不到具有URI [/ FirstSpringMVC/welcome]的HTTP請求的映射」spring MVC - 映射錯誤

這是我的整個代碼。

的pom.xml

<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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.thomsontech</groupId> 
    <artifactId>FirstSpringMVC</artifactId> 
    <packaging>war</packaging> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>FirstSpringMVC Maven Webapp</name> 
    <url>http://maven.apache.org</url> 
    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>4.3.8.RELEASE</version> 
    </dependency> 

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aop</artifactId> 
     <version>4.3.8.RELEASE</version> 
    </dependency> 

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>4.3.8.RELEASE</version> 
    </dependency> 

    <!-- https://mvnrepository.com/artifact/javax.servlet/jstl --> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jstl</artifactId> 
     <version>1.2</version> 
    </dependency> 

    </dependencies> 
    <build> 
    <finalName>FirstSpringMVC</finalName> 
    </build> 
</project> 

的web.xml

 <!DOCTYPE web-app PUBLIC 
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
    "http://java.sun.com/dtd/web-app_2_3.dtd" > 

    <web-app> 
     <display-name>Archetype Created Web Application</display-name> 

     <servlet> 
     <servlet-name>mvc-dispatcher</servlet-name> 
      <servlet-class> 
       org.springframework.web.servlet.DispatcherServlet 
      </servlet-class> 
     </servlet> 
     <servlet-mapping> 
     <servlet-name>mvc-dispatcher</servlet-name> 
      <url-pattern>/</url-pattern> 
     </servlet-mapping> 
    </web-app> 

MVC-調度-servlet.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.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

     <bean id="HandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> 

     <context:component-scan base-package="com.thomsontech.controller" /> 

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

    </beans> 

HelloWorldController.java

package com.thomsontech.controller; 

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

    @Controller 
    public class HelloWorldController { 

     @RequestMapping("/welcome") 
     public ModelAndView helloWorld() { 

      ModelAndView model = new ModelAndView("HelloWorldPage"); 
      model.addObject("msg", "hello world"); 

      return model; 
     } 
    } 

HelloWorldPage.jsp

 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
    <html> 
    <body> 
     <h1>Spring MVC Hello World Example</h1> 

     <h2>${msg}</h2> 
    </body> 
    </html> 

回答

0

好了,已經更改下方做你的代碼,以解決404問題。

@Controller 
public class HelloWorldController { 

    @RequestMapping(value = {"/welcome","/"}, method = RequestMethod.GET) 
    public ModelAndView helloWorld() { 

     ModelAndView model = new ModelAndView("HelloWorldPage"); 
     model.addObject("msg", "hello world"); 

     return model; 
    } 

} 

它幾乎與你的一樣,除了它回答在根頁面(「/」)上收到的請求。我剛剛添加它直接測試主頁。

我不知道原因,@Controller<context:component-scan base-package="com.thomsontech.controller" />的組合並沒有創建helloWorldController bean。所以,我必須通過在mvc-dispatcher-servlet.xml文件中添加<bean id="helloWorldController" class="com.thomsontech.controller.HelloWorldController"></bean>來明確創建bean。我也從同一個文件中刪除了<bean id="HandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>,因爲我看不到那個bean在任何地方被使用。

所以,你最終mvc-dispatcher-servlet.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.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <context:component-scan base-package="com.thomsontech.controller" /> 

    <bean id="helloWorldController" class="com.thomsontech.controller.HelloWorldController"></bean> 

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

</beans> 

在你web.xml,增加了<load-on-startup>1</load-on-startup></servlet>標籤,以便在啓動時加載mvc-dispatcher的servlet。 此外,您將不得不升級網絡應用程序版本2.3,因爲您使用的是jstl。 JSTL不適用於2.4+版本。但是,這不應該阻止你測試404問題。 ${msg} in HelloWorldPage jsp不會呈現由HelloWorldController控制器返回的「hello world」字符串。

你最終的web.xml是:

<web-app> 
    <display-name>Archetype Created Web Application</display-name> 
    <servlet> 
     <servlet-name>mvc-dispatcher</servlet-name> 
     <servlet-class> 
      org.springframework.web.servlet.DispatcherServlet 
     </servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>mvc-dispatcher</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
</web-app> 

完成這些修改後,做其次maven clean install的tomcat /碼頭工作目錄的清理,然後在服務器上運行這個程序。

希望這會有所幫助,祝你好運!

+0

首先非常感謝你幫助我。我按照你的建議改變了代碼。現在我沒有映射錯誤,但我得到「java.lang.ClassNotFoundException:com.thomsontech.controller.HelloWorldController。」哪裏可能會出錯?你能幫我麼 ? – Thomson

+0

好的。 tomcat/jetty工作目錄中可能缺少控制器類。你可以檢查工作目錄嗎?在tomcat部署目錄中清除此項目,在eclipse workspace中刷新此項目,運行mvn clean install並再次檢查tomcat部署目錄中的classes文件夾。 – harshavmb