我想要一个 Servlet 来根据前缀和扩展名处理对文件的请求,例如
前缀_*.xml
由于无法在请求路径的开头和结尾进行映射,因此我已将所有 *.xml 请求映射到我的 Servlet。现在的问题是:对于不以“prefix_”开头的 XML 文件,我怎样才能退出我的 servlet,以便像对 xml 文件的“正常”请求一样处理请求?
这可能很简单,但我似乎无法找到它...... :-/
非常感谢提前
我想要一个 Servlet 来根据前缀和扩展名处理对文件的请求,例如
前缀_*.xml
由于无法在请求路径的开头和结尾进行映射,因此我已将所有 *.xml 请求映射到我的 Servlet。现在的问题是:对于不以“prefix_”开头的 XML 文件,我怎样才能退出我的 servlet,以便像对 xml 文件的“正常”请求一样处理请求?
这可能很简单,但我似乎无法找到它...... :-/
非常感谢提前
另一种解决方案(可能适合您)是,如果您正在使用/计划在该 Web 容器实例前面使用 Apache,您可以使用 apache 的重写模块。将 url 重写为 Webapp 容器更容易处理的内容。
希望这可以帮助。大卫。
不是 shure,但是一旦你捕获了所有 *.xml 请求,你就可以通过 HttpServletRequest.getRequestURI() 在你的代码中再次检查请求
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String uri =req.getRequestURI();
int i = uri.lastIndexOf('/');
int j = uri.lastIndexOf('.', i);
if (uri.substring(i+1, j).startsWith("prefix_")) {
// your code
}
}
(代码未经测试,只是一个想法......)
我强烈建议为此使用适当的 MVC 框架。正如您所发现的,标准 servlet API 在请求分派方面的灵活性非常有限。
理想情况下,您可以将现有的 servlet 代码与 MVC 框架结合使用,该框架基于路径模式执行 diapcthing,而您的 servlet 执行业务逻辑。幸运的是,Spring MVC 允许您使用 ServletForwardingController 做到这一点。这将是一个非常轻量级的弹簧配置。
所以你的 web.xml 中会有这样的东西:
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>foo.MyServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<url-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*</url-pattern>
</url-mapping>
然后,您将拥有一个 WEB-INF/spring-servlet.xml 文件,如下所示:
<beans>
<bean name="/prefix*.xml" class="org.springframework.web.servlet.mvc.ServletForwardingController">
<property name="servletName" value="myServlet"/>
</bean>
</beans>
差不多就是这样。对 /prefix*.xml 的所有请求都将转到 myServlet,而所有其他请求将通过容器。