在我的Spring MVC演示项目中,我正在使用路径变量注释。 控制器如下所示。
@Controller
@RequestMapping(value = {"/", "/login"})
public class HelloWorldController {
@RequestMapping(method = RequestMethod.GET)
public String helloWorld(final Model model) {
model.addAttribute("message", "Hello World!");
System.out.println("hello world");
return "jsp/login.jsp";
}
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String getLoginId(@PathVariable final int id, final Model model) {
model.addAttribute("message", "Hello World!");
System.out.println("hello world 2" + id);
return "jsp/login.jsp";
}
}
现在,当我尝试访问以下网址时 http://localhost:9080/ExampleSpring/login 控制器将进入login.jsp页面。这是预期的结果。
但是当网址更改为 http://localhost:9080/ExampleSpring/login/9 我收到以下错误和java.io.FileNotFoundException:JSPG0036E:无法找到资源/login/jsp/login.jsp
有人可以告诉我这背后的原因吗?
答案 0 :(得分:1)
实际上我想这可能是一个原因和解决方案..我猜对于前一种情况即。 http://localhost:9080/ExampleSpring/login 它尝试在WEB-INF内部的上下文根之后查找资源。但在后一种情况下,它会在第二次/之后/登录时发生,它会尝试在WEB-INF / login文件夹中查找实际上不存在的资源,从而出现错误。
Soulution可以,使用" ../ jsp / login.jsp"这将强制从上下文根检查资源。什么长的请求字符串你可以传递这将确保从上下文根搜索资源。 也许这就是为什么要避免这种混乱春天提出了View Resolver。 如果我错了,请纠正我。
谢谢大家。
答案 1 :(得分:0)
如果我正确理解了您的评论,则您没有配置视图解析程序,因此您只需转发到作为视图名称传递的视图。
由于您没有初始/
,因此您会陷入相对网址的困境。在这种情况下,你应该写:
return "/jsp/login.jsp";
如果视图位于/WEB-INF/jsp/login.jsp
BTW,ViewResolvers
的原因(简单重构等)可以将/jsp/
添加为前缀,.jsp
作为后缀。所以恕我直言,你真的应该考虑在你的配置中添加一个。
答案 2 :(得分:-1)
我认为你应该把:
....@PathVariable("id") int id ....