Tomcat上的Servlet:找不到请求的资源

时间:2014-10-08 12:44:31

标签: java tomcat servlets

我在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  

我无法弄清问题是什么。是因为我创建了一个单独的目录吗?但我认为那不应该。我需要帮助。我如何使这个工作?

1 个答案:

答案 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

中的类读取web.xml

这是正常的做法。

但是会话不是跨应用共享的。所以这样做,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}}