2010-10-24 36 views
5

我試圖設置一個框架Spring 3 MVC項目,但我很難得到視圖渲染。我遵循mvc-basic示例項目中描述的結構並在http://blog.springsource.com/2009/12/21/mvc-simplifications-in-spring-3-0/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+Interface21TeamBlog+%28SpringSource+Team+Blog%29上設置web.xml,app-config.xmlmvc-config.xml文件。控制器被調用,但是當它達到查找視圖並呈現它時,我得到一個404錯誤。該文件如下:春天3 MVC - 控制器被調用,但沒有發現意見

web.xml中:

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

    <!-- Handles all requests into the application --> 
    <servlet> 
     <servlet-name>myServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value> 
       /WEB-INF/app-config.xml 
      </param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>myServlet</servlet-name> 
     <url-pattern>/app/*</url-pattern> 
    </servlet-mapping> 

</web-app> 

APP-config.xml中:

<?xml version="1.0" encoding="UTF-8"?> 
<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"> 

    <!-- Scans the classpath of this application for @Components to deploy as beans --> 
    <context:component-scan base-package="com.myProject" /> 

    <!-- Application Message Bundle --> 
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
     <property name="basename" value="/WEB-INF/messages/messages" /> 
     <property name="cacheSeconds" value="0" /> 
    </bean> 

    <!-- Configures Spring MVC --> 
    <import resource="mvc-config.xml" /> 

</beans> 

MVC-config.xml中:

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

    <!-- Configures the @Controller programming model --> 
    <mvc:annotation-driven /> 

    <mvc:view-controller path="/app" view-name="welcome"/> 

    <!-- Configures Handler Interceptors -->  
    <mvc:interceptors> 
     <!-- Changes the locale when a 'locale' request parameter is sent; e.g. /?locale=de --> 
     <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> 
    </mvc:interceptors> 

    <!-- Saves a locale change using a cookie --> 
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" /> 

    <!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory --> 
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/views/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 

</beans> 

在 「Java的資源:SRC」 - > com.myProject - >HelloWorldController.java我有:

package com.myProject; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.servlet.ModelAndView; 

@Controller 
@RequestMapping(value="/helloworld") 
public class HelloWorldController { 

    @RequestMapping(method=RequestMethod.GET) 
    public ModelAndView helloWorld() { 
     ModelAndView mav = new ModelAndView(); 
     mav.setViewName("helloworld"); 
     mav.addObject("message", "Hello World!"); 
     return mav; 
    } 

    @RequestMapping(value="/Second", method = RequestMethod.GET) 
    public ModelAndView Second(){ 
     ModelAndView mav = new ModelAndView(); 
     mav.setViewName("Second"); 
     mav.addObject("message", "Hello World!"); 
     return mav; 
    } 
} 

的WebContent/WEB-INF /意見我有:

WebContent    (folder) 
    WEB-INF    (folder) 
    views    (folder) 
     helloworld  (folder) 
     helloworld.jsp (.jsp view) 
     helloworld.jsp (.jsp view) 
     welcome.jsp  (.jsp view) 

視圖有直接的HTML在他們。當我要求http:// localhost:8080/projectname/app我正確得到了意見 - > welcome.jsp頁面。但是,當我請求http:// localhost:8080/projectname/app/helloworldhttp:// localhost:8080/projectname/app/helloworld/執行命中正確的控制器操作,但我得到HTTP狀態404 - /projectname/WEB-INF/views/helloworld.jsp

任何人都可以告訴什麼是錯的?

感謝

+0

對於控制器類('HelloWorldController')和其中的一個方法('Second()'),您有不同的'@ RequestMapping'值。你是否試圖將'value =「/ helloworld」'放入'helloWorld()'的'@ RequestMapping'而不是類註解? – Jan 2010-10-25 08:53:03

+0

我一般我同意@GaryF:在URLs(「/ app/helloworld」v.s.「/ helloworld」)中存在不匹配。也許將註釋重寫爲'@RequestMapping(value =「/ app/helloworld」)'然後使用'UrlRewriteFilter'會更容易。或者你的類註解應該聲明'@RequestMapping(value =「/ app」)'方法註解應該聲明'@RequestMapping(value =「/ helloworld」)'(相對映射,參見[here](http:// static。 springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping))。 – 2011-11-17 08:56:08

+0

嗨@Matthew我跑到相同的情況很糟糕,你能幫我擺脫http://stackoverflow.com/questions/17697899/how-to-map-dynamic-url-prj-noticeopen-2-in-spring -mvc-controller – 2013-07-18 04:20:37

回答

0

看起來那是因爲你沒有指定viewClass屬性。

你能與

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
     <property name="prefix" value="/WEB-INF/views/"/> 
     <property name="suffix" value=".jsp"/> 
</bean> 

它爲歡迎頁面嘗試由於此

<mvc:view-controller path="/app" view-name="welcome"/> 
+2

指定'viewClass'不應該是必須的,Spring會選擇一個合理的默認值。 – skaffman 2010-10-24 16:32:53

1

有幾個問題。第一個是,你只派遣/應用/ *網址在web.xml中泉:

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

那很好,如果請求映射爲/應用/ HelloWorld的,但同時也意味着/ HelloWorld的甚至沒有得到到春天。你可能想要做的是使用一個urlrewrite過濾器將請求映射到/ app/*空間。

採取的依賴上tuckey,然後添加到您的web.xml:

<filter> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

然後添加一個名爲urlrewrite.xml在WEB-INF目錄下的文件,包含:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN" "http://tuckey.org/res/dtds/urlrewrite3.0.dtd"> 
<urlrewrite default-match-type="wildcard"> 
    <rule> 
     <from>/images/**</from> 
     <to>/images/$1</to> 
    </rule> 
    <rule> 
     <from>/scripts/**</from> 
     <to>/scripts/$1</to> 
    </rule> 
    <rule> 
     <from>/styles/**</from> 
     <to>/styles/$1</to> 
    </rule> 
    <rule> 
     <from>/**</from> 
     <to>/app/$1</to> 
    </rule> 
    <outbound-rule> 
     <from>/app/**</from> 
     <to>/$1</to> 
    </outbound-rule>  
</urlrewrite> 

之後,/ helloworld的請求應該到達正確的位置。你可能會想太多改變根視圖控制器:

<mvc:view-controller path="/" view-name="welcome"/> 
0

我認爲,鑑於需要在視圖/的helloWorld.jsp而不是視圖/的HelloWorld /的helloWorld.jsp

+0

Matthew在兩個不同的地方複製了'helloworld.jsp',以確保它不是造成問題的JSP位置。 – 2011-11-17 08:48:12

0

你應該設置視圖名稱爲

mav.setViewName("/helloWorld/helloWorld"); 
0

你應該改變「MVC-配置」,以提供yourname-servlet.xml中」提供yourname應該匹配與烏爾web.xml文件你的servlet名,在烏拉圭回合的情況下,應myservlet-servlet.xml中因爲spring調度程序servlet在W中查找帶有「-servlet」擴展名文件名的文件EB-INF文件夾。 並在你的myservlet-servlet.xml文件中爲後綴部分,你應該這樣說:「WEB-INF/yourfoldername(例如view)」直到你的控制器查找你在你的控制器方法中提到的你的視圖名稱(例如ModelAndView 「你好」))。

0

正如你所配置如下:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/views/"/> 
    <property name="suffix" value=".jsp"/> 
</bean> 

和控制器返回乾淨的視圖名稱。

運行應用程序時,驗證您的視圖文件是否存在於/WEB-INF/views/之內。