我在Mac OSX上。这是我的第一个Servlet。我有Tomcat 8.0.14
我创建了一个Servlet,只需通过HTTP POST方法获取三个参数。这个 是我的Servlet:
HelloWorld.java:
package com.hello.world;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloWorld extends HttpServlet {
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) {
String fname = request.getParameter("fname");
String mname = request.getParameter("mname");
String lname = request.getParameter("lname");
response.setContentType("text/html");
try (PrintWriter out = response.getWriter()) {
out.println("<center><h1>HelloWorld!<br></h1>");
out.println("<h2>" + (fname != null ? fname : "") + " "
+ (mname != null ? mname : "") + " "
+ (lname != null ? lname : "") + "</h2></center>");
} catch (IOException exception) {
exception.printStackTrace();
}
}
}
代码编译正确,我已将编译后的类文件放在默认的webapps/ROOT/WEB-INF/classes
目录中:
/Library/Java/Tomcat/webapps/ROOT/WEB-INF/classes/com/hello/world/HelloWorld.class
然后我将 web.xml 文件作为:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>com.hello.world.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/controller.do</url-pattern>
</servlet-mapping>
</web-app>
我已将此文件放在默认的webapps/ROOT/WEB-INF/
目录中:
/Library/Java/Tomcat/webapps/ROOT/WEB-INF/web.xml
然后我将index.html
作为:
<!DOCTYPE html>
<html>
<head>
<title>Hello, World!</title>
</head>
<body>
<form method="POST" action="controller.do">
<center>
<table>
<tr align="right">
<td><label for="fname">Firstname:</label></td>
<td><input type="textfield" name="fname"></td>
</tr>
<tr align="right">
<td><label for="mname">Middlename:</label></td>
<td><input type="textfield" name="mname"></td>
</tr>
<tr align="right">
<td><label for="lname">Lastname:</label></td>
<td><input type="textfield" name="lname"></td>
</tr>
</table>
<input type="submit" value="Post this stupid form">
</center>
</form>
</body>
</html>
我已将此文件放在默认的webapps/ROOT/
目录中:
/Library/Java/Tomcat/webapps/ROOT/index.html
当我输入localhost:8080/index.html
时,HTML会加载,我可以正确发布表单并获得所需的输出。
这很好用。
但是当我创建一个名为HelloWorld
的单独目录并在其中移动这三个文件时,我的目录结构就像这样:
/Library/Tomcat/webapps/ROOT
|
|->HelloWorld
|
|->index.html
|->WEB-INF
|
|->web.xml
|->classes
|
|->com
|->hello
|->world
|->HelloWorld.class
并输入localhost:8080/HelloWorld
,HTML加载正常。但是当我发布表格时,它会说
HTTP Status 404 - /HelloWorld/controller.do
type Status report
message /HelloWorld/controller.do
description The requested resource is not available.
Apache Tomcat/8.0.14
我无法弄清问题是什么。是因为我创建了一个单独的目录吗?但我认为那不应该。我需要帮助。我如何使这个工作?
答案 0 :(得分:2)
听起来像你在ROOT下有HelloWorld文件夹,比如webapps/ROOT/HelloWorld/
webapps/ROOT/HelloWorld/WEB-INF/web.xml
中的web.xml和webapps/ROOT/HelloWorld/WEB-INF/classes/...
中的类,它不会像那样工作。
webapps
下的每个文件夹都是自己的独立应用,只能激活一个web.xml。因此,ROOT
是一个只会在webapps/ROOT/WEB-INF/web.xml
中使用webapps/ROOT/WEB-INF/classes/...
webapps/HelloWorld
处的web.xml的网络应用程序
如果您有另一个文件夹webapps/HelloWorld/WEB-INF/web.xml
,它会在webapps/HelloWorld/WEB-INF/classes/...
中使用HelloWorld
这是正常的做法。
但是会话不是跨应用共享的。所以这样做,root将拥有自己的会话,而HelloWorld将拥有自己的会话。
所以,如果你真的需要webapps/ROOT/WEB-INF/web.xml
在root下,那么你必须在webapps/ROOT/WEB-INF/classes/...
的web.xml中定义你的servlet并直接将你的类文件放在WEB-INF中在root下: <servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld/controller.do</url-pattern>
</servlet-mapping>
然后你必须在web.xml中定义url-pattern(至少理论上我觉得这样可行):
{{1}}