Tomcat 7 продолжает давать мне 404. Что я делаю не так? - PullRequest
3 голосов
/ 18 января 2012

это мой первый в истории сервлет. вот код.

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Ch1Servlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    PrintWriter out = response.getWriter();
    java.util.Date today = new java.util.Date();
    out.println("<html> " +"<body>" +"<h1 align=center>HF\'s Chapter1 Servlet</h1>" +" " + "<br>" + today + "</body>" + "</html>");
    }
}

Я скомпилировал его с помощью этой команды javac -classpath /usr/share/tomcat7/common/lib/servlet-api.jar -d classes src/Ch1servlet.java
Затем я помещаю файл .class в папку классов в папке WEB-INF.

Вот мой web.xml

<?xml version="1.0" encoding="ISO-8859-1" ?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
    <servlet>
        <servlet-name>Chapter1 Servlet</servlet-name>
        <servlet-class>Ch1Servlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Chapter1 Servlet</servlet-name>
        <url-pattern>/Serv1</url-pattern>
    </servlet-mapping>
</web-app>

Tomcat7 продолжает давать мне 404 на http://127.0.0.1:8080/ch1/Serv1/, говоря The requested resource (/ch1/Serv1/) is not available.

Дерево файлов: File Tree

Что я здесь не так делаю?

Ответы [ 2 ]

6 голосов
/ 18 января 2012

Вы должны поместить классы сервлетов в пакет. Работают ли сервлеты без пакетов, зависит от конкретной комбинации более старой версии Tomcat и JVM. Если вы видите этот пример в книге / учебнике, то он, безусловно, сильно устарел.

package com.example;

// ...

public class Ch1Servlet extends HttpServlet {
    // ...
}

У вас должен быть файл /com/example/Ch1Servlet.java. Скомпилируйте его следующим образом

javac -classpath /usr/share/tomcat7/common/lib/servlet-api.jar -d classes src/com/example/Ch1servlet.java

(мне, однако, интересно, что там делает библиотека common, это было типично для Tomcat 4.x / 5.x, но ее нет со времен Tomcat 6. Если вы вручную изменили структуру Tomcat, чтобы следуйте инструкциям устаревшего учебника, отменить it!)

Поместите папку com с сгенерированным классом по его объему в папку /WEB-INF/classes вашего веб-приложения. Таким образом, вы должны иметь /WEB-INF/classes/com/example/Ch1Servlet.class.

Затем отредактируйте /WEB-INF/web.xml, указав полное имя (FQN) класса сервлета в <servlet-class>:

<?xml version="1.0" encoding="UTF-8"?>
<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" 
>
    <servlet>
        <servlet-name>Chapter1 Servlet</servlet-name>
        <servlet-class>com.example.Ch1Servlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Chapter1 Servlet</servlet-name>
        <url-pattern>/Serv1</url-pattern>
    </servlet-mapping>
</web-app>

(обратите внимание, что я также исправил декларацию root для соответствия поддерживаемой версии сервлета Tomcat 7, в противном случае использовался бы режим наименьшей совместимости)

0 голосов
/ 18 января 2012

Вы должны настроить свой контекст ch1 в файле server.xml следующим образом:

<Context docBase="Your_web_apps_directory" path="/ch1" reloadable="false"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...