2017-06-04 98 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