将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> ;.您需要了解绝对/相对网址的工作原理。您知道,网址是一个网址,您可以在浏览器的地址栏中输入/查看。如果您将相对网址指定为表单操作(即没有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错误的其他情况: