2010-10-24 125 views
7

有点懒,我很高兴地发现我可以通过New - > Servlet创建一个新的Servlet源代码,而不是去New - > Class,然后将该类编辑成一个servlet。为什么在Eclipse中创建Servlet会破坏我的web.xml?

但是,我发现每次在Eclipse中创建新的servlet时,Eclipse都会修改我的web.xml。

具体地,它修改顶部元件:(换行符矿)

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

要使更糟糕的是,当我使用查找和替换来删除所有的“javaee:”垃圾文件, Eclipse仍然抱怨这些,即使他们不在那里。我必须复制并粘贴整个剩余的文件,以使这些投诉消失。

我相信Eclipse正在努力发挥作用,期待这个命名空间的某种愿望或需求。我如何做两件事之一:

  1. 让它停止这样做?

  2. 利用它试图做的任何事情,让它为我工作而不是反对我?

+0

这是避免Eclipse向导的一个很好的理由 – 2010-10-24 13:30:25

+0

您可以使用servlet 3.0吗? – Bozho 2010-10-24 13:34:20

+0

@Bozho - 当谈到servlet时,我是一个新手。我可能可以使用servlet 3.0,但我甚至不知道我目前使用的是哪个版本(我认为是最新版本),或者如何告诉它使用不同的版本。 – 2010-10-24 13:47:12

回答

11

我从来没有见过这个,但这表明你的Eclipse项目真的搞砸了。至少web.xml根声明没有任何意义。它看起来像是Servlet 2.4和2.5规范的混合体。也许Eclipse会变得很困惑,因为根名称空间(xmlns)指向Servlet 2.4(其中j2ee URI),而Web项目本身设置为Servlet 2.5或更新版本(应使用带有javaee URI的版本)。

此外,当您的Web项目设置为Servlet的默认没有web.xml将通过Eclipse中,因为新的Servlet 3.0批注像@WebServlet@WebFilter的生成等创建期间3.0,..这使得web.xml多余的。当您通过新建> Servlet创建新的servlet时,Eclipse已经自动生成这些注释。可能你试图根据错误信息自己创建web.xml

如果有必要,我建议备份一些代码,将整个项目丢弃并创建一个具有适当设置的新项目,并且不要触摸web.xml根声明。

假设你正在使用最新的Eclipse版本,太阳神SR1为Java EE开发人员,右击Eclipse的Project Explorer中,选择新建>动态Web项目和填写项目名称,并保留一切默认。点击Next直到最后一步,然后勾选生成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创建的servlet中的注释,并且在某处读取这意味着不需要web.xml,但是新的servlet在修复旧的web.xml后未添加。我会继续前进。 :-) – 2010-10-25 04:50:32

+0

有效,除了一件事情:我应该如何在一个标签中包含servlets?例如,我现在有一个TableServlet,但是如果在JSP中放入,则会出现此错误:在此行找到多个注释: \t - 片段“/TableServlet”并没有在预期的路径/ SamsTeachYourselfJSP_2/ \t的WebContent /发现TableServlet \t - 碎片 “/ TableServlet” 并没有在预期的路径/ SamsTeachYourselfJSP_2/ \t的WebContent/TableServlet – 2010-10-25 19:38:35

+1

这又是一个发现问题。 Eclipse的JSP/EL语法验证器是一个[史诗般的失败](https://bugs.eclipse.org/bugs/buglist.cgi?quicksearch=jsp+el)。只需忽略并运行它。你会看到它才起作用。您可以在Eclipse首选项中禁用可怕的JSP验证器。相关问题:http://stackoverflow.com/questions/1790749,http://stackoverflow.com/questions/2268153,http://stackoverflow.com/questions/2975168,etc ..等等.. – BalusC 2010-10-25 19:41:48

1

我有类似的问题。我将一个Web应用程序从旧的Tomcat 6/Java 6带到了Tomcat 7/Java 7.我将现有的web.xml正文复制并粘贴到新的3.0 web.xml中。一切都很好,直到我添加了一个具有init-param,display-name,description和load-on-startup参数的servlet。 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"> 

我改变了的DTD NS/J2EE和Web-app_2_5.xsd和Ecliupse停止抱怨。但是2014年,我们很快就会转向Tomcat 8。所以我努力挖掘并找到了文档。在web应用3.0的参数必须以该顺序:

  1. JEE:descriptionGroup = 3个PARAMS任何组合:说明,显示名称,图标
  2. servlet的名称
  3. 选择1:servlet的-class或JSP文件
  4. n个初始化,则params的
  5. 时加载的启动
  6. 选项:启用,非同步支持,运行的,安全角色引用,多部分配置

一旦我把我的params顺序,Eclipse很满意ns/javaee和web-app_3_0.xsd。

+0

这里是[](http://stackoverflow.com/questions/5175034/strange-web-xml-error)问题的原始stackoverflow修复程序。这是我找到[jee:descriptionGroup的定义](http://schemas.stylusstudio.com/j2ee50/n7e2eaf6a/group_descriptionGroup.html)的地方。 (又名servletType)[web-common_3_1.xsd](http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/web-common_3_1.xsd)上的顶级dtd – 2014-06-17 21:30:09

0

确保web.xml文件开始用标签,其后由标记

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

在我来说,我已经DOCTYPE标签以及除去web.xml中的DOCTYPE标签清除我这个错误,

<!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”标签下的第一个元素移动,验证错误应该消失。

相关问题