servlet 3.x中注释出错

时间:2015-12-14 14:30:05

标签: jsp servlets http-status-code-404 welcome-file

这是我的路径

 <welcome-file>home</welcome-file>

和我的servlet,我在下面声明了urlpattern

@WebServlet(urlPatterns="/home")

并转发到文件homeview.jsp

        RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher("/SimpleWebApp/WebContent/WEB-INF/views/homeview.jsp");
dispatcher.forward(request, response);

但是当我运行我的网络应用程序时,它的错误状态为htttp 404 anyboby,帮我解决一下吗?感谢alot

2 个答案:

答案 0 :(得分:2)

您的代码运行正常。但是,

与项目结构中的以下内容类似,您可以通过这种方式访问​​它。

HomeController(yourServlet)

request.getRequestDispatcher("/WEB-INF/views/homeview.jsp").forward(request, response);

结构

WebContent
       |
       |__static
       |
       |__WEB-INF
              |__lib
              |__views/homeview.jsp
              |__web.xml

答案 1 :(得分:0)

欢迎文件只能是静态文件,例如jsp或html文件,它不能指定servlet。

如果您希望servlet充当欢迎页面,则应将其映射设置为/ *,这使其成为默认的servlet。所以在你的注释中:

@WebServlet(URL模式= “/ *”)

这样,只要收到一个不映射到任何其他资源的请求,就会调用servlet。

此外,您还需要修正转发请求,以指定相对于应用内容根的网址,如另一个答案中所示。

作为参考,这是映射如何根据servlet规范工作(本文取自Servlet 3.0规范的第12.1节):

  1. 容器将尝试查找请求路径与servlet路径的完全匹配。成功匹配选择servlet。

  2. 容器将递归尝试匹配最长的路径前缀。这是通过使用'/'字符作为路径分隔符一次单击目录的路径树来完成的。最长的匹配决定了所选的servlet。

  3. 如果URL路径中的最后一个段包含扩展名(例如.jsp),则servlet容器将尝试匹配处理扩展请求的servlet。扩展名被定义为最后一个'。'字符后的最后一个分段的一部分。

  4. 如果前三个规则都没有导致servlet匹配,则容器将尝试提供适合所请求资源的内容。如果为应用程序定义了“默认”servlet,则将使用它。许多容器提供了用于提供内容的隐式默认servlet。