2

我是Spring框架的新手。我会开发一个简单的网络应用程序,显示基于URL“/greeting.html”的hello.jsp内容。但现在,它给了我404错误。我究竟做错了什么?Spring MVC 4的无效控制器配置

这里是我的项目的GitHub库(该项目下的Eclipse STS创建):https://github.com/terancet/EventTracker

这里是我的HelloController类

@Controller 
public class HelloController { 
    @RequestMapping(value = "/greeting") 
    public String sayHello(Model model) { 
     model.addAttribute("greeting", "Hello World"); 

     return "hello.jsp"; 
    } 

} 

下面是web.xml中

<servlet> 
     <servlet-name>springDispatcherServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 

     <init-param> 
      <param-name>contextClass</param-name> 
      <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> 
     </init-param> 


     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>com.pluralsight.WebConfig</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <!-- Map all requests to the DispatcherServlet for handling --> 
    <servlet-mapping> 
     <servlet-name>springDispatcherServlet</servlet-name> 
     <url-pattern>*.html</url-pattern> 
    </servlet-mapping> 

这是一个项目结构:

project structure

+1

你能代替'@RequestMapping(值= “/问候语”)'和'@RequestMapping(值=“/greeting.html “)'并尝试? – barunsthakur

+0

什么是你打的完整网址? –

+0

我的完整网址 - http:// localhost:8080/EvenTracker/greeting.html。我用“/greeting.html”代替,仍然有404错误。 –

回答

1

添加的log4j.xml或log4j.properties到

的src /主/资源

文件夹(它会自动被检测到)。 然后,当你启动服务器时,它会通过信息日志告诉你网址映射的确切位置。这是重要的不只是验证映射的URL,但以确保它实际上是被映射:

此外,在STS/Eclipse中,如果您:

right click on the project -> click properties -> click select 'Web Project Settings' 

enter image description here

默认是哪里URL路径是派生的。因此,如果在那里的上下文根值是:“EventTracker”那么你完整的URL请求将被(假设为他人在您的解析器表明一个“.JSP”后缀设置):

http://localhost/EventTracker/greetings

样本log4j。

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd"> 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 

    <!-- Appenders --> 
    <appender name="console" class="org.apache.log4j.ConsoleAppender"> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%-5p:%d{yyyyMMdd HH:mm:ss} %t %c - %m%n"/> 
     </layout> 
    </appender> 

    <appender name="fileAppender" class="org.apache.log4j.FileAppender"> 
     <param name="File" value="c:/tmp/my-app.log"/> 
     <param name="MaxFileSize" value="10MB"/> 
     <param name="MaxBackupIndex" value="50"/> 

     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%-5p:%d{yyyyMMdd HH:mm:ss} %t %c - %m%n" /> 
     </layout> 
    </appender> 

    <!-- 3rdparty Loggers --> 
    <logger name="org.springframework.core"> 
     <level value="info" /> 
    </logger> 

    <logger name="org.springframework.beans"> 
     <level value="info" /> 
    </logger> 

    <logger name="org.springframework.context"> 
     <level value="info" /> 
    </logger> 

    <logger name="org.springframework.web"> 
     <level value="debug" /> 
    </logger> 

    <logger name="org.springframework.webflow"> 
     <level value="debug" /> 
    </logger> 


    <!-- Root Logger --> 
    <root> 
     <priority value="info" /> 
     <appender-ref ref="console" /> 
     <appender-ref ref="fileAppender"/> 
    </root> 


</log4j:configuration> 

日志信息:从我的项目1 XML

INFO : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/userManagement/getUser],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.assessme.com.entity.User org.assessme.com.controller.UserManagementController.data(java.util.Locale,org.springframework.ui.Model) 
+0

谢谢你的提示(关于log4j)。我已经做了一个简单的输出到控制台,它抱怨我没有控制器要求在调度员映射。不过,我通过@Request注释做了一个明确的映射。如何解决这个问题呢? –

+0

问题已解决。谢谢。 –

0

它可能是应用程序名称中的拼写错误。请尝试本地主机:8080 /即使牛逼跟踪/问候 - 与连牛逼EventTracker

,努力改变的url-pattern为/ *

+0

但是,如果我更改为/ *所有获取请求将被映射到hello.jsp。 –

+0

试图做到这一点,并没有帮助。当我输入以下网址:http:// localhost:8080/EventTracker/greeting.html出现404错误... –

1

在你WebConfig您有以下

@Bean 
public InternalResourceViewResolver getInternalResourceViewResolver() { 
    InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 

    resolver.setPrefix("/WEB-INF/jsp/"); 
    resolver.setSuffix(".jsp"); 

    return resolver; 
} 

您的控制器正在返回hello.jp。这被传递到InternalResourceViewResolver以解决到一个视图。它将创建一条路径/WEB-INF/jsp/hello.jsp.jsp并且接下来转发到这条路径。

首先让您的控制器返回hello而不是hello.jsp。其次在WEB-INF目录内创建一个jsp目录,并将您的hello.jsp移动到那里。第三次重启。

+0

感谢您的评论。按照您的建议进行更正,但仍然在访问以下url路径时收到404错误:http:// localhost:8080/EventTracker/greeting.html –

+1

您的应用程序如何部署?以root身份,即'/'或'/ EventTracker'。此外,网址区分大小写......此外,您在这里发布的内容与您在回购库中使用的内容不匹配(使用的是spring引导程序)。旁边还使用了'forward:'而不是返回视图名称。所以不知道你在这里发布的内容,但它不符合你链接到的内容。 (最好你应该包括你的问题的一切,而不是让人们通过github搜索信息)。 –