0

我想要一个 Servlet 来根据前缀和扩展名处理对文件的请求,例如

前缀_*.xml

由于无法在请求路径的开头和结尾进行映射,因此我已将所有 *.xml 请求映射到我的 Servlet。现在的问题是:对于不以“prefix_”开头的 XML 文件,我怎样才能退出我的 servlet,以便像对 xml 文件的“正常”请求一样处理请求?

这可能很简单,但我似乎无法找到它...... :-/

非常感谢提前

4

3 回答 3

2

另一种解决方案(可能适合您)是,如果您正在使用/计划在该 Web 容器实例前面使用 Apache,您可以使用 apache 的重写模块。将 url 重写为 Webapp 容器更容易处理的内容。

希望这可以帮助。大卫。

于 2009-07-07T08:41:51.333 回答
0

不是 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
        }
    }

(代码未经测试,只是一个想法......)

于 2009-07-07T08:10:31.647 回答
0

我强烈建议为此使用适当的 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,而所有其他请求将通过容器。

于 2009-07-07T08:33:24.953 回答