这是我的路径
<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
答案 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节):
容器将尝试查找请求路径与servlet路径的完全匹配。成功匹配选择servlet。
容器将递归尝试匹配最长的路径前缀。这是通过使用'/'字符作为路径分隔符一次单击目录的路径树来完成的。最长的匹配决定了所选的servlet。
如果URL路径中的最后一个段包含扩展名(例如.jsp),则servlet容器将尝试匹配处理扩展请求的servlet。扩展名被定义为最后一个'。'字符后的最后一个分段的一部分。
如果前三个规则都没有导致servlet匹配,则容器将尝试提供适合所请求资源的内容。如果为应用程序定义了“默认”servlet,则将使用它。许多容器提供了用于提供内容的隐式默认servlet。