访问存在的 Servlet 返回 HTTP Status 404 Not Found.
问题
按照 jsp+servlet实现简单登录页面功能Demo_qq_37306786的博客-CSDN博客,基于简单的 jsp 页面和 servelet 做一个登录 demo。
登录页面
登录成功页面
登录 servlet
注释部分为作者 demo 里的代码,测试(账号密码有错和无错都)可以正常返回。我修改的部分,主要加了对账户或者密码是否正确的分别判断。但此时当账号或者密码错误时,页面不是返回登录页面并显示错误信息,而是返回了 404 Not Found 页面。
解决
对比自己的代码和原作者的代码,主要区别在 getRequestDispatcher 方法实参上:
我自己修改的代码,可能是参考了上面账号密码正确跳转的例子:
惯性地认为 getRequestDispatcher 的 path 参数也需要要 contextPath,其实不然。
检查了 sendRedirect 和 getRequestDispatcher 两个方法的定义说明,两者的实参都可以为相对地址,但两者的相对地址参照对象不同。sendRedirect 的相对地址相对的是 servlet 容器的根目录;getRequestDispatcher 的相对地址相对的是当前 context 上下文的根目录。
也就是说,sendRedirect 如果传参相对地址,则需要拼接上 contextPath;而 getRequestDispatcher 直接传当前目录下的地址。
所以,对 getRequestDispatcher 的 path 参数,去除不能要的 contextPath 即可:
特别的
因为新版本使用了 webServlet 注解,可以直接传递 url-pattern 的值到 servlet 中,所以省略了形如以下内容的对 servlet 的配置和映射:
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。