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搜索信息)。 –