2010-11-04 8 views
6

So che l'oggetto richiesta ha una funzione per ottenere il nome del server. (ad esempio HttpServletRequest.getServerName())Ottenere il nome del server durante l'inizializzazione della servlet

Cosa succede se ho bisogno della stessa funzionalità all'interno dell'inizializzazione di un servlet? Come faccio a fare questo?

+2

ci sono problemi/problemi se invoco java.net.InetAddress.getLocalHost(). getCanonicalHostName() per ottenere il nome del server? –

+0

sì, quando si hanno nomi alias per l'host. Per esempio l'applicazione può essere visibile in 'http: // www.google.com /' 'durante l'utilizzo getCanonicalHostName()' può dare 'http: // nuq05s02-in-f18.1e100.net /' –

risposta

4

Queste informazioni si basano su richieste e non su base strettamente applicativa. Può cioè cambiare per richiesta. Tutto quello che hai a portata di mano durante l'inizializzazione della servlet è l'istanza ServletContext che a sua volta offre metodi come getInitParameter(). Potresti farne uso per accedere a tutte le impostazioni dell'applicazione.

Quindi la soluzione migliore è quella di impostare manualmente il nome del server come parametro contesto in web.xml

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

in modo che è possibile ottenere come segue in init() metodo di servlet:

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

Altro (alternativa non consigliata) è impostato come nome visualizzato in web.xml

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

in modo che è possibile ottenere nel modo seguente:

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

Penso che non sia possibile. Un host può avere più nomi. Quale dovrebbe essere restituito? E l'host potrebbe anche non conoscere tutti i nomi che sono configurati in DNS.

+0

penso che il asker vuole ottenere lo stesso valore di HttpServletRequest.getServerName() ma da un HttpServlet generico. Esiste un comportamento standard per quale nome restituire. –

+0

HttpServletRequest contiene un nome server perché il browser Web ne invia uno. All'inizializzazione del servlet non vi è alcuna richiesta in giro da cui leggere il nome del server. – MForster

3

Se per qualche ragione non si desidera utilizzare la risposta di BalusC, e non è necessario immediatamente il nome, lo si può fare pigramente. L'altro giorno ho implementato uno scenario simile in questo modo:.

private volatile boolean initialized; 

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

(. Il ricontrollato bloccaggio lazy-inizializzazione può essere realizzata in diversi modi See wikipedia)

0

InetAddress.getLocalHost() getHostName()

Problemi correlati