2010-05-16 3 views
5

У меня есть сторонний сервлет, который я не могу изменить. Он принимает init-param, который я хотел бы сделать экстернализацией (из web.xml).Как экрнализировать web.xml сервлет init-param? Spring DelegatingFilterProxy для сервлета?

Я могу экрнализировать фильтр сервлета init-param с использованием DelegatingFilterProxy. Это эффективно перемещает определение фильтра сервлетов в Spring, где есть гораздо более мощные инструменты для экстернализации (например: PropertyPlaceholderConfigurer, переменные среды и т. Д.)

Как это сделать для сервлета?

ответ

2

Похоже, ServletWrapperController - это то, что вам нужно.

реализация Spring Controller, который обертывания экземпляр сервлета, который он управляет внутренне. Такой обернутый сервлет не известен за пределами этого контроллера ; Весь его жизненный цикл будет покрыт здесь

<bean id="strutsWrappingController" class="org.springframework.web.servlet.mvc.ServletWrappingController"> 
    <property name="servletClass" value="org.apache.struts.action.ActionServlet"/> 
    <property name="servletName" value="action"/> 
    <property name="initParameters"> 
    <props> 
     <prop key="config">/WEB-INF/struts-config.xml</prop> 
    </props> 
    </property> 
</bean> 

Это позволит лечить устаревший сервлет как другой контроллер Spring, поэтому можно использовать обычные сопоставления обработчика Spring MVC в путь к нему.

+0

как вы используете это как замену? Кажется, он не реализует интерфейс Servlet. – mdma

+0

@mdma: Это не контроллер весны. Часть сервлета обрабатывается стандартной Spring 'DispatcherServlet', которая перенаправляет запрос контроллеру, который затем вызывает ваш сервлет, управляемый Spring. – skaffman

5

Похоже, вам нужен класс DelegatingServletProxy, хотя это не существует весной. Однако, я полагаю, это довольно просто, чтобы использовать код DelegatingFilterProxy в качестве отправной точки.

Сервлет только реализует несколько конкретных методов, поэтому делегирование должно быть простым.

Хорошо, я положил свои деньги туда, где есть мой рот! EDIT: Ниже базовой реализации DelegatingServletProxy.

Вы можете использовать его как это:

  1. Настройка обычного контекста весна конфигурации/ContextListener в web.xml, чтобы установить контекст пружинный приложения шириной для вашего веб-приложение.
  2. Добавьте сервлет в свой web.xml, чей класс реализации - это DelegatingServletProxy. Это заменяет ваш существующий serlvet, для которого вы хотите изменить init-params. Вы устанавливаете параметры init для этого нового сервлета: proxyServletClass - это имя класса вашего сервлета. proxyServletParams - это имя компонента свойств в конфигурации Spring. Этот компонент свойств используется для установки параметров init для прокси-сервлетов.
  3. В вашей весенней конфигурации, добавить новый Properites компонент, который определяет Init-Params

Некоторые примеры, в контексте пружинный приложения

<bean name="myInitParams" class="java.util.Properties"> 
    <constructor-arg> 
    <props> 
     <prop key="initParamName">initParamValue</prop> 
    </props> 
    </constructor-arg> 
</bean> 

Пример web.xml фрагмент

<servlet> 
    <servlet-name>...</servlet-name> 
    <servlet-class> 
     acme.DelegatingServletProxy 
    </servlet-class> 
    <init-param> 
     <param-name>proxyServletClass</param-name> 
     <param-value>your.original.servlet.ServletClass</param-value> 
    </init-param> 
    <init-param> 
     <param-name>proxyServletParams</param-name> 
     <param-value>myServletParams</param-value> 
     <!-- name of bean in spring context --> 
    </init-param> 
</servlet> 

Вот код сервлета, он довольно длинный, но большая часть его делегирует ServletContext - интересный материал случается на вершине. Это непроверено - следует считать отправной точкой.

import org.springframework.web.context.WebApplicationContext; 
import org.springframework.web.context.support.WebApplicationContextUtils; 

import javax.servlet.*; 
import javax.servlet.http.HttpServlet; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.Enumeration; 
import java.util.Properties; 
import java.util.Set; 

public class DelegatingServletProxy extends HttpServlet implements WebApplicationContextAware 
{ 
    private HttpServlet delegate; 

    private Properties initParams; 
    private String delegateName; 

    public void setDelegateName(String delegateName) 
    { 
     this.delegateName = delegateName; 
    } 

    public void init(ServletConfig config) throws ServletException 
    { 
     super.init(config); 
     WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); 
     delegate = wac.getBean(delegateName, HttpServlet.class); 
     delegate.init(new WrapServletConfig(config)); 
    } 

    @Override 
    public void destroy() 
    { 
     delegate.destroy(); 
    } 

    @Override 
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException 
    { 
     delegate.service(req, res); 
    } 

    public void setInitParams(Properties initParams) 
    { 
     this.initParams = initParams; 
    } 

    private class WrapServletConfig implements ServletConfig, ServletContext 
    { 
     // we override ServletContext also because it exposes getInitParameterNames()/getInitParemter() 
     private ServletConfig delegate; 
     private ServletContext delegateContext; 
     public WrapServletConfig(ServletConfig config) 
     { 
      this.delegate = config; 
      this.delegateContext = config.getServletContext(); 
     } 

     @Override 
     public String getServletName() 
     { 
      return delegate.getServletName(); 
     } 

     @Override 
     public ServletContext getServletContext() 
     { 
      return delegate.getServletContext(); 
     } 

     @Override 
     public String getInitParameter(String s) 
     { 
      return initParams.getProperty(s); 
     } 

     @Override 
     public Enumeration getInitParameterNames() 
     { 
      return initParams.propertyNames(); 
     } 

     @Override 
     public Object getAttribute(String s) 
     { 
      return delegateContext.getAttribute(s); 
     } 

     @Override 
     public Enumeration getAttributeNames() 
     { 
      return delegateContext.getAttributeNames(); 
     } 

     @Override 
     public void setAttribute(String s, Object o) 
     { 
      delegateContext.setAttribute(s, o); 
     } 

     @Override 
     public void removeAttribute(String s) 
     { 
      delegateContext.removeAttribute(s); 
     } 

     @Override 
     public String getServletContextName() 
     { 
      return delegateContext.getServletContextName(); 
     } 

     // the remainer is just straight delegation to ServletContext 

     @Override 
     public ServletContext getContext(String s) 
     { 
      return delegateContext.getContext(s); 
     } 

     @Override 
     public int getMajorVersion() 
     { 
      return delegateContext.getMajorVersion(); 
     } 

     @Override 
     public int getMinorVersion() 
     { 
      return delegateContext.getMinorVersion(); 
     } 

     @Override 
     public String getMimeType(String s) 
     { 
      return delegateContext.getMimeType(s); 
     } 

     @Override 
     public Set getResourcePaths(String s) 
     { 
      return delegateContext.getResourcePaths(s); 
     } 

     @Override 
     public URL getResource(String s) 
       throws MalformedURLException 
     { 
      return delegateContext.getResource(s); 
     } 

     @Override 
     public InputStream getResourceAsStream(String s) 
     { 
      return delegateContext.getResourceAsStream(s); 
     } 

     @Override 
     public RequestDispatcher getRequestDispatcher(String s) 
     { 
      return delegateContext.getRequestDispatcher(s); 
     } 

     @Override 
     public RequestDispatcher getNamedDispatcher(String s) 
     { 
      return delegateContext.getNamedDispatcher(s); 
     } 

     @Override 
     public Servlet getServlet(String s) 
       throws ServletException 
     { 
      return delegateContext.getServlet(s); 
     } 

     @Override 
     public Enumeration getServlets() 
     { 
      return delegateContext.getServlets(); 
     } 

     @Override 
     public Enumeration getServletNames() 
     { 
      return delegateContext.getServletNames(); 
     } 

     @Override 
     public void log(String s) 
     { 
      delegateContext.log(s); 
     } 

     @Override 
     public void log(Exception e, String s) 
     { 
      delegateContext.log(e, s); 
     } 

     @Override 
     public void log(String s, Throwable throwable) 
     { 
      delegateContext.log(s, throwable); 
     } 

     @Override 
     public String getRealPath(String s) 
     { 
      return delegateContext.getRealPath(s); 
     } 

     @Override 
     public String getServerInfo() 
     { 
      return delegateContext.getServerInfo(); 
     } 
    } 
} 
+0

Я довольно давно задавался вопросом, почему Spring не предоставляет такой класс. Обычно у них есть веские причины ... –

Смежные вопросы