2011-01-03 9 views
22

Dlaczego nie mogę uzyskać to do pracy w moim kontroleraprzekierować wiosną 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"; 
    } 

} 

dostaję

javax.servlet.ServletException: Czy nie rozwiązać widok z nazwą „przekierować : index.html "w serwletie z nazwa" dispatcher "
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)

Mam to do pracy wcześniej. Dlaczego nie teraz?

+0

Czy wyjątek wystąpić maksymalnie, przed lub po przekierowanie jest wysyłany do przeglądarki? – Ralph

+0

Warto również zauważyć, że funkcja BindingResult nie zostanie zachowana po przekierowaniu. Innymi słowy, jeśli przekierujesz się do formularza wejściowego (w tym przykładzie index.html) błędy nie będą wyświetlane, ponieważ zostały utracone z powodu przekierowania. Musiałem rozwiązać to tuż przed użyciem HandlerInterceptor. – garyj

+0

@garyj Czy masz przykład swojego HandlerInterceptor? – blong824

Odpowiedz

53

Spróbuj to powinno działać, jeśli skonfigurowaniu widok resolverowi prawidłowo

return "redirect:/index.html"; 
25

Należy również pamiętać, że redirect: i forward: prefiksy są obsługiwane przez UrlBasedViewResolver, więc trzeba mieć co najmniej jedną podklasę UrlBasedViewResolver wśród swoich zobacz resolwery, takie jak InternalResourceViewResolver.

+2

dziękuję za wyraźne wymienienie wymaganych narzędzi do rozpoznawania widoku! :) –

-2

Możliwe jest zdefiniowanie urlBasedViewResolver we właściwościach pliku:

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

spróbować to zmienić w swoim dyspozytora-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>   

Co się dzieje, jest jasno wyjaśnione tutaj http://projects.nigelsim.org/wiki/RedirectWithSpringWebMvc

8

Aby ukończyć odpowiedzi, Spring MVC używa viewResolver (na przykład jako axtavt metionned, InternalResourceViewResolver), aby uzyskać s konkretny widok. Dlatego pierwszym krokiem jest upewnienie się, że skonfigurowano viewResolver.

Po drugie, należy zwrócić uwagę na adres URL przekierowania (przekierowania lub przekazania dalej). Adres URL zaczynający się na "/" oznacza, że ​​jest to bezwzględny adres URL w aplikacji. Jak mówi Jigar, powinno działać

return "redirect:/index.html"; 

. Jeśli twój widok znajduje się w katalogu głównym aplikacji, Spring może go znaleźć. Jeśli adres URL bez "/", np. W Twoim pytaniu, oznacza adres URL. Wyjaśnia, dlaczego wcześniej działało i teraz nie działa. Jeśli twoja strona nazywająca "przekierowanie" znajduje się w katalogu głównym przez przypadek, działa. Jeśli nie, Spring nie może znaleźć widoku i nie działa.

Oto kod źródłowy sposobu RedirectView wiosny

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

Axtavt odpowiedź jest poprawna.

To w jaki sposób resolver powinien wyglądać (adnotacje based):

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

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

    return resolver; 
} 

Oczywiście nazwa katalogu poglądów powinno się zmieniać na podstawie projektu.

3

Spróbuj

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

Kiedy odpowiadając na pytanie, spójrz na szczegóły pytającego przed odpowiedzią ... zadał to pytanie w 2011 r. ... jest bardzo mało prawdopodobne, że to pytanie wciąż czeka na odpowiedź, a nawet sprawy dla nowych osób ... podczas odpowiadania spróbuj wyjaśnić/poprowadzić odpowiedź w taki sposób, aby uczyć ludzi, że nie wiesz, co robisz ... rzeczy takie jak 'Then HttpServletResponse (wtedy link źródłowy), to system, który robi x, y, z i możesz użyć do x ... ' – Bonatti

+2

@Bonatti - Fakt, że OP nie czeka na odpowiedź, nie ma nic wspólnego z długoterminową przydatnością tej odpowiedzi ... i wciąż są ludzie, którzy chcą wiedzieć, jak przekierować wiosnę. –

Powiązane problemy