【问题标题】:redirect not working with thymeleaf and JSP View resolver重定向不适用于 thymeleaf 和 JSP 视图解析器
【发布时间】:2013-12-22 05:14:36
【问题描述】:

我想在同一个项目中同时使用 thymeleaf 和 jsp,但无法从一个控制器跳转到另一个控制器。

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="viewNames" value="jsp/*" />
        <beans:property name="suffix" value=".jsp" />
</beans:bean>

<beans:bean id="templateResolver"
        class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".html" />
    <beans:property name="templateMode" value="HTML5" />
    <beans:property name="cacheable" value="true" />

  </beans:bean>

  <beans:bean id="templateEngine"
        class="org.thymeleaf.spring3.SpringTemplateEngine">
    <beans:property name="templateResolver" ref="templateResolver" />
  </beans:bean>

  <beans:bean class="org.thymeleaf.spring3.view.ThymeleafViewResolver">
    <beans:property name="templateEngine" ref="templateEngine" />
    <beans:property name="viewNames" value="template/*" />
  </beans:bean>

使用简单的代码

return "redirect:/mycontroller";

错误是

 Could not resolve view with name 'redirect:/mycontroller' in servlet with name 'appServlet'

    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1190)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)

任何帮助如何重定向到另一个控制器或解析重定向视图?

【问题讨论】:

    标签: jsp spring-mvc redirect view thymeleaf


    【解决方案1】:

    使用这种格式的重定向对我不起作用:

    template/redirect:/mycontroller
    jsp/redirect:/somepage.jsp
    

    我只是用

    定义了另一个视图解析器
    viewNames as redirect*
    

    如下所示处理重定向:

    <beans:bean id="templateEngine"
          class="org.thymeleaf.spring4.SpringTemplateEngine">
      <beans:property name="templateResolver" ref="templateResolver" />
    </beans:bean>
    
    <beans:bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
        <beans:property name="templateEngine" ref="templateEngine" />
      <beans:property name="viewNames" value="thymeleaf/*" />
    </beans:bean>    
    
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="viewNames" value="jsp/*" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>
    
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="viewNames" value="redirect*" />
    </beans:bean>
    

    【讨论】:

      【解决方案2】:

      那是因为你已经在你的 ViewResolver bean 中声明了 viewNames

      <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
          <beans:property name="prefix" value="/WEB-INF/views/" />
          <beans:property name="viewNames" value="jsp/*" />
          <beans:property name="suffix" value=".jsp" />
      </beans:bean>
      
      <beans:bean class="org.thymeleaf.spring3.view.ThymeleafViewResolver">
          <beans:property name="templateEngine" ref="templateEngine" />
          <beans:property name="viewNames" value="template/*" />
      </beans:bean>
      

      viewNames 属性,for Thymeleaf for example,状态

      返回一组名称模式,用于确定是否 控制器返回的视图名称将由此解析器解析 或不。 [...] 另请注意,这些视图名称模式已检查 之前对视图名称应用任何前缀或后缀,因此它们不应包含这些。

      因此,

      "redirect:/mycontroller"
      

      不会被两个ViewResolver bean 中的任何一个解析。您需要在该路径前加上 template/jsp/ 前缀,具体取决于您要执行重定向的 ViewResolver。两者都有这种能力。

      【讨论】:

      • 加前缀的意思是,在redirect:/mycontroller之前加template/或jsp/即“template/redirect:/mycontroller”??
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      • 2016-10-13
      • 2017-06-09
      • 2017-01-01
      相关资源
      最近更新 更多