2010-10-07 10 views
11

Sto provando a ottenere un primo setup di Spring 3 MVC in esecuzione.Configurazione MVC primaverile di base: PageNotFound utilizzando InternalResourceViewResolver

La mia applicazione è in esecuzione su Tomcat, nel contesto del server di "vite"

Ai fini del test, sto cercando di ottenere le richieste da http://localhost:8080/grapevine/test a rendere i contenuti di WEB-INF/jsp/noSuchInvitation.jsp

Quando ho provare questo, sto diventando un 404 ei registri suggeriscono che il mio jsp non è presente:

WARN org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/grapevine/WEB-INF/jsp/noSuchInvitation.jsp] in DispatcherServlet with name 'grapevine' 

devo avere mis-configurate da qualche parte, ma non riesco a vedere quello che ho fatto sbagliato.

Ecco tutti gli snippet rilevanti.

Web.xml:

<servlet> 
    <servlet-name>grapevine</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>grapevine</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

Dal mio contesto:

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

Controller:

@Controller 
public class ParticipantInvitationController { 

@RequestMapping("/test") 
public ModelAndView test() 
{ 
    return new ModelAndView("noSuchInvitation"); 
} 

Log:

DEBUG org.springframework.web.servlet.DispatcherServlet - Rendering view [org.springframework.web.servlet.view.JstlView: name 'noSuchInvitation'; URL [/WEB-INF/jsp/noSuchInvitation.jsp]] in DispatcherServlet with name 'grapevine' 
DEBUG org.springframework.web.servlet.view.JstlView - Forwarding to resource [/WEB-INF/jsp/noSuchInvitation.jsp] in InternalResourceView 'noSuchInvitation' 
DEBUG org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name 'grapevine' processing GET request for [/grapevine/WEB-INF/jsp/noSuchInvitation.jsp] 
WARN org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/grapevine/WEB-INF/jsp/noSuchInvitation.jsp] in DispatcherServlet with name 'grapevine' 
DEBUG org.springframework.security.web.context.HttpSessionSecurityContextRepository - SecurityContext contents are anonymous - context will not be stored in HttpSession. 
DEBUG org.springframework.web.servlet.DispatcherServlet - Successfully completed request 
+0

Sei sicuro che non ci siano errori di ortografia? –

+0

possibile duplicato di [Nessuna mappatura trovata per richiesta HTTP con URI \ [/WEB-INF/pages/apiForm.jsp \]] (http://stackoverflow.com/questions/1266303/no-mapping-found-for-http -request-with-uri-web-inf-pages-apiform-jsp) – naXa

risposta

27

Questo perché il <url-pattern> nella vostra web.xml è troppo "largo". Un valore di /* significa che il servlet è configurato per ricevere tutte le richieste e che include la richiesta dal servlet al JSP. Il messaggio di errore che vedi è DispatcherServlet, che sta ricevendo la propria richiesta inoltrata.

È necessario selezionare uno specifico <url-pattern>, ad es. <url-pattern>/xyz/*</url-pattern>, quindi l'URL diventa http://localhost:8080/grapevine/xyz/test e quindi dovrebbe funzionare correttamente.

+1

Qual è la differenza tra/* e solo /? Ho una webapp Spring configurata quasi esattamente allo stesso modo di Marty, ma la mia funziona con il servlet dispatcher mappato a /. –

+3

@Ben: '/' corrisponderà solo all'URL di root, mentre '/ *' corrisponderà a tutti gli URL – skaffman

+2

Ciò ha risolto il problema, grazie. Hovewer, ho una domanda. Data una pagina example.com, l'url-pattern/corrisponderà solo a http://example.com. Com'è possibile che la richiesta di http://example.com/test venga reindirizzata al servlet del dispatcher di primavera? –

1

Soluzione 1: È possibile registrare la servlet a * .html e * .json (o XML, GIF, PNG ...):

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

<servlet-mapping> 
    <servlet-name>RestServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
    <url-pattern>*.html</url-pattern> 
    <url-pattern>*.json</url-pattern> 
</servlet-mapping> 

Soluzione 2: Se si desidera mantenere il vostro servlet mappato al /*, aggiungere il seguente al file spring.xml:

<mvc:default-servlet-handler/> 

E questo al file web.xml:

012.351.641.061.
<servlet-mapping> 
    <servlet-name>jsp</servlet-name> 
    <url-pattern>/WEB-INF/jsp/*</url-pattern> 
</servlet-mapping> 

<servlet> 
    <servlet-name>jsp</servlet-name> 
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> 
</servlet> 

La spiegazione è spiegata qui: spring, web.xml. Questo registrerà un gestore esplicito per le pagine JSP con maggiore precedenza rispetto a /*.

2

Basta sostituire /* a / come url-pattern. Funzionerà...

+6

Una piccola spiegazione del perché funziona sarebbe anche apprezzata. – Alfergon

0

ATTENZIONE: questo potrebbe essere un messaggio di errore fuorviante. E 'appena successo a me.

Anche pensato che il messaggio di errore contiene inaspettatamente l'/ ContextName/... all'inizio del percorso, potrebbe ancora essere un errore di ortografia in entrambi il prefisso InternalResourceViewResolver:

<property name="prefix" value="/WEB-INF-typo-Here/jsp/"/> 

o il percorso del file stesso.

Ora che ho risolto il mio errore di ortografia, funziona perfettamente. Non so perché il contesto mostri il messaggio di errore, e mi ha davvero fatto ignorare il mio stupido errore di battitura e tentare di provare gli altri meravigliosi contributi a questa domanda. Non lasciare che succeda a te!

BTW, sto usando la versione di Spring 4.0.0.

0

per me ho risolto il problema utilizzando i modelli .jsp e non solo .html.

Problemi correlati