【发布时间】:2011-12-10 17:27:49
【问题描述】:
是否可以在运行时添加 servlet 映射?是通过ContextListener 还是在Servlet 的init() 方法中?
在我使用的应用程序中,所有请求都通过单个 Servlet 处理,并且它们的映射在 web.xml 文件中定义。映射的数量正在增加,添加新映射需要新版本。
将 servlet 映射到 /* 将不起作用,因为请求分派到 JSP 并且静态内容也将路由到此 Servlet。
尽管如此,使用过滤器可能是一种选择,但它会要求过滤器知道将哪个路径作为 RequestDispatcher 的前缀。
例如:
Dispatcher Servlet 映射
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/action/*</url-pattern>
</servlet-mapping>
路由过滤器定义
<filter>
<filter-name>RoutingFilter</filter-name>
<filter-class>com.ssv.web.filter.RoutingFilter</filter-class>
<init-param>
<param-name>exclude</param-name>
<param-value>/static/**:/action/**:/**/*.jsp</param-value>
</init-param>
<init-param>
<param-name>dispatcher-prefix</param-name>
<param-value>/action/**</param-value>
</init-param>
</filter>
在上面的示例中,我想跳过创建过滤器、过滤器映射和 servlet 映射,而是在 ContextListener 中动态定义映射。
我正在使用 Tomcat。
【问题讨论】: