【问题标题】:servlet application does not work, although tomcat works correctlyservlet 应用程序不工作,虽然 tomcat 工作正常
【发布时间】:2016-10-31 11:32:27
【问题描述】:

我已经在 ubuntu 上的 tomcat 目录下安装了 Apache Tomcat。我通过导出为单个会话设置了CATALINA_HOME 环境变量。然后我通过$CATALINA_HOME/bin/startup.sh从命令行启动tomcat。一切都运作良好。我看到了tomcat官方页面,假设服务器安装正确。然后我在

下创建了一个带有单个 servlet 的 webb 应用程序
$CATALINA_HOME/webaps/apress/ 

目录。

import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class HelloWorldServlet extends HttpServlet
{
    public void doGet(HttpServletRequest request,
          HttpServletResponse response)
          throws IOException, ServletException
    {
        response.setContentType("text/html");
        PrintWriter out=response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>hello, world</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1> hello world</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

然后我编译了文件

javac -cp HelloWorldServlet.java -d ./classes -cp $CATALINA_HOME/bin/servlet-api.jar

编译成功,将class文件放入应用程序根目录的classes子目录中。

然后我编辑了 web.xml 文件。

<?xml version ="1.0" encoding ="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns.xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http:/java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
    <display-name>Chapter 2</display-name>
    <description> Apress demo</description>
    <servlet>
        <servlet-name>helloworld</servlet-name>
        <servlet-class>HelloWorldServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>helloworld</servlet-name>
        <url-pattern>/hello.html</url-pattern>
    </servlet-mapping>
</web-app>

然后我重新启动了 Tomcat。但是当我尝试通过访问时

http://localhost:8080/apress/hello.html

我收到 Http 状态 404 消息。我做错了什么?

【问题讨论】:

  • 你能输入“echo $CATALINA_HOME”并将结果放在这里吗?另外,你能告诉我们你在 Tomcat 和 Catalina Home 下的目录布局吗?

标签: java tomcat servlets


【解决方案1】:

我建议您首先尝试在 Netbeans 或 Eclipse 等 IDE 中构建应用程序,然后研究自动生成的配置文件。

【讨论】:

    【解决方案2】:

    查看你的tomcat目录有一个logs目录。停止Tomcat。删除所有日志文件并重新启动 tomcat 并点击该 URL。查看日志(主要是访问日志和catalina.out)。首先在其中查找错误。

    您可能还想考虑使用@WebServlet 而不是编辑 web.xml,现代版本的 tomcat 可以识别带有此注释的类并自动将它们注册为 servlet。

    @WebServlet(name="HelloWorld", urlPatterns={"/hello.html"})
    public class HelloWorldServlet extends HttpServlet {
    
    }
    

    另外,您如何将此 servlet 部署为 WAR 文件?

    【讨论】:

    • 我查看了目录,有一堆文件,我把它们都删除了,然后在 catalina.out 里面看了看,但什么也没明白,但我猜有错误。你能帮我吗?
    • 发布文件的内容(它不应该太大,因为你刚刚重新启动它并且只运行了 1 个 url)。另外,您如何将 .class 文件放入 tomcat 中?您是创建 WAR 文件还是手动将其复制到 classes 目录?
    • 严重:第 19 行第 4 列解析致命错误:元素类型“servlet-class”必须由匹配的结束标记“”终止。 org.xml.sax.SAXParseException; systemId: jndi:/localhost/apress/WEB-INF/web.xml;行号:19;列号:4;元素类型“servlet-class”必须由匹配的结束标记“”终止 我编辑了 web.xml 但出现错误 kepps
    • 该错误表明 web.xml 存在 XML 错误。转到第 19 列第 4 列,并确保打开的 XML 标记具有匹配且拼写正确的关闭标记。
    【解决方案3】:

    有两种可能。根据你写的,你创建应用程序的目录是:

    $CATALINA_HOME/webaps/apress/
    

    应该是这样的

    $CATALINA_HOME/webapps/apress/
    

    但我猜它只是一个typeO。

    第二件事是你应该复制编译好的文件

    HelloWorldServlet.class 
    

    apress/WEB-INF/classes
    

    目录,或者直接编译java文件到这个目录

    【讨论】:

    • 是的,你对 webapps 的看法是正确的,我将 .class 文件编译到 classes 目录中
    • 按照你写的,编译到HelloWorldServlet.java同目录下的/classes。根据某些要求,您应该在 CATALINA_HOME 下发布您的目录结构
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多