2009-06-22 43 views
13

example documentation nói rằng bạn chỉ cần đặt tệp của mình trong chiến tranh/(hoặc thư mục con) và chúng có thể truy cập được từ máy chủ (miễn là chúng không phải là JSP hoặc trong WEB-INF). Ví dụ: nếu bạn đặt foo.css trong chiến tranh/thì bạn sẽ có thể truy cập nó tại http://localhost:8080/foo.css. Tuy nhiên, điều này không làm việc cho tôi cả. Không thể truy cập vào các tệp tĩnh của tôi.Tệp tĩnh trong (Java) App Engine không thể truy cập

Tài liệu trên appengine-web.xml nói rằng bạn cũng có thể biểu thị cụ thể các loại nhất định là tĩnh. Tôi đã thử điều này là tốt và nó làm cho không có sự khác biệt.

Tôi có thiếu thứ gì đó hiển nhiên không?

CẬP NHẬT: Tắt một trong các ánh xạ trong web.xml của tôi hơi quá tích cực. Sau đây là thủ phạm:

<servlet> 
    <servlet-name>Main</servlet-name> 
    <servlet-class>MainServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Main</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

Có vẻ như rằng nó đã lấy tất cả những gì đã không được nắm lấy là một trong những quy tắc khác, mà tôi không hiểu vì không có * trên phần cuối của url- mẫu. Nó cũng có vẻ là mâu thuẫn trực tiếp với the documentation nói rằng:

Lưu ý: file tĩnh, tập tin được phục vụ đúng nguyên văn cho người dùng như hình ảnh, CSS hay JavaScript, được xử lý riêng rẽ từ đường dẫn nêu trong deployment descriptor . Một yêu cầu cho đường dẫn URL khớp với đường dẫn đến tệp trong WAR được coi là tệp tĩnh sẽ phân phối tệp, bất kể servlet và ánh xạ bộ lọc trong bộ mô tả triển khai. Bạn có thể loại trừ các tệp khỏi những tệp được coi là tệp tĩnh bằng cách sử dụng tệp appengine-web.xml.

Vì vậy, làm cách nào để có quy tắc phù hợp với cơ sở tên miền của tôi (ví dụ: http://www.example.com/) và vẫn cho phép các tệp tĩnh lọc qua?

+0

Làm mẫu đi kèm với công việc SDK? Cách khởi chạy ứng dụng. Tôi đoán bạn đã kiểm tra xem các tệp có thực sự trong chiến tranh/ – jitter

+0

Vâng, ứng dụng sổ lưu bút cho phép tôi nhấn tệp CSS của nó tốt. –

Trả lời

-2

Khi sử dụng ví dụ tomcat phục vụ các tập tin tĩnh ai để xác định mô hình như thế này:

<servlet-mapping> 
    <servlet-name>default</servlet-name> 
    <url-pattern>*.css</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>default</servlet-name> 
    <url-pattern>*.js</url-pattern> 
</servlet-mapping> 

Có lẽ bạn có thể thử làm như vậy?

11

Hãy thử bằng tay xác định các tập tin tĩnh trong appengine-web.xml như

<static-files> 
    <include path="/favicon.ico" expiration="1d" /> 
    <include path="/static/**" /> 
    <include path="/**.css" />  
</static-files> 

này làm việc cho tôi ngay cả với servlets như

<servlet-mapping> 
<servlet-name>testServlet</servlet-name> 
<url-pattern>/</url-pattern> 
</servlet-mapping> 

<servlet-mapping> 
<servlet-name>testServlet</servlet-name> 
<url-pattern>/*</url-pattern> 
</servlet-mapping> 

Xem Static Files and Resource Files

2

... Có vẻ như nó đang nắm lấy mọi thứ không bị nắm giữ là một trong những quy tắc khác, mà tôi không hiểu vì không có * ở cuối mẫu url. ...

[[Không may, thuật ngữ "servlet mặc định" bị quá tải có nghĩa là các thứ khác nhau - dẫn đến nhầm lẫn. Tôi sẽ cố gắng rõ ràng.]]

Mẫu url "/" là đặc biệt (Rogue Wave gọi đây là "ánh xạ mặc định").Điều này định nghĩa "servlet mặc định" của ứng dụng, được sử dụng khi yêu cầu URL không khớp với các mẫu khác (SRV.11.2 bullet 3 và SRV 11.1 item # 4). Rõ ràng, "/" được xử lý như thể bạn đã chỉ định "/ *".

... Nó cũng có vẻ là mâu thuẫn trực tiếp với tài liệu ...

Đồng ý, tôi nghĩ công cụ ứng dụng có lỗi nên nó không tuân theo các tài liệu bạn trích dẫn. Đây là lý thuyết của tôi về những gì đang xảy ra. Vì có một servlet mặc định cho ứng dụng của bạn (kết quả từ việc định nghĩa một servlet cho mẫu url "/"), ứng dụng sẽ ngừng sử dụng "servlet mặc định" mặc định "do container cung cấp cho các ứng dụng không xác định servlet mặc định của riêng chúng" ". "Servlet mặc định" mặc định của container là những gì cung cấp hành vi mặc định để phân phối các tệp tĩnh. Tôi nghĩ điều này phù hợp với cách một số container hoạt động.

Tôi tự hỏi điều gì sẽ xảy ra nếu bạn đã cố chỉ định một servlet cho mẫu URL khớp với tệp tĩnh. Nó sẽ phục vụ các tập tin (như được chỉ ra bởi các tài liệu) hoặc gọi servlet (như được chỉ ra bởi lý thuyết này).

... Vậy làm cách nào để có quy tắc phù hợp với cơ sở tên miền của tôi (ví dụ: http://www.example.com/) và vẫn cho phép các tệp tĩnh lọc qua? ...

Nếu lý thuyết đúng, các giải pháp được cung cấp bởi jacob (thích hợp cho công cụ ứng dụng google) và zockman có vẻ như chúng hoạt động - chúng ánh xạ các tệp tĩnh vào bộ mặc định "mặc định" của vùng chứa ".

Ý tưởng duy nhất khác mà tôi có là viết "servlet mặc định" của ứng dụng để kiểm tra yêu cầu xem liệu yêu cầu có phải là "/" hay không. Nếu có, hãy xử lý nó. Nếu không, sau đó (bằng cách nào đó) gọi servlet mặc định "mặc định" của container để xử lý yêu cầu (hy vọng sẽ lưu trữ tệp). Hy vọng rằng, khi tệp tĩnh đã được phục vụ một lần, bộ nhớ đệm sẽ bỏ qua (các) servlet trong tương lai.

Rất tiếc, tôi không thể cụ thể hơn hoặc cung cấp mã - Tôi chưa làm việc với công cụ ứng dụng của Google (chưa!).


Ref:

+1

[Điều này Q & A] (http://stackoverflow.com/a/3505227/4270992) dường như đã đến khi một câu trả lời điên rồ cho vấn đề này điên. – Nick

1

Tôi nhận ra rằng đây là một câu hỏi thực sự cũ nhưng tôi chỉ chạy vào cùng một vấn đề. Tôi đã đặt số css/*.css, js/*.cssfavicon.ico dưới /war/static/ và sử dụng chỉ thị public_root trong số appengine-web.xml của mình để trỏ đến /static. Điều này làm việc tốt trên máy chủ dev địa phương của tôi nhưng không khi tôi tải lên ứng dụng. Loại bỏ /static và di chuyển mọi thứ lên một cấp độ làm việc cho tôi.

SDK v1.5.2 (Java) trên Mac OSX 10.6.8 với Java SE 6 (hệ điều hành MacOS X Default)

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