Spring MVC - @PathVariable - 找不到资源

时间:2015-05-12 13:16:46

标签: spring spring-mvc java-ee

在我的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

有人可以告诉我这背后的原因吗?

3 个答案:

答案 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 ....