2010-11-04 24 views
6

Tôi biết đối tượng yêu cầu có chức năng lấy tên máy chủ. (ví dụ: HttpServletRequest.getServerName())Bắt tên máy chủ trong khi khởi tạo servlet

Điều gì xảy ra nếu tôi cần cùng một chức năng bên trong việc khởi tạo một servlet? Làm thế nào để tôi làm điều này?

+2

Có vấn đề gì không nếu tôi gọi java.net.InetAddress.getLocalHost(). GetCanonicalHostName() để lấy tên máy chủ? –

+0

có, khi bạn có tên bí danh cho máy chủ của mình. Ví dụ: ứng dụng của bạn có thể hiển thị dưới dạng 'http: // www.google.com /' trong khi sử dụng 'getCanonicalHostName()' có thể cung cấp cho bạn 'http: // nuq05s02-in-f18.1e100.net /' –

Trả lời

4

Thông tin này là dựa trên yêu cầu và không áp dụng nghiêm ngặt. Nó có thể là thay đổi theo yêu cầu. Tất cả những gì bạn có trong tay khi khởi tạo servlet là cá thể ServletContext mà lần lượt cung cấp các phương thức như getInitParameter(). Bạn có thể sử dụng nó để truy cập vào các thiết lập ứng dụng rộng.

Vì vậy, đặt cược tốt nhất của bạn là để tự đặt tên máy chủ như một tham số bối cảnh trong web.xml

<context-param> 
    <param-name>serverName</param-name> 
    <param-value>foo</param-value> 
<context-param> 

để bạn có thể có được nó như sau trong phương pháp init() servlet của:

String serverName = getServletContext().getInitParameter("serverName"); 

khác (không được đề xuất) thay thế là đặt tên hiển thị đó là web.xml

<display-name>foo</display-name> 

để bạn có thể có được nó như sau:

String serverName = getServletContext().getServletContextName(); 
0

Tôi nghĩ điều đó là không thể. Một máy chủ có thể có nhiều tên. Mà một trong những nên được trả lại? Và máy chủ có thể thậm chí không biết về tất cả các tên được cấu hình trong DNS.

+0

Tôi nghĩ rằng người hỏi muốn nhận được cùng một giá trị như từ HttpServletRequest.getServerName() nhưng từ một HttpServlet chung. Có hành vi chuẩn mà tên cần trả về. –

+0

HttpServletRequest không chứa tên máy chủ vì trình duyệt web gửi một. Ngày khởi tạo của servlet không có yêu cầu xung quanh để đọc tên máy chủ từ. – MForster

3

Nếu vì một số lý do bạn không muốn sử dụng câu trả lời BalusC, và bạn không cần tên ngay lập tức, bạn có thể làm điều đó một cách lười biếng. Ngày hôm khác tôi thực hiện một kịch bản tương tự như vậy:.

private volatile boolean initialized; 

public void doGet(..) { 
    if (!initialized) { 
     synchronized(this) { 
      if (!initialized) { 
       initialize(request.getServerName()) 
      } 
     } 
    } 
} 

(. Các đôi kiểm tra khóa cho lười biếng-khởi tạo có thể được thực hiện theo nhiều cách See wikipedia)

0

InetAddress.getLocalHost() getHostName()

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