2008-11-18 36 views
8

Tôi đang sử dụng Tomcat 5.5 làm vùng chứa servlet của mình. Ứng dụng web của tôi triển khai thông qua .jar và có một số tệp tài nguyên (tệp văn bản có chuỗi và tham số cấu hình) nằm trong thư mục WEB-INF của nó. Tomcat 5.5 chạy trên Linux ubuntu. Các tập tin tài nguyên được đọc với một trình đọc file:
fr = new FileReader("messages.properties");tomcat 5.5 - sự cố khi đọc tệp tài nguyên

Vấn đề là đôi khi các servlet không thể tìm thấy các tập tin tài nguyên, nhưng nếu tôi khởi động lại nó một vài lần nó hoạt động, sau đó một lần nữa sau một thời gian nó ngừng hoạt động. Ai đó có thể gợi ý cách tốt nhất để đọc chuỗi tài nguyên từ một servlet là gì? Hoặc giải pháp cho vấn đề này? Việc đặt các tệp tài nguyên trong WEB-INF/classes cũng không giúp ích gì.

Trả lời

5

Tôi đoán vấn đề là bạn đang cố gắng sử dụng đường dẫn tương đối để truy cập tệp. Sử dụng đường dẫn tuyệt đối sẽ giúp (ví dụ: "/home/tomcat5/properties/messages.properties").

Tuy nhiên, giải pháp thông thường cho vấn đề này là sử dụng phương thức getResourceAsStream của Trình nạp lớp. Triển khai tệp thuộc tính tới "WEB-INF/classes" sẽ làm cho nó có sẵn cho trình nạp lớp và bạn sẽ có thể truy cập luồng thuộc tính.

chưa được kiểm tra proto-code:

Properties props = new Properties(); 

InputStream is = 
getClass().getClassLoader().getResourceAsStream("messages.properties"); 

props.load(is); 
2

Nếu bạn sử dụng

new FileReader("message.properties"); 

Sau đó, FileReader sẽ cố gắng đọc rằng tập tin từ thư mục cơ sở - mà trong Tomcat có khả năng là thư mục/bin thư mục.

Như diciu đã đề cập, hãy sử dụng đường dẫn tuyệt đối hoặc tải nó làm tài nguyên cho trình nạp lớp.

9

Nếu bạn đang cố gắng truy cập tệp này từ một lớp nhận thức Servlet, chẳng hạn như một ContextListener hoặc trình lắng nghe vòng đời khác, bạn có thể sử dụng đối tượng ServletContext để nhận đường dẫn đến tài nguyên.

Ba giá trị này tương đương nhau. (Đừng nhầm lẫn getResourceAsStream như giống như một cung cấp bởi lớp ClassLoader Họ cư xử rất khác nhau.)

void myFunc(ServletContext context) { 
    //returns full path. Ex: C:\tomcat\5.5\webapps\myapp\web-inf\message.properties 
    String fullCanonicalPath = context.getRealPath("/WEB-INF/message.properties"); 

    //Returns a URL to the file. Ex: file://c:/tomcat..../message.properties 
    URL urlToFile = context.getResource("/WEB-INF/message.properties"); 

    //Returns an input stream. Like calling getResource().openStream(); 
    InputStream inputStream = context.getResourceAsStream("/WEB-INF/message.properties"); 
    //do something 
} 
2

tôi sử dụng đoạn mã sau để tải một thuộc tính tập tin từ bên trong một servlet:

public void init(ServletConfig config) throws ServletException { 
    String pathToFile = config.getServletContext().getRealPath("") 
     + "/WEB-INF/config.properties"; 
    Properties properties = new Properties(); 
    properties.load(new FileInputStream(pathToPropertiesFile)); 
} 

này làm việc với Tomcat 6.0

0

tôi đã sử dụng cho Jboss Seam:

ServletLifecycle.getServletContext().getRealPath("")

+2

điều này có liên quan gì đến câu hỏi đã được hỏi? –

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