Редирект в Spring MVC - PullRequest
       19

Редирект в Spring MVC

25 голосов
/ 03 января 2011

Почему я не могу заставить это работать в моем контроллере

@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: может не разрешить вид с именем '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 ]

58 голосов
/ 03 января 2011

Попробуйте, это должно работать, если вы правильно сконфигурировали свой преобразователь вида

 return "redirect:/index.html";
25 голосов
/ 03 января 2011

Также обратите внимание, что префиксы redirect: и forward: обрабатываются UrlBasedViewResolver, поэтому вам необходимо иметь хотя бы один подкласс UrlBasedViewResolver среди ваших преобразователей представлений, например InternalResourceViewResolver.

8 голосов
/ 03 февраля 2015

Для завершения ответов Spring MVC использует viewResolver (например, как axtavt metionned, InternalResourceViewResolver), чтобы получить конкретное представление. Поэтому первый шаг - убедиться, что viewResolver настроен.

Во-вторых, вы должны обратить внимание на URL перенаправления (перенаправление или пересылка). URL, начинающийся с "/", означает, что это абсолютный URL в приложении. Как говорит Джигар,

return "redirect:/index.html";  

должно работать. Если ваше представление находится в корне приложения, Spring может его найти. Если URL-адрес без «/», например, в вашем вопросе, это означает относительный URL-адрес. Это объясняет, почему это работало раньше и не работает сейчас. Если ваша страница с именем «redirect» случайно находится в корне, это работает. Если нет, Spring не может найти вид, и он не работает.

Вот исходный код метода RedirectView Spring

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);  
}  
4 голосов
/ 05 апреля 2016

Попробуйте это

HttpServletResponse response;       
response.sendRedirect(".../webpage.xhtml");
4 голосов
/ 23 декабря 2012

попробуйте изменить это в вашем 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

2 голосов
/ 08 сентября 2015

Axtavt ответ правильный.

Вот так должен выглядеть ваш распознаватель (на основе аннотаций):

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

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

    return resolver;
}

Очевидно, что имя вашего каталога представлений должно меняться в зависимости от вашего проекта.

0 голосов
/ 19 апреля 2018

я знаю, что уже поздно, но вы должны попробовать перенаправить на путь, а не в файл, ха-ха

0 голосов
/ 04 января 2011

Можно определить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...