1

这是我的路

 <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 错误,请帮我修复它?非常感谢

4

2 回答 2

2

您的代码工作正常。但,

就像项目结构中的下面一样,您可以通过这种方式访问​​它。

HomeController (你的Servlet)

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

结构

WebContent
       |
       |__static
       |
       |__WEB-INF
              |__lib
              |__views/homeview.jsp
              |__web.xml
于 2015-12-14T15:13:11.560 回答
0

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

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

@WebServlet(urlPatterns="/*")

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

此外,您需要修复转发请求以指定相对于应用程序内容根目录的 url,如另一个答案所示。

作为参考,这是根据 servlet 规范进行映射的工作方式(本文摘自 Servlet 3.0 规范的第 12.1 节):

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

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

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

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

于 2015-12-14T16:57:39.217 回答