1

我正在尝试使用 Spring 的“转发:”前缀将从一个控制器收到的请求转发到第二个控制器。但是,不是像我期望的那样将请求转发到第二个控制器,而是由第一个控制器一遍又一遍地处理请求(直到我收到 StackOverflowError)。这让我认为它可能会将“/app/pong”视为某种相对路径,但我不确定为什么会这样。我是否误解了“前进:”应该如何工作?有什么我在这里想念的吗?

控制器:

@Controller
public class ControllerOne {
  @RequestMapping(value = "/ping", method = RequestMethod.GET)
  public String doPing(HttpServletRequest request) {
    log.debug("Ping?");
    return "forward:/app/pong";
  }
}

@Controller
public class ControllerTwo {
  @RequestMapping(value = "/pong", method = RequestMethod.GET)
  public String doPong(HttpServletRequest request) {
    log.debug("Pong!");
    return "pong";
  }
}

servlet 映射:

<servlet-mapping>
  <servlet-name>test-servlet</servlet-name>
  <url-pattern>/app/*</url-pattern>
</servlet-mapping>

查看解析器:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/jsp/" />
  <property name="suffix" value=".jsp" />
</bean>
4

1 回答 1

1

我认为问题InternalResourceViewResolver在于您配置的问题。因为这个viewResolver的内部逻辑,它会自动转发,你可以配置另外一种viewResolver:UrlBasedViewResolver。
以下是我在官方文档中找到的信息:

也可以为最终由 UrlBasedViewResolver 和子类解析的视图名称使用特殊的 forward: 前缀。这将围绕视图名称的其余部分创建一个InternalResourceView(最终执行 RequestDispatcher.forward()),这被认为是一个 URL。因此,此前缀对InternalResourceViewResolver和 InternalResourceView没有用 (例如,对于 JSP)。但是,当您主要使用另一种视图技术,但仍希望强制转发资源以由 Servlet/JSP 引擎处理时,前缀可能会有所帮助。(请注意,您也可以链接多个视图解析器。)

于 2013-03-26T06:44:14.740 回答