如何外化web.xml servlet init-param? Servlets的Spring DelegatingFilterProxy? [英] How to externalize web.xml servlet init-param? Spring DelegatingFilterProxy for Servlets?
问题描述
我有一个我无法修改的第三方servlet。它接受我想要外化的 init-param
(来自web.xml)。
I have a 3rd-party servlet that I cannot modify. It accepts an init-param
that I would like to externalize (from web.xml).
我可以外化servlet过滤器 init-param
使用 DelegatingFilterProxy 。这有效地将servlet过滤器定义移动到Spring中,其中有更强大的外化工具(例如:PropertyPlaceholderConfigurer,环境变量等)。
I can externalize a servlet filter init-param
using DelegatingFilterProxy. This effectively moves the servlet filter definition into Spring where there are much more powerful externalization tools (eg: PropertyPlaceholderConfigurer, environment variables, etc.)
我怎样才能做到这一点servlet?
How can I do this for a servlet?
推荐答案
看起来你需要一个 DelegatingServletProxy
类,虽然这个在Spring中不存在然而,我认为编码是非常简单的,使用DelegatingFilterProxy作为起点。
Looks like you need a DelegatingServletProxy
class, although this doesn't exist in Spring However, I imagine it is pretty straightforward to code, using DelegatingFilterProxy as a starting-point.
servlet只实现了一些具体的方法,委托应该是直截了当的。
A servlet only implements a handful of concrete methods, so delegating should be straightforward.
好的,我把钱放在嘴边!
编辑:低于 DelegatingServletProxy
的基本实现。
Ok, I put my money where my mouth is!
Below a basic implementation of DelegatingServletProxy
.
你这样使用它:
- 设置通常的spring上下文配置/ web.xml中的ContextListener为您的webapp设置应用程序范围的spring上下文。
- 将一个servlet添加到您的web.xml,其实现类是DelegatingServletProxy。这将取代您想要更改init-params的现有serlvet。为这个新的servlet设置init参数:proxyServletClass是servlet类的名称。 proxyServletParams是spring配置中的Properties bean的名称。此属性bean用于为代理的servlet设置init参数。
- 在spring配置中,添加一个新的Properites bean,用于定义init-params
弹簧应用程序上下文中的一些示例
Some examples, in the spring application context
<bean name="myInitParams" class="java.util.Properties">
<constructor-arg>
<props>
<prop key="initParamName">initParamValue</prop>
</props>
</constructor-arg>
</bean>
示例 web.xml
snippet
Example web.xml
snippet
<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>
这是servlet代码,它很长,但大多数是委托 ServletContext
- 有趣的东西发生在顶部。它未经测试 - 应该被视为一个起点。
Here's the servlet code, it's quite long, but most of it is delegating ServletContext
- the interesting stuff happens at the top. It's untested - should be considered a starting point.
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();
}
}
}
这篇关于如何外化web.xml servlet init-param? Servlets的Spring DelegatingFilterProxy?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!