2014-12-08 1 views
3

Я использую Clojure + Ring для создания веб-приложения, работающего на Glassfish 3. Как получить доступ к переменной ServletContext в кольце init?Как получить ServletContext в функции инициализации звонка

+2

Что вы пробовали? Пожалуйста, прочитайте [Как задать хороший вопрос?] (Http://stackoverflow.com/help/how-to-ask). – DavidPostill

ответ

1

ServletContext, если таковой имеется, доступен на карте запроса. Мне было полезно посмотреть на значения :context, :servlet-context и :servlet-context-path. Вот небольшое связующее звено, которое я использую для определения пути:

(def ^:dynamic *app-context* nil) 

(defn wrap-context [handler] 
(fn [request] 
    (when-let [context (:context request)] 
    (logging/debug (str "Request with context " context))) 
    (when-let [pathdebug (:path-debug request)] 
    (logging/debug (str "Request with path-debug " pathdebug))) 
    (when-let [servlet-context (:servlet-context request)] 
    (logging/debug (str "Request with servlet-context " servlet-context))) 
    (when-let [servlet-context-path (:servlet-context-path request)] 
    (logging/debug (str "Request with servlet-context-path " servlet-context-path))) 
    (binding [*app-context* (str (:context request) "/")] 
    (logging/debug (str "Using appcontext " *app-context*)) 
    (-> request 
     handler)))) 

(defn url-in-context [url] 
    (str *app-context* url)) 
+1

К сожалению, функция 'init' не имеет доступа к параметру' запрос'. – Amigo

+0

Я вижу, что вы определяете путь здесь, но не на самом деле вызываете url-in-context. Не следует вызывать url-in-context из wrap-context (т. Е. Если вы действительно хотите, чтобы ваше приложение могло работать прозрачно, независимо от того, где оно)? – user3810626

+0

Нет, 'url-in-context' будет использоваться в приложении, например. в рамках модели представления для построения ссылки. – schaueho