java servlet 返回 web_html – Servlet返回“HTTP状态404请求的资源(/ servlet)不可用”

将servlet类放在包中

首先,将servlet类放在Java包中。您应该总是将公开的可重用的Java类放在包中,否则它们对于包中的类(例如服务器本身)是不可见的。这样,您可以消除潜在的环境特定问题。无包servlet仅在特定的Tomcat JDK组合中工作,这不应该依赖于。

在“纯”IDE项目的情况下,类需要放置在其“Java资源”文件夹中的包结构中,因此不是“WebContent”,这是用于Web文件(如JSP)。下面是导航器视图中所示的默认Eclipse Dynamic Web Project的文件夹结构示例:

EclipseProjectName

|-- src

| `-- com

| `-- example

| `-- YourServlet.java

|-- WebContent

| |-- WEB-INF

| | `-- web.xml

| `-- jsps

| `-- page.jsp

:

在Maven项目的情况下,类需要放在main / java and thus not e.g. main/resources, this is for non-class files中的包结构中。下面是一个默认Maven webapp项目的文件夹结构示例,如Eclipse的Navigator视图中所示:

MavenProjectName

|-- src

| `-- main

| |-- java

| | `-- com

| | `-- example

| | `-- YourServlet.java

| |-- resources

| `-- webapp

| |-- WEB-INF

| | `-- web.xml

| `-- jsps

| `-- page.jsp

:

请注意,/ jsps子文件夹不是绝对必要的。你甚至可以没有它,把JSP文件直接在webcontent / webapp根,但我只是从你的问题接管这一点。

在url-pattern中设置servlet URL

servlet URL被指定为servlet映射的“URL模式”。绝对不是每个定义servlet类的classname / filename。 URL模式将被指定为@WebServlet注释的值。

package com.example; // Use a package!

@WebServlet("/servlet") // This is the URL of the servlet.

public class YourServlet extends HttpServlet { // Must be public and extend HttpServlet.

// ...

}

@WebServlet仅适用于Servlet 3.0或更高版本

为了使用@WebServlet,你只需要确保你的web.xml文件(如果有的话,从Servlet 3.0开始是可选的)被声明为符合Servlet 3.0版本and thus not conform e.g. 2.5 version or lower.下面是一个Servlet 3.1兼容的(与Tomcat 8 ,WildFly 8,GlassFish 4等)。

xmlns="http://xmlns.jcp.org/xml/ns/javaee"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

id="WebApp_ID" version="3.1"

>

或者,如果你不是在Servlet 3.0(不是Tomcat 7或更高版本,但Tomcat 6或更高版本),然后删除@WebServlet注释。

package com.example;

public class YourServlet extends HttpServlet {

// ...

}

然后在web.xml中注册servlet,如下所示:

yourServlet

com.example.YourServlet

yourServlet

/servlet

注意,因此,你不应该使用两种方法。使用基于注释的配置或基于XML的配置。

验证构建/部署

如果你使用一个构建工具,如Eclipse和/或Maven,那么你需要绝对确保编译的servlet类文件驻留在生成的WAR文件的/ WEB-INF / classes文件夹中的包结构中。否则,您将面临HTTP 500错误,如下所示:

HTTP Status 500

Error instantiating servlet class com.example.YourServlet

并在服务器日志中找到一个java.lang.ClassNotFoundException:com.example.YourServlet,后跟一个java.lang.NoClassDefFoundError:com.example.YourServlet,依次是javax.servlet.ServletException:实例化servlet类com。 example.YourServlet。

验证servlet是否正确编译并放置在类路径中的一种简单方法是让构建工具生成WAR文件(例如,右键单击项目,Eclipse中的导出> WAR文件),然后使用ZIP工具检查其内容。如果/ WEB-INF / classes中缺少servlet类,那么项目配置不当或某些IDE /项目配置默认值已被错误地还原(例如,Project> Build Automatically已在Eclipse中禁用)。如果你没有线索,最好是从头开始重新启动,不要触摸任何IDE /项目配置默认值。

单独测试servlet

假设服务器在localhost:8080上运行,并且WAR已成功部署在/ contextname(默认为IDE项目名称,区分大小写!)的上下文路径上,并且servlet未使其初始化失败(读取服务器日志,任何部署/ servlet成功/失败消息以及实际上下文路径和servlet映射),那么可以在http:// localhost:8080 / contextname / servlet处获取带有/ servlet的URL模式的servlet。

你可以直接在浏览器的地址栏中输入它,直接测试它。如果它的doGet()被正确地覆盖和实现,那么你将在浏览器中看到它的输出。或者如果你没有任何doGet()或者如果不正确地调用super.doGet(),那么将会显示一个“HTTP 405: HTTP method GET is not supported by this URL”错误(仍然比404更好,因为405证明servlet本身实际上是发现)。

覆盖服务()是一个坏的做法,除非你重新创造一个MVC框架 – 这是不太可能的,如果你刚刚开始使用servlet,对于当前问题中描述的问题无能为力;)参见Design Patterns web based applications。

无论如何,如果servlet在被invidivually测试时已经返回404,那么尝试使用HTML表单是完全没有意义的。在逻辑上,因此,对于来自servlet的404错误的问题,包括任何HTML表单也是毫无意义的。

从HTML引用servlet URL

一旦您验证了servlet在单独调用时可以正常工作,那么您可以前进到HTML。至于你的HTML表单的具体问题,< form action>值需要是有效的URL。这同样适用于< a href&gt ;.您需要了解绝对/相对网址的工作原理。您知道,网址是一个网址,您可以在浏览器的地址栏中输入/查看。如果您将相对网址指定为表单操作(即没有http://方案),则它会相对于您在网络浏览器地址栏中看到的当前网址。因此,它绝对不是相对于JSP / HTML文件在服务器的WAR文件夹结构中的位置,许多启动者似乎认为。 因此,假设具有HTML表单的JSP页面通过http:// localhost:8080 / contextname / jsps / page.jsp打开,并且您需要提交到位于http:// localhost:8080 / contextname / servlet,这里有几种情况(请注意,您可以在这里用< a href>安全地替换< form action>):

>表单操作提交到带有斜杠的网址。

引号斜线/使URL相对于域,因此表单将提交到

http://localhost:8080/servlet

但这可能会导致404,因为它在错误的上下文。

>表单操作提交到不带斜杠的网址。

这使得URL相对于当前URL的当前文件夹,因此表单将提交到

http://localhost:8080/contextname/jsps/servlet

但这可能会导致404,因为它在错误的文件夹。

>表单操作提交到一个文件夹向上的URL。

这将向上一个文件夹(完全像本地磁盘文件系统路径!),因此表单将提交到

http://localhost:8080/contextname/servlet

这一个必须工作!

>然而,规范的方法是使URL相对的,这样你不需要在将JSP文件移动到另一个文件夹时再次修复URL。

这将产生

因此,它将始终提交到正确的URL。

在HTML中使用直引号

你需要确保你在HTML属性中使用直引号,例如action =“…”或action =’…’,因此不要使用像action =“…”或action =’…这样的引号。 。’。 HTML不支持卷曲报价,它们将只是成为值的一部分。

也可以看看:

HTTP状态404错误的其他情况:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值