2010-10-24 26 views
7

Hơi lười, tôi khá vui khi thấy rằng tôi có thể tạo một mã nguồn servlet mới bằng cách vào New -> Servlet, thay vì đi New -> Class và sau đó chỉnh sửa lớp đó thành một servlet.Tại sao tạo Servlets trong Eclipse phá vỡ tệp web.xml của tôi?

Tuy nhiên, tôi đã phát hiện ra rằng mỗi lần tôi tạo một servlet mới trong Eclipse, Eclipse sửa đổi tệp web.xml của tôi.

Cụ thể, nó sẽ thay đổi các yếu tố đầu vào: (. LINEBREAKS tôi)

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

này dường như không nhất thiết là xấu, nhưng sau đó nó sẽ thay đổi khác nhau phụ yếu tố bằng cách đặt "JavaEE: "trước tên của họ, để chỉ ra rằng những yếu tố này thuộc về không gian tên đó.

Ví dụ, nó thay đổi

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

để

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

Sau đó làm lu mờ sau đó phàn nàn về tất cả các yếu tố đó được sửa đổi, đem lại cho tôi ký hiệu như:

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. 

Để làm vấn đề tồi tệ hơn, khi tôi sử dụng tìm và thay thế để xóa tất cả thành "javaee:" Eclipse vẫn phàn nàn về những điều này mặc dù chúng không còn ở đó nữa. Tôi phải sao chép và dán toàn bộ tệp còn lại lên trên chính nó để làm cho những khiếu nại này biến mất.

Tôi chắc chắn Eclipse đang cố gắng hữu ích, dự đoán một số mong muốn hoặc cần cho không gian tên này. Làm cách nào để tôi có thể thực hiện một trong hai điều sau:

  1. Hãy dừng làm việc này?

  2. Tận dụng lợi thế của bất cứ điều gì nó đang cố gắng làm, và làm cho nó làm việc cho tôi thay vì chống lại tôi?

+0

đây là một lý do chính đáng để tránh trình hướng dẫn Eclipse –

+0

Bạn có thể sử dụng servlet 3.0 không? – Bozho

+0

@Bozho - Tôi là người mới khi nói đến servlets. Có lẽ tôi có thể sử dụng servlet 3.0, nhưng tôi thậm chí không biết mình đang sử dụng phiên bản nào (tôi nghĩ là mới nhất) hoặc cách sử dụng phiên bản khác. –

Trả lời

11

Tôi chưa bao giờ thấy điều này trước đây, nhưng điều này cho thấy rằng dự án Eclipse của bạn thực sự là điều sai lầm. Ít nhất khai báo gốc web.xml không có ý nghĩa hoàn toàn. Nó trông giống như một hỗn hợp của Servlet 2.4 và 2.5 thông số kỹ thuật. Có lẽ Eclipse đang bị nhầm lẫn vì không gian tên gốc (xmlns) trỏ đến Servlet 2.4 (với j2ee URI) trong khi bản thân dự án web được đặt là Servlet 2.5 hoặc mới hơn (nên sử dụng một với javaee URI).

Ngoài ra, khi dự án web của bạn được thiết lập để Servlet 3.0 trong quá trình tạo, theo mặc định không web.xml sẽ được tạo ra bởi Eclipse vì Servlet mới 3,0 chú thích như @WebServlet, @WebFilter, vv .. mà làm cho web.xml thừa. Khi bạn tạo các servlet mới bằng Mới> Servlet, Eclipse sẽ tự động tạo các chú thích đó. Có lẽ bạn đã cố gắng tự mình tạo ra web.xml dựa trên thông tin sai lạc.

Tôi muốn đề xuất sao lưu một số mã nếu cần, ném toàn bộ dự án ra và tạo một mã mới với cài đặt thích hợp và không chạm vào khai báo gốc web.xml.

Giả sử rằng bạn đang sử dụng phiên bản mới nhất của Eclipse, Helios SR1 cho các nhà phát triển Java EE, rightclick Eclipse Project Explorer, chọn New> Project Dynamic Web và chỉ cần điền tên dự án và giữ cho mọi thứ mặc định. Nhấp vào Tiếp theo cho đến bước cuối cùng và sau đó đánh dấu chọn Tạo trình mô tả triển khai web.xml để cho phép Eclipse tạo một. Khai báo gốc sẽ trông giống như sau:

<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

Tôi nghĩ bạn đã gọi nó. Cuốn sách của tôi trên JSP là khá cũ và một số hướng dẫn khác tôi nhìn đã khá cũ. Tôi đã tạo web.xml vì tất cả đều hướng dẫn tôi. Tôi đã thấy các chú thích trong servlet Eclipse được tạo ra và đọc ở đâu đó, điều này có nghĩa là web.xml không cần thiết, nhưng sau đó các servlet mới không hoạt động mà không được thêm vào sau khi sửa chữa tệp tin web.xml. Tôi sẽ thử điều này trong tương lai. :-) –

+0

Điều đó hoạt động, ngoại trừ một điều: làm thế nào tôi nên bao gồm servlets trong một thẻ ? Ví dụ, bây giờ tôi có một TableServlet, nhưng nếu tôi đặt trong JSP, tôi nhận được lỗi này: Nhiều chú thích được tìm thấy ở dòng này: \t - Fragment "/TableServlet" không được tìm thấy tại dự kiến ​​path/SamsTeachYourselfJSP_2/ \t WebContent/TableServlet \t - Fragment "/ TableServlet" không được tìm thấy tại dự kiến ​​path/SamsTeachYourselfJSP_2/ \t WebContent/TableServlet –

+1

Đó là một vấn đề khác. Trình xác nhận cú pháp JSP/EL của Eclipse là một [lỗi sử thi] (https://bugs.eclipse.org/bugs/buglist.cgi?quicksearch=jsp+el). Chỉ cần bỏ qua và chạy nó. Bạn sẽ thấy rằng nó chỉ hoạt động. Bạn có thể vô hiệu hóa trình xác nhận JSP khủng khiếp đó trong các khuôn mẫu của Eclipse. Các câu hỏi liên quan: http://stackoverflow.com/questions/1790749, http://stackoverflow.com/questions/2268153, http://stackoverflow.com/questions/2975168, etc..etc .. – BalusC

1

Tôi gặp sự cố tương tự. Tôi đã đưa một ứng dụng web lên từ một Tomcat 6/Java 6 cũ đến Tomcat 7/Java 7. Tôi sao chép và dán nội dung web.xml hiện có vào web.xml 3.0 mới. Mọi thứ đều ổn cho đến khi tôi thêm một servlet có tham số init-param, display-name, description và load-on-startup. Eclipse đã gắn cờ các tham số này bị hỏng với "nội dung không hợp lệ được tìm thấy tại ...". Nhờ stackoverflow, tôi thấy rằng tải-on-startup đã đến sau init-params nhưng chỉ có một RTFM cho cách họ biết. Các thông số khác của tôi vẫn bị gắn cờ. Đây là những gì tiêu đề web.xml trông giống như khi nó bị hỏng:

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

Tôi đã thay đổi DTD để ns/J2EE và web-app_2_5.xsd, và Ecliupse ngừng phàn nàn. Nhưng năm 2014 và chúng tôi sẽ sớm chuyển sang Tomcat 8. Vì vậy, tôi đào sâu và tìm thấy tài liệu cho. Trong ứng dụng web 3.0 các thông số cần phải theo thứ tự này:

  1. jee: descriptionGroup = bất kỳ kết hợp của 3 params: mô tả, hiển thị tên, biểu tượng
  2. servlet-tên
  3. chọn 1: servlet đẳng cấp hoặc jsp-file
  4. n số init-params
  5. tải-on-khởi động
  6. tùy chọn: kích hoạt, asynch hỗ trợ, chạy như, an ninh-vai-ref, nhiều phần dữ liệu-config

Khi tôi đặt các tham số của mình theo thứ tự, Eclipse đã hài lòng với ns/javaee và web-app_3_0.xsd.

+0

Đây là bản sửa lỗi stackoverflow gốc cho vấn đề [] (http://stackoverflow.com/questions/5175034/strange-web-xml-error). Đây là nơi tôi tìm thấy [định nghĩa của jee: descriptionGroup] (http://schemas.stylusstudio.com/j2ee50/n7e2eaf6a/group_descriptionGroup.html). DTD cấp cao nhất trên (còn gọi là servletType) [web-common_3_1.xsd] (http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/web-common_3_1.xsd) –

0

Đảm bảo rằng tệp web.xml bắt đầu với thẻ tiếp theo là thẻ

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

Trong trường hợp của tôi, tôi đã tag DOCTYPE và loại bỏ các thẻ DOCTYPE từ web.xml xóa tôi lỗi này,

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

1

Di chuyển "tên hiển thị" làm phần tử đầu tiên trong thẻ "servlet", lỗi xác thực sẽ biến mất.

Các vấn đề liên quan