我正在尝试使用Spring的“forward:”前缀将从一个Controller收到的请求转发给第二个Controller。但是,不是像我期望的那样将请求转发到第二个控制器,而是由第一个控制器反复处理请求(直到我收到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>
答案 0 :(得分:1)
我认为问题出在你所说的InternalResourceViewResolver
上。因为这个viewResolver的内部逻辑,它会自动执行转发,你可以配置另一种viewResolver:UrlBasedViewResolver。
以下是我在官方文件中找到的信息:
也可以为视图名称使用特殊的forward:前缀 最终由UrlBasedViewResolver和子类解决。 这会创建一个 InternalResourceView (最终会创建一个 RequestDispatcher.forward())围绕视图名称的其余部分 被视为URL。因此,此前缀无用 InternalResourceViewResolver 和InternalResourceView(例如用于JSP)。但是,当你主要是前缀时,前缀可能会有所帮助 使用另一种视图技术,但仍然想强制推进一个 Servlet / JSP引擎要处理的资源。 (请注意,你可以 也可以链接多个视图解析器。)