2010-10-24 20 views
7

Siendo un poco flojo, me alegré mucho de encontrar que podía crear un código fuente de servlet nuevo yendo Nuevo -> Servlet, en lugar de ir Nuevo -> Clase y luego editando la clase en un servlet.¿Por qué crear Servlets en Eclipse está rompiendo mi web.xml?

Sin embargo, he descubierto que cada vez que creo un nuevo servlet en Eclipse, Eclipse modifica mi web.xml.

Específicamente, se modifica el elemento superior a: (. Saltos de línea de minas)

<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"> 

Esto no parece necesariamente malo, pero entonces se modifica varios sub-elementos, poniendo "JavaEE: "delante de su nombre, para indicar que estos elementos pertenecen a ese espacio de nombres.

Por ejemplo, cambia

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

a

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

Después de lo cual eclipsa a continuación, se queja de todos los elementos que ha modificado, y me da notaciones como:

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. 

Para hacer Lo que es peor, cuando uso find y replace para eliminar todo en "javaee:" que ensucia el archivo, Eclipse todavía se queja de esto aunque ya no esté allí. Debo copiar y pegar todo el archivo restante para que desaparezcan.

Estoy seguro de que Eclipse está tratando de ser útil, anticipándose a algún deseo o necesidad de este espacio de nombres. ¿Cómo puedo hacer una de estas dos cosas:

  1. Hacer que deje de hacer esto?

  2. Aproveche lo que sea que esté tratando de hacer, y hágalo funcionar para mí en lugar de contra mí?

+0

este es un buen motivo para evitar los asistentes de Eclipse –

+0

¿Se puede usar servlet 3.0? – Bozho

+0

@Bozho - Soy un principiante cuando se trata de servlets. Probablemente podría usar servlet 3.0, pero ni siquiera sé qué versión estoy usando actualmente (creo que es la última) o cómo decirle que use una versión diferente. –

Respuesta

11

Nunca he visto esto antes, pero esto indica que su proyecto Eclipse está realmente en mal estado. Al menos la declaración de raíz web.xml no tiene sentido. Parece una mezcla de especificaciones de Servlet 2.4 y 2.5. Tal vez Eclipse se confunde porque el espacio de nombres raíz (xmlns) apunta al Servlet 2.4 (con j2ee URI) mientras que el proyecto web en sí está configurado como Servlet 2.5 o posterior (que debería estar usando el que tiene javaee URI).

Además, cuando su proyecto web se establece en Servlet 3.0 durante la creación, por defecto sin web.xml serán generados por Eclipse debido a la nueva Servlet 3.0 anotaciones como @WebServlet, @WebFilter, etc .. que hace que el web.xml superfluo. Cuando crea nuevos servlets por Nuevo> Servlet, Eclipse ya generará automáticamente esas anotaciones. Probablemente haya intentado crear el web.xml basándose en información errónea.

Sugiero que haga una copia de seguridad del código si es necesario, descarte todo el proyecto y cree uno nuevo con la configuración adecuada y no toque la declaración de raíz web.xml.

Suponiendo que usted está utilizando la última versión de Eclipse, Helios SR1 para los desarrolladores de Java EE, Explorador de proyectos de Eclipse botón derecho del ratón, elija Nuevo> Proyecto Web dinámico y sólo tiene que rellenar el nombre del proyecto y mantener todo por defecto. Haga clic en Siguiente hasta el último paso y luego marque Genere el descriptor de despliegue web.xml casilla de verificación para permitir que Eclipse genere uno. La declaración raíz debería verse así:

<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

Creo que lo has llamado. Mi libro sobre JSP es bastante antiguo y algunos otros tutoriales que observé eran bastante antiguos. Estaba creando el web.xml porque todos me lo pidieron. Vi las anotaciones en el servlet Eclipse creado y leí en alguna parte que esto significaba que el web.xml no era necesario, pero los nuevos servlets no funcionaban sin ser agregados después de arreglar el web.xml de ruptura para los antiguos. Voy a intentar esto en el futuro. :-) –

+0

Eso funciona, excepto una cosa: ¿cómo debo incluir servlets en una etiqueta ? Por ejemplo, ahora tengo un TableServlet, pero si pongo en el JSP, obtengo este error: Múltiples anotaciones encontradas en esta línea: \t - Fragmento "/TableServlet" no se encontró en la ruta esperada/SamsTeachYourselfJSP_2/ \t WebContent/TableServlet \t - Fragmento "/ TableServlet" no se espera encontrar en ruta/SamsTeachYourselfJSP_2/ \t WebContent/TableServlet –

+1

Eso es otro problema. El validador de sintaxis JSP/EL de Eclipse es un [error épico] (https://bugs.eclipse.org/bugs/buglist.cgi?quicksearch=jsp+el). Solo ignóralo y ejecútalo. Verás que simplemente funciona. Puede desactivar ese terrible validador JSP en las preferencias de Eclipse. Preguntas relacionadas: http://stackoverflow.com/questions/1790749, http://stackoverflow.com/questions/2268153, http://stackoverflow.com/questions/2975168, etc..etc .. – BalusC

1

Estaba teniendo un problema similar. Traje una aplicación web desde un viejo Tomcat 6/Java 6 a Tomcat 7/Java 7. Copié y pegué el cuerpo web.xml existente en el nuevo 3.0 web.xml. Todo estaba bien hasta que agregué un servlet que tenía paramters init-param, display-name, description y load-on-startup. Eclipse marcó estos params como roto con un "contenido no válido encontrado en ...". Gracias al stackoverflow, encontré que load-on-startup tenía que venir después de init-params pero solo un RTFM por lo que sabían. Mis otros params todavía estaban marcados como rotos. Esto es lo que la cabecera Web.xml parecía cuando se rompió:

<?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"> 

he cambiado el dtds a ns/J2EE y Web-app_2_5.xsd y Ecliupse dejó de quejarse. Pero es 2014 y pronto nos trasladaremos a Tomcat 8. Así que busqué con fuerza y ​​encontré los documentos para. En aplicación Web 3.0 los parámetros tienen que ser en este orden:

  1. Jee: descriptionGroup = cualquier combinación de 3 params: descripción, nombre para mostrar, icono
  2. servlet-nombre
  3. eligió 1: servlet -class o jsp-file
  4. un número n de init-params
  5. load-on-startup
  6. opciones: habilitado, desincronizado con apoyo de gestión como, security-role-ref, multiparte-config

Una vez que puse mis parámetros en orden, Eclipse estaba contento con ns/javaee y web-app_3_0.xsd.

+0

Aquí está la solución original de stackoverflow para el problema [] (http://stackoverflow.com/questions/5175034/strange-web-xml-error). Aquí es donde encontré la [definición de jee: descriptionGroup] (http://schemas.stylusstudio.com/j2ee50/n7e2eaf6a/group_descriptionGroup.html). El dtd de nivel superior en (alias servletType) [web-common_3_1.xsd] (http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/web-common_3_1.xsd) –

0

Asegúrese de que el archivo web.xml comienza con la etiqueta seguido de la etiqueta

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

En mi caso yo había etiqueta DOCTYPE y la eliminación de la etiqueta DOCTYPE del web.xml me aclaró este error,

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

1

Mueva "display-name" como primer elemento debajo de la etiqueta "servlet", el error de validación debería desaparecer.

Cuestiones relacionadas