2011-01-03 17 views
22

Por qué no puedo conseguir que esto funcione en mi ControladorRemitir dentro Spring MVC

@RequestMapping(method = RequestMethod.POST) 
public String onSubmit(
    Model model, 
    @ModelAttribute("form") Form form, 
    BindingResult result, HttpServletRequest request) 
    throws IOException, WriteException, BiffException { 

    if (result.hasErrors()) { 
     return "redirect:index.html"; 
    } 

} 

consigo

javax.servlet.ServletException: Podría no resuelve vista con el nombre 'redireccionamiento : index.html' en el servlet con nombre 'despachador'
org.springframework.web.servlet.DispatcherServlet.render (DispatcherServlet.java:1042)
org.springframework.we b.servlet.DispatcherServlet.doDispatch (DispatcherServlet.java:798)
org.springframework.web.servlet.DispatcherServlet.doService (DispatcherServlet.java:716)
org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet. java: 644)
org.springframework.web.servlet.FrameworkServlet.doPost (FrameworkServlet.java:560)
javax.servlet.http.HttpServlet.service (HttpServlet.java:637)
javax.servlet.http. HttpServlet.service (HttpServlet.java:717)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter (MonitorFilter.java:390)

Tengo esto para trabajar antes. ¿Por qué no ahora?

+0

¿Se aparecer dentro de la excepción, antes o después de la redirección se envía al navegador? – Ralph

+0

También vale la pena señalar que BindingResult no se mantendrá después de la redirección. En otras palabras, si redirige a su formulario de entrada (en este ejemplo index.html) los errores no se mostrarán ya que se pierden debido a la redirección. Tuve que resolver esto justo antes de usar un HandlerInterceptor. – garyj

+0

@garyj ¿Tiene un ejemplo de su HandlerInterceptor? – blong824

Respuesta

53

Prueba de esto, que debería funcionar si ha configurado el punto de vista del resolver adecuadamente

return "redirect:/index.html"; 
25

También tenga en cuenta que redirect: y forward: prefijos son manejados por UrlBasedViewResolver, por lo que es necesario tener al menos una subclase de UrlBasedViewResolver entre su ver resolvers, como InternalResourceViewResolver.

+2

¡gracias por mencionar explícitamente los resolutores de vistas requeridos! :) –

-2

Es posible definir un urlBasedViewResolver en las propiedades del archivo:

excel.(class)=fi.utu.seurantaraporttisuodatin.service.Raportti 
index.(class)=org.springframework.web.servlet.view.urlBasedView 
index.viewClass =org.springframework.web.servlet.view.JstlView 
index.prefix = /WEB-INF/jsp/ 
index.suffix =.jsp 
4

tratar de cambiar esto en su despachador-servlet.xml

<!-- Your View Resolver --> 
<bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver"> 
    <property name="basenames" value="views" /> 
    <property name="order" value="1" /> 
</bean> 
<!-- UrlBasedViewResolver to Handle Redirects & Forward --> 
<bean id="urlViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" /> 
    <property name="order" value="2" /> 
</bean>   

Lo que pasa es claramente explicado aquí http://projects.nigelsim.org/wiki/RedirectWithSpringWebMvc

8

Para completar las respuestas, Spring MVC usa viewResolver (por ejemplo, como axtavt metionned, InternalResourceViewResolver) para obtener la s vista pecific. Por lo tanto, el primer paso es asegurarse de que viewResolver esté configurado.

En segundo lugar, debe prestar atención a la url de redirección (redirigir o reenviar). Una URL que comienza con "/" significa que es un URL absoluto en la aplicación. Como dice Jigar,

return "redirect:/index.html"; 

debería funcionar. Si su vista se ubica en la raíz de la aplicación, Spring puede encontrarla. Si una url sin un "/", como esa en su pregunta, significa un pariente de url. Explica por qué funcionó antes y no funciona ahora. Si la página que llama "redirigir" se ubica en la raíz por casualidad, funciona. De lo contrario, Spring no puede encontrar la vista y no funciona.

Aquí está el código fuente del método de RedirectView de la primavera

protected void renderMergedOutputModel( 
Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) 
throws IOException { 
    // Prepare target URL. 
    StringBuilder targetUrl = new StringBuilder(); 
    if (this.contextRelative && getUrl().startsWith("/")) { 
    // Do not apply context path to relative URLs. 
    targetUrl.append(request.getContextPath()); 
    } 
    targetUrl.append(getUrl()); 

    // ... 

    sendRedirect(request, response, targetUrl.toString(), this.http10Compatible); 
} 
2

respuesta Axtavt es correcta.

Esta es la forma en que su resolución debe ser similar (anotaciones basadas):

@Bean 
UrlBasedViewResolver resolver(){ 
    UrlBasedViewResolver resolver = new UrlBasedViewResolver(); 

    resolver.setPrefix("/views/"); 
    resolver.setSuffix(".jsp"); 
    resolver.setViewClass(JstlView.class); 

    return resolver; 
} 

Obviamente, el nombre del directorio de puntos de vista debería cambiar en función de su proyecto.

3

probar este

HttpServletResponse response;  
response.sendRedirect(".../webpage.xhtml"); 
+3

Al responder a una pregunta, mira los detalles de asker antes de responder ... hizo esta pregunta en 2011 ... es altamente improbable que esta pregunta aún esté esperando respuesta, o incluso que les importe a los recién llegados ... Además, cuando responda, trate de explicar/guiar la respuesta de una manera para enseñar a las personas que no saben lo que está haciendo ... cosas como 'Entonces HttpServletResponse (luego un enlace de origen), es un sistema que hace x, y, z , y puedes usar para x ... ' – Bonatti

+2

@Bonatti - El hecho de que OP no esté esperando una respuesta no tiene nada que ver con la utilidad a largo plazo de esta respuesta ... y todavía hay personas por ahí que quieren para saber cómo redirigir en primavera. –