2011-01-03 5 views
22

Почему я не могу получить эту работу в моем контроллереперенаправлять в 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: Может не разрешить представление с именем «перенаправлять : index.html»в сервлет с названием 'диспетчерскую'
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)

У меня есть это, чтобы работать раньше. Почему не сейчас?

+0

ли больше появляться исключение, до или после того, как редирект отправить в браузер? – Ralph

+0

Также стоит отметить, что BindingResult не будет сохранен после перенаправления. Другими словами, если вы перенаправляетесь на свою форму ввода (в этом примере index.html), ошибки не будут отображаться, поскольку они будут потеряны из-за перенаправления. Я должен был решить это перед использованием HandlerInterceptor. – garyj

+0

@garyj У вас есть пример вашего HandlerInterceptor? – blong824

ответ

53

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

return "redirect:/index.html"; 
25

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

+2

спасибо за явное упоминание необходимых разрешений вида! :) –

-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 
4

попробовать изменить это в диспетчерскую-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

8

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

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

return "redirect:/index.html"; 

должно работать. Если ваше представление находится в корне приложения, Spring может его найти. Если url без «/», например, в вашем вопросе, это означает относительный URL. Это объясняет, почему он работал раньше и не работает сейчас. Если ваша страница, называющая «перенаправление», находится в корне случайно, она работает. Если нет, 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); 
} 
2

Axtavt ответ является правильным.

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

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

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

    return resolver; 
} 

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

3

Попробуйте

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

Когда вы задаете вопрос, посмотрите на детали апеллята, прежде чем отвечать ... он задал этот вопрос в 2011 году ... это невероятно маловероятно, что этот вопрос все еще ждет ответа или даже вопросов для новичков ... Кроме того, при ответе попробуйте объяснить/направлять ответ таким образом, чтобы научить людей, которые не знают, что вы делаете, ... например, «Тогда HttpServletResponse (тогда ссылка источника) - это система, которая делает x, y, z , и вы можете использовать для x ... ' – Bonatti

+2

@Bonatti - Тот факт, что OP не ждет ответа, не имеет ничего общего с долгосрочной полезностью этого ответа ... и есть еще люди, которые хотят знать, как перенаправить весной. –