【问题标题】:Error with Annotation in servlet 3.xservlet 3.x 中的注释错误
【发布时间】:2016-03-20 01:50:59
【问题描述】:

这是我的路

 <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);

但是当我运行我的网络应用程序时,它会出现 404 状态错误 anyboby,帮我修一下吗?非常感谢

【问题讨论】:

  • 整个404错误是什么?
  • 请求的资源不可用。
  • 您能解决问题吗?
  • 我正在关注 Gurkan 的帖子,但它仍然出错
  • 你现在遇到什么错误?

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


【解决方案1】:

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

像下面的项目结构中,可以这样访问。

HomeController (你的Servlet)

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

结构

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

【讨论】:

  • 你说得对。我试了一下,它适用于 Jetty。我会说一点英语。写作更糟糕:)对不起。我写信不是为了自己尝试。
  • 谢谢,但我没有使用Jetty,我只是学习了几天的servler和jsp,我不知道如何使用jetty。我想使用注释
【解决方案2】:

欢迎文件只能是静态文件,例如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 来提供内容。

【讨论】:

  • 我修复了 done.error 不在代码和结构项目中。我检查了我的 homview.jsp 并发现它在这里出错(我包括 _fooder 和 _header 用于 homeview 但它出错)。谢谢大家!
猜你喜欢
  • 2013-01-30
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 2015-10-22
  • 2011-02-02
  • 2021-06-19
  • 1970-01-01
相关资源
最近更新 更多