我有以下Spring控制器:
@Controller
public class TypoWorkflowController {
@RequestMapping(value = "/workflow/typo-workflow/moreInfo", method = RequestMethod.GET)
public String serveMoreInfo(@RequestParam(value = "taskId", required=false) String taskId, ModelMap modelMap) {
return "typo-workflow-more-info";
}
}
我的tiles-def文件包含:
<definition name="typo-workflow-more-info" template="/WEB_INF/jsp/workflow/typo-workflow/moreInfo.jsp"/>
我的JSP是普通的旧HTML。
当我点击网址/workflow/typo-workflow/moreInfo
时,Tomcat会抛出StackOverflowError
。
当我在调试模式中单步执行时,我发现我正在按照我的预期首先击中我的控制器,但后来我按下方法击中了另一个控制器:
@Controller
@Order(value = Ordered.LOWEST_PRECEDENCE)
public class ContentServingController {
/* ... */
@RequestMapping({"/*", "/**/*"})
public ModelAndView serveContent(HttpServletResponse response, ModelMap model) {
/* ... */
}
}
当我四处寻找时, seeeeeeemed 就像我们在那里回应/WEB_INF/jsp/workflow/typo-workflow/moreInfo.jsp
的请求一样,但对于在同一个地方运营的其他控制器来说,这不会发生方式(返回视图名称)。
所以,任何人都可以为我提供一些调试指针。为什么我要为JSP打一个控制器呢?是不是JSP本身就是一个小servlet?
答案 0 :(得分:3)
你的tile def指向WEB_INF文件夹,它指向WEB-INF文件夹(短划线而不是下划线)所以spring不知道在应用程序中查看的位置,只是制作一个普通的http请求,它被通配符匹配抓住。