2012-03-21 175 views
2

這可能很簡單,但我錯過了一些我猜的東西。問題歸結爲:我試圖使用HelloController來顯示「/WEB-INF/hello.jsp」。不幸的是,當我試圖訪問時,我得到了一個404條目。http://example.com/app/hello未找到彈簧MVC控制器

這是代碼。可能是一個簡單的修復。

web.xml中:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
id="WebApp_ID" version="2.5"> 
<display-name>app</display-name> 

<welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
</welcome-file-list> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/classes/applicationContext.xml</param-value> 
    </context-param> 

    <listener> 
    <listener-class> 
     org.springframework.web.context.ContextLoaderListener 
    </listener-class> 
    </listener> 

<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/classes/applicationContext.xml</param-value> 
    </init-param> 
</servlet> 

    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

applicationContext.xml中:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:security="http://www.springframework.org/schema/security" 
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" 
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:p="http://www.springframework.org/schema/p" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.1 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.1.xsd 
        http://www.springframework.org/schema/security 
        http://www.springframework.org/schema/security/spring-security-3.1.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"> 

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

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

</beans> 

HelloController.java:

@Controller 
public class HelloController { 

    @RequestMapping(value="/hello", method=RequestMethod.GET) 
    public ModelAndView helloWorld() { 
     ModelAndView mv = new ModelAndView(); 
     mv.setViewName("hello"); 
     return mv; 
    } 
} 

的hello.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
pageEncoding="ISO-8859-1"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
    <title>Hello</title> 
</head> 
<body> 
<p>Hello</p> 
</body> 
</html> 

更新:每個請求添加錯誤消息。

錯誤404 - 未找到從RFC 2068超文本傳輸​​協議 - HTTP/1.1: 10.4.5 404未找到

服務器沒有找到任何匹配的Request-URI。否 指示條件是暫時的還是 永久性的。

如果服務器不希望將此信息提供給客戶端 ,則可以使用狀態碼403(禁止)。如果服務器通過 知道一些內部可配置的機制,舊資源 永久不可用並且沒有轉發地址,則應使用410(Gone)狀態代碼。

+0

你用''試過了嗎? – 2012-03-21 14:32:42

+0

我之前在那裏沒有運氣,我只是把它放回到applicationContext.xml中,沒有運氣 – Jason 2012-03-21 14:36:55

+0

在應用程序啓動時你看到了嗎?事端如: 'INFO:org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping - 映射的URL路徑[/ hello/*]到處理程序'helloController''上? – vacuum 2012-03-21 15:19:00

回答

7

這個問題(在web.xml):

<url-pattern>/*</url-pattern> 

這將重定向所有請求到春天的servlet,包括從控制器到JSP您的要求。實質上,控制流程將從您的控制器循環回到Spring。您需要縮小範圍,以便JSP的請求直接發送到底層容器,而不是Spring。

嘗試將其更改爲

<url-pattern>/app*</url-pattern> 

,然後再試一次。你可能需要用前導和尾隨來弄清楚它是否工作(例如<url-pattern>/app*</url-pattern>@RequestMapping("hello")等)

+0

仍然沒有任何運氣。在這一點上,我想知道Spring是否正在拿起控制器類。 – Jason 2012-03-21 14:52:40

+0

@Jason:向我們展示404頁面。它的風格給出了什麼沒有找到的線索。 – skaffman 2012-03-21 15:04:47

+0

已被添加到原始信息 – Jason 2012-03-21 15:11:21

0

正如你在評論中提到的,日誌不會給你信息,Controller映射到特定的URL。所以我認爲箴是在控制器中。

請確保控制器位於「mil.army.retain.web。對註解的配置控制器」包,然後打開:

<context:annotation-config /> 
+0

那是我嘗試過的另一件事,沒有運氣。而且它似乎也忘了編輯我的軟件包名稱... – Jason 2012-03-21 15:51:39

+0

什麼日誌說,當你去http:// localhost:nnnn /你好? – vacuum 2012-03-21 15:54:40

+1

Eclipse控制檯中的Web服務器日誌傾向於說沒有找到/app/hello.do的映射。我沒有設置Log4J監聽器,所以我無法監視應用程序啓動以查看彈簧初始化。 – Jason 2012-03-21 16:04:38

1

請檢查您的所有控制器類/子包或其他類如你在下面一行都提到同一個包中:

<context:annotation-config /> 
<context:component-scan base-package="com.kfs" /> 
+2

意味着'annotation-config'標記的效果 – shevchyk 2012-10-05 10:44:18