Tomcat 7 постоянно выдает ошибку 404. Что я делаю не так?

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

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.

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

Что я здесь делаю неправильно?


person prometheuspk    schedule 18.01.2012    source источник
comment
А как насчет http://localhost:8080/Serv1/? Также вы должны использовать полное имя в servlet-class с пакетом (надеюсь, ваш сервлет не находится в пакете по умолчанию).   -  person Viruzzo    schedule 18.01.2012
comment
Пожалуйста, покажите нам структуру каталога ch1 и скажите, куда вы его поместили. Также сообщите нам, куда вы поместили этот каталог ch1, и что говорят журналы tomcat. О, и я согласен с Viruzzo: никогда не используйте пакет по умолчанию.   -  person JB Nizet    schedule 18.01.2012
comment
Проверьте имя файла войны (или папки), оно должно быть ch1.   -  person e-zinc    schedule 18.01.2012
comment
Каталог tomcat/logs должен содержать файлы журналов. проверить и поделиться трассировкой стека исключений   -  person Murat Can ALPAY    schedule 18.01.2012
comment
@Viruzzo, к сожалению, я использую пакет по умолчанию. так скажите мне, если мой пакет - это me.firstServlet, то каким будет полное имя?   -  person prometheuspk    schedule 18.01.2012
comment
Предложение: начните с использования IDE (например, Eclipse), настроенной для проектов Java EE, и позвольте ему создать войну для вас; затем вы можете посмотреть на структуру вывода (предположительно полностью работающую) и начать редактирование оттуда, изучая, что что-то делает по частям.   -  person Viruzzo    schedule 18.01.2012
comment
это то, чего я пытаюсь избежать. Я не хочу становиться зависимым от IDE в период обучения   -  person prometheuspk    schedule 18.01.2012


Ответы (2)


Вы должны поместить классы сервлетов в пакет. Работают ли беспакетные сервлеты, зависит от конкретного сочетания старой версии 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, чтобы следовать инструкциям Учебник устарел, отмените его!)

Поместите папку 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, в противном случае он вернется к режиму наименьшей совместимости)

person BalusC    schedule 18.01.2012
comment
Это сработало. Большое спасибо. Мне интересно, что я исправил корневую декларацию, чтобы соответствовать части Tomcat 7, какая это часть? атрибут версии? и не могли бы вы ОПИСАТЬ свои изменения, поскольку, как вы сказали, моя книга устарела (сначала JSP 2008) - person prometheuspk; 18.01.2012
comment
Элемент <web-app>. Ваш был объявлен для Servlet 2.4, а Tomcat - контейнер 3.0. Сервлет 2.4 выпущен в 2003 году. Head First JSP 2008 — это просто переиздание. Кстати, вы можете найти хорошие туториалы на coreservlets.com. Начните с нашей вики-страницы сервлетов stackoverflow.com/tags/servlets/info. Ссылки на уроки доступны внизу. - person BalusC; 18.01.2012
comment
только еще один вопрос. Мне нужно имя для моего адреса 127.0.0.1:8080. Я думаю, это называется псевдонимом. Можете ли вы сказать мне, как это делается или указать мне тут? - person prometheuspk; 18.01.2012
comment
Это называется именем хоста. Вы можете отредактировать его в /etc/hosts файле. Всего одной строки 127.0.0.1 example.com достаточно, чтобы ваша машина воспринимала http://example.com как http://127.0.0.1. Порт не может быть скрыт таким образом. Вам просто нужно перенастроить порт с 8080 (порт веб-разработки по умолчанию) на 80 (порт HTTP по умолчанию) в Tomcat /conf/server.xml. Браузеры неявно используют порт 80 для HTTP-запросов, если он не указан. Если вы застряли, задайте новый вопрос. Это оффтоп. - person BalusC; 18.01.2012

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

<Context docBase="Your_web_apps_directory" path="/ch1" reloadable="false"/>
person xuanyuanzhiyuan    schedule 18.01.2012
comment
внутри какого тега? server, host, realm?? - person prometheuspk; 18.01.2012