2010-10-24 3 views
7

Будучи несколько ленивым, я был очень рад найти, что я могу создать новый исходный код сервлета, перейдя в New -> Servlet, вместо того, чтобы идти New -> Class, а затем редактируя класс в сервлет.Почему создание сервлетов в Eclipse нарушает мой web.xml?

Однако я обнаружил, что каждый раз, когда я создаю новый сервлет в Eclipse, Eclipse изменяет мой web.xml.

В частности, он модифицирует верхний элемент: (. Переносами Mine)

<web-app 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:javaee="http://java.sun.com/xml/ns/javaee" 
    xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
    id="WebApp_ID" version="2.4"> 

Это, кажется, не обязательно плохо, но затем она изменяет различные суб-элементы, поставив «JavaEE: «перед их именем, чтобы указать, что эти элементы принадлежат этому пространству имен.

Например, он изменяет

<display-name>ShowLifecycles</display-name> 

в

<javaee:display-name>ShowLifecycles</javaee:display-name> 

После чего затмить затем жалуется на все элементы его измененными, давая мне нотации, как:

cvc-complex-type.2.4.a: Invalid content was found starting with element 'javaee:display-name'. One of '{"http:// 
java.sun.com/xml/ns/j2ee":description, "http://java.sun.com/xml/ns/j2ee":display-name, "http://java.sun.com/xml/ns/ 
j2ee":icon, "http://java.sun.com/xml/ns/j2ee":distributable, "http://java.sun.com/xml/ns/j2ee":context-param, "http:// 
java.sun.com/xml/ns/j2ee":filter, "http://java.sun.com/xml/ns/j2ee":filter-mapping, "http://java.sun.com/xml/ns/ 
j2ee":listener, "http://java.sun.com/xml/ns/j2ee":servlet, "http://java.sun.com/xml/ns/j2ee":servlet-mapping, "http:// 
java.sun.com/xml/ns/j2ee":session-config, "http://java.sun.com/xml/ns/j2ee":mime-mapping, "http://java.sun.com/xml/ns/ 
j2ee":welcome-file-list, "http://java.sun.com/xml/ns/j2ee":error-page, "http://java.sun.com/xml/ns/j2ee":jsp-config, "http:// 
java.sun.com/xml/ns/j2ee":security-constraint, "http://java.sun.com/xml/ns/j2ee":login-config, "http://java.sun.com/xml/ns/ 
j2ee":security-role, "http://java.sun.com/xml/ns/j2ee":env-entry, "http://java.sun.com/xml/ns/j2ee":ejb-ref, "http:// 
java.sun.com/xml/ns/j2ee":ejb-local-ref, "http://java.sun.com/xml/ns/j2ee":service-ref, "http://java.sun.com/xml/ns/ 
j2ee":resource-ref, "http://java.sun.com/xml/ns/j2ee":resource-env-ref, "http://java.sun.com/xml/ns/j2ee":message- 
destination-ref, "http://java.sun.com/xml/ns/j2ee":message-destination, "http://java.sun.com/xml/ns/j2ee":locale- 
encoding-mapping-list}' is expected. 

Для того, чтобы что хуже, когда я использую find и replace, чтобы удалить все, чтобы «javaee:», который помещает файл, Eclipse все еще жалуется на них, даже если их больше нет. Я должен скопировать и вставить весь оставшийся файл поверх себя, чтобы эти жалобы исчезли.

Я уверен, что Eclipse пытается быть полезным, предвосхищая некоторое желание или потребность в этом пространстве имен. Как я могу сделать одну из двух вещей:

  1. Заставить это делать?

  2. Воспользуйтесь тем, что он пытается сделать, и заставьте его работать вместо меня вместо меня?

+0

Это одна из веских причин избегать волшебников Eclipse. –

+0

Можете ли вы использовать сервлет 3.0? – Bozho

+0

@Bozho - Я новичок, когда дело доходит до сервлетов. Я, вероятно, мог бы использовать сервлет 3.0, но я даже не знаю, какую версию я использую (я думаю, последняя), или как сказать ей использовать другую версию. –

ответ

11

Я никогда не видел этого раньше, но это указывает на то, что ваш проект Eclipse действительно испорчен. По крайней мере, корневая декларация web.xml не дает полного смысла. Он выглядит как сочетание спецификаций Servlet 2.4 и 2.5. Возможно, Eclipse запутывается, потому что корневое пространство имен (xmlns) указывает на Servlet 2.4 (с j2ee URI), в то время как сам веб-проект установлен как Servlet 2.5 или новее (который должен использоваться с javaee URI).

Кроме того, если ваш веб-проект установлен в сервлет 3.0 во время создания, по умолчанию не web.xml не будет генерироваться Затмением из-за новый Servlet 3.0 аннотаций как @WebServlet, @WebFilter и т.д .. что делает web.xml излишним. Когда вы создаете новые сервлеты на New> Servlet, Eclipse уже будет автогенерировать эти аннотации. Возможно, вы попытались создать web.xml самостоятельно на основе дезинформации.

Я предлагаю вам при необходимости создать резервную копию кода, выбросить весь проект и создать новый с соответствующими настройками и не касаться объявления корня web.xml.

Предполагая, что вы используете последнюю версию Eclipse, Helios SR1 для разработчиков Java EE, RightClick в Eclipse Project Explorer выберите New> Dynamic Web Project и просто заполнить имя проекта и сохранить все по умолчанию. Нажмите Далее до последнего шага, а затем отметьте галочкой Создайте дескриптор развертывания web.xml, чтобы Eclipse сгенерировал его. Корневая декларация должна выглядеть следующим образом:

<web-app 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    id="WebApp_ID" version="3.0"> 
+0

Думаю, вы это назвали. Моя книга о JSP довольно старая, и некоторые другие обучающие материалы, на которые я смотрел, были довольно старыми. Я создавал web.xml, потому что все они мне инструктировали. Я видел аннотации в сервлете Eclipse, которые были созданы и прочитаны где-то, что это означало, что web.xml не нужен, но тогда новые сервлеты не работали без добавления после исправления взлома web.xml для старых. Я попробую сделать это. :-) –

+0

Это работает, кроме одного: как включить сервлеты в тег ? Например, теперь у меня есть TableServlet, но если я поставлю в JSP , я получаю эту ошибку: Несколько аннотаций, найденных в этой строке: \t - Фрагмент "/TableServlet»не был найден при ожидаемом пути/SamsTeachYourselfJSP_2/ \t WebContent/TableServlet \t - Фрагмент "/ TableServlet" не найден при ожидаемом пути/SamsTeachYourselfJSP_2/ \t WebContent/TableServlet –

+1

Это еще одна проблема. Eclipse JSP/EL синтаксис синтаксиса [epic fail] (https://bugs.eclipse.org/bugs/buglist.cgi?quicksearch=jsp+el). Просто игнорируйте и запускайте его. Вы увидите, что он работает. Вы можете отключить этот ужасный JSP-валидатор в prefs Eclipse. Связанные вопросы: http://stackoverflow.com/questions/1790749, http://stackoverflow.com/questions/2268153, http://stackoverflow.com/questions/2975168, etc..etc .. – BalusC

1

У меня была аналогичная проблема. Я привел веб-приложение из старого Tomcat 6/Java 6 в Tomcat 7/Java 7. Я скопировал и вставил существующий объект web.xml в новый 3.0 web.xml 3.0. Все было нормально, пока я не добавил сервлет с параметрами init-param, display-name, description и load-on-startup. Eclipse пометили эти параметры как сломанные «недопустимым содержимым, найденным в ...». Благодаря stackoverflow я обнаружил, что load-on-startup должен был появиться после init-params, но только RTFM для того, как они знали. Мои другие параметры по-прежнему были отмечены как сломанные. Это то, что заголовок web.xml выглядит, когда она была сломана:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
version="3.0"> 

Я изменил DTDs на нс/j2ee и веб-app_2_5.xsd и Ecliupse перестал жаловаться. Но его 2014 год, и мы скоро переедем в Tomcat 8. Так что я сильно вырыл и нашел документы. В веб-приложение 3.0 параметры должны быть в таком порядке:

  1. Jee: descriptionGroup = любой комбо из 3 Params: описание, дисплей-имя, значок
  2. сервлет-имя
  3. выбрал 1: сервлета -класс или JSP-файл
  4. п числа Init-Params
  5. нагрузка на старте
  6. опция: включена, асинхронная при поддержке, вводный в качестве, безопасность-ролевого реф, многочастная-конфигурация

Как только я поместил свои параметры в порядок, Eclipse был доволен ns/javaee и web-app_3_0.xsd.

+0

Вот исходное исправление stackoverflow для проблемы [] (http://stackoverflow.com/questions/5175034/strange-web-xml-error). Здесь я нашел [определение jee: descriptionGroup] (http://schemas.stylusstudio.com/j2ee50/n7e2eaf6a/group_descriptionGroup.html). Верхний уровень dtd на (aka servletType) [web-common_3_1.xsd] (http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/web-common_3_1.xsd) –

0

Убедитесь, что файл web.xml начинается с тега с последующим тегом

<?xml version="1.0" encoding="UTF-8"?> 

В моем случае я DOCTYPE тег и удаление DOCTYPE тег из web.xml очищенную мне эту ошибку,

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >

1

Переместить «display-name» в качестве первого элемента в теге «servlet», ошибка проверки должна исчезнуть.

Смежные вопросы