【问题标题】:Java Servlet: pass a request back to default processingJava Servlet:将请求传回默认处理
【发布时间】:2009-07-07 07:51:45
【问题描述】:

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

前缀_*.xml

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

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

提前非常感谢

【问题讨论】:

    标签: java servlets request response servlet-filters


    【解决方案1】:

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

    希望这会有所帮助。 大卫。

    【讨论】:

    • 谢谢... 听起来很有帮助 - 但是,我不想绑定到 Apache 并且(因为我们已经绑定到 Spring 作为 MVC),我宁愿坚持 skaffman 的建议。在给定的情况下似乎要容易得多:) Thx
    【解决方案2】:

    我强烈建议为此使用适当的 MVC 框架。正如您所发现的,标准 servlet API 在请求分派方面的灵活性非常有限。

    理想情况下,您可以将现有的 servlet 代码与 MVC 框架结合使用,框架根据路径模式执行 diapcthing,而您的 servlet 执行业务逻辑。幸运的是,Spring MVC 允许您使用 ServletForwardingController 做到这一点。这将是一个非常轻量级的 spring 配置。

    所以你的 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,而所有其他请求将通过容器。

    【讨论】:

    • 嘿,谢谢...这看起来很简单。 Spring 总是让我感到惊讶 :) 实际上,我们已经使用 swing 作为 MVC 框架 - 我会检查一下。
    • 有时令人惊讶的是,在 Spring 中您可以摆脱如此少的配置,您可以利用很多约定优于配置。
    【解决方案3】:

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

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

    【讨论】:

    • 这没有回答问题:在这种情况下如何回退到默认处理。
    • 谢谢...我已经做到了。正如 Avi 指出的那样,对我来说(或希望在几分钟内:曾经)缺少的是其中的“其他”部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 2012-04-02
    相关资源
    最近更新 更多