【问题标题】:spring MVC - mapping error [duplicate]spring MVC - 映射错误[重复]
【发布时间】:2017-06-04 12:33:05
【问题描述】:

我在这里发现了类似的问题,但我尝试了这些答案,花了一天后我来到了这里。我不知道这里出了什么问题我被我的第一个 spring mvc 应用程序卡住了。如果有人可以帮助我,那将不胜感激。我收到错误 404 - 未找到。控制台错误 - “在名称为 'mvc-dispatcher' 的 DispatcherServlet 中找不到带有 URI [/FirstSpringMVC/welcome] 的 HTTP 请求的映射”

这是我的全部代码。

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-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"> 

        <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>

【问题讨论】:

    标签: spring-mvc


    【解决方案1】:

    好吧,对您的代码进行了以下更改以解决 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&lt;context:component-scan base-package="com.thomsontech.controller" /&gt; 的组合没有创建 helloWorldController bean。所以,我必须通过在mvc-dispatcher-servlet.xml 文件中添加&lt;bean id="helloWorldController" class="com.thomsontech.controller.HelloWorldController"&gt;&lt;/bean&gt; 来显式创建bean。我还从同一个文件中删除了&lt;bean id="HandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/&gt;,因为我看不到该 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中,已将&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;添加到&lt;/servlet&gt;标签中,以便在启动时加载mvc-dispatcher servlet。 此外,当您使用jstl 时,您必须升级网络应用程序版本 2.3。 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>
    

    进行这些更改后,清理 tomcat/jetty 工作目录,然后清理maven clean install,然后在服务器上运行此应用程序。

    希望这会有所帮助,祝你好运!!

    【讨论】:

    • 首先非常感谢您对我的帮助。我按照您建议的方式更改了代码。现在我没有映射错误,但我收到“java.lang.ClassNotFoundException: com.thomsontech.controller.HelloWorldController”。哪里可能出错?你能帮帮我吗?
    • 好的。在 tomcat/jetty 工作目录中可能缺少控制器类。你能检查工作目录吗?清除tomcat部署目录中的这个项目,在eclipse工作区刷新这个项目,运行mvn clean install并再次检查tomcat部署目录中的classes文件夹。
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 2018-04-07
    • 2017-01-18
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多