在Spring MVC中重定向

时间:2011-01-03 12:28:19

标签: java spring 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";
    }

 }

我明白了:

  

javax.servlet.ServletException:可以   不用名称解析视图   servlet中的'redirect:index.html'   名称'调度员'   org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1042)
  org.springframework.web.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)

我以前有这个工作。为什么不呢?

8 个答案:

答案 0 :(得分:58)

试试这个,如果您已正确配置了视图解析器,它应该可以正常工作

 return "redirect:/index.html";

答案 1 :(得分:25)

另请注意,redirect:forward:前缀由UrlBasedViewResolver处理,因此您需要在视图解析器中至少有一个UrlBasedViewResolver的子类,例如{ {1}}。

答案 2 :(得分:8)

为了完成答案,Spring MVC使用viewResolver(例如,作为axtavt metionned,InternalResourceViewResolver)来获取特定视图。因此,第一步是确保配置了viewResolver。

其次,您应该注意重定向的URL(重定向或转发)。以“/”开头的url表示它是应用程序中的绝对URL。正如吉格尔所说,

return "redirect:/index.html";  

应该有效。如果您的视图位于应用程序的根目录中,Spring可以找到它。如果没有“/”的网址,例如您问题中的网址,则表示网址相对。它解释了为什么它以前工作,现在不工作。如果您的页面调用“重定向”偶然位于根目录中,则可以正常工作。如果没有,Spring无法找到视图,也无法正常工作。

以下是Spring的RedirectView方法的源代码

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);  
}  

答案 3 :(得分:4)

尝试在dispatcher-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>        

这里明确解释了什么http://projects.nigelsim.org/wiki/RedirectWithSpringWebMvc

答案 4 :(得分:4)

试试这个

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

答案 5 :(得分:2)

Axtavt的回答是正确的。

这是你的解析器应该是这样的(基于注释):

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

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

    return resolver;
}

显然,您的视图目录的名称应根据您的项目而更改。

答案 6 :(得分:-2)

可以在属性文件中定义urlBasedViewResolver

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

答案 7 :(得分:-2)

我知道这已经晚了,但你应该尝试重定向到路径而不是文件哈哈