【问题标题】:Why is creating Servlets in Eclipse breaking my web.xml?为什么在 Eclipse 中创建 Servlet 会破坏我的 web.xml?
【发布时间】:2011-04-29 19:27:39
【问题描述】:

有点懒惰,我很高兴发现我可以通过 New -> Servlet 创建一个新的 servlet 源代码,而不是通过 New -> Class 然后将类编辑为 servlet。

但是,我发现每次在 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>

之后,eclipse 抱怨它修改的所有元素,给我这样的符号:

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. 利用它试图做的任何事情,让它为我工作而不是对我不利?

【问题讨论】:

  • 这是避免使用 Eclipse 向导的一个很好的理由
  • 你可以使用servlet 3.0吗?
  • @Bozho - 我是 servlet 的新手。我可能可以使用 servlet 3.0,但我什至不知道我当前使用的是哪个版本(我认为是最新的)或如何告诉它使用不同的版本。
  • @matt b - 这将是最简单的解决方案,但与其避免它,我更愿意理解它。 :-)
  • 获取 Tomcat 7.0 并使用 servlet 3.0。 WTP 也支持它,所以请尝试一下。

标签: java eclipse servlets web.xml xml-namespaces


【解决方案1】:

我以前从未见过这种情况,但这表明您的 Eclipse 项目确实一团糟。至少 web.xml 根声明完全没有意义。它看起来像是 Servlet 2.4 和 2.5 规范的混合体。也许 Eclipse 感到困惑,因为根名称空间 (xmlns) 指向 Servlet 2.4 之一(带有 j2ee URI),而 Web 项目本身设置为 Servlet 2.5 或更新版本(应该使用带有 @987654330 的名称空间) @URI)。

此外,当您的 Web 项目在创建过程中设置为 Servlet 3.0 时,默认情况下不会由 Eclipse 生成 web.xml,因为新的 Servlet 3.0 注释,如 @WebServlet@WebFilter等等。这使得web.xml 是多余的。当您通过 New > Servlet 创建新的 servlet 时,Eclipse 将自动生成这些注释。可能您曾尝试根据错误信息自己创建web.xml

如果有必要,我建议备份一些代码,扔掉整个项目并创建一个具有正确设置的新项目,并且不要触动web.xml 根声明。

假设您使用的是最新的 Eclipse 版本,Java EE 开发人员的 Helios SR1,右键单击 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">

【讨论】:

  • 我想你已经调用它了。我关于 JSP 的书很旧,我看过的其他一些教程也很旧。我正在创建 web.xml,因为他们都指示我这样做。我看到在 servlet Eclipse 中创建的注释并在某处读到这意味着不需要 web.xml,但是在修复旧的破坏 web.xml 之后,如果没有添加新的 servlet,则新的 servlet 无法工作。我会继续尝试这个。 :-)
  • 这行得通,除了一件事:我应该如何在 标记中包含 servlet?例如,我现在有一个 TableServlet,但是如果我将 放在 JSP 中,我会收到此错误:在此行找到多个注释:- Fragment "/TableServlet “在预期路径/SamsTeachYourselfJSP_2/WebContent/TableServlet 中找不到 - 在预期路径/SamsTeachYourselfJSP_2/WebContent/TableServlet 中找不到片段“/TableServlet”
  • 这是另一个问题。 Eclipse 的 JSP/EL 语法验证器是 epic fail。只需忽略并运行它。你会发现它确实有效。您可以在 Eclipse 首选项中禁用那个糟糕的 JSP 验证器。相关问题:stackoverflow.com/questions/1790749, stackoverflow.com/questions/2268153, stackoverflow.com/questions/2975168, etc..etc..
  • 确实有效 :) 顺便说一句,在 JSP 中包含一个 servlet 有点难闻。不管怎样,你还在学习,对吧?我可以建议您阅读jspservlets 标签信息页面以正确深入了解基础知识吗?在标签信息页面的底部,您可以找到指向大量信息的非常有用的链接。
【解决方案2】:

我遇到了类似的问题。我将一个 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,我发现启动时加载必须在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 更改为 ns/j2ee 和 web-app_2_5.xsd,Ecliupse 不再抱怨。但它是 2014 年,我们很快就会迁移到 Tomcat 8。所以我努力挖掘并找到了 .在 web-app 3.0 中,参数必须按以下顺序排列:

  1. jee:descriptionGroup = 3 个参数的任意组合:描述、显示名称、图标
  2. servlet 名称
  3. 选择 1:servlet 类或 jsp 文件
  4. n 个初始化参数
  5. 启动时加载
  6. 选项:启用、支持异步、运行方式、安全角色引用、多部分配置

一旦我整理好参数,Eclipse 就对 ns/javaee 和 web-app_3_0.xsd 很满意。

【讨论】:

【解决方案3】:

确保web.xml 文件以标签开头,后跟标签

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

在我的情况下,我有 DOCTYPE 标记,从 web.xml 中删除 DOCTYPE 标记清除了这个错误,

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

【讨论】:

    【解决方案4】:

    将“display-name”作为“servlet”标签下的第一个元素,验证错误应该消失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      • 2013-06-25
      • 2013-06-07
      • 1970-01-01
      • 2021-07-26
      • 2018-10-02
      相关资源
      最近更新 更多