0

我正在使用一个捕获所有 servlet:

@WebServlet(name="RequestHandler", urlPatterns="/*")
public class RequestHandler extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    new SeedPlanter(request, response).sow();   
}

}

处理所有请求。注意urlPattern /*. 这样做的原因是因为它加载了各种各样的东西,比如模板、处理对象等。servlet 基本上只是一个位于处理所有 html 呈现的自定义框架前面的外观。

问题是我不能再直接访问资源。

例如,如果我想加载一个位于 web-inf 目录 ( localhost:8080/myapp/test.html) 之外的 html 文件,它会给我一个 404 错误。事实上,即使我尝试localhost:8080/myapp/images/test.png在页面上加载图像 ( ),它也会给出未找到的 404 资源。删除 servlet 显然会破坏整个应用程序,但它确实允许我加载这些资源,所以我确信它是导致问题的 servlet。

我怎样才能像我一样使用 servlet,而且还能加载这些资源?

4

3 回答 3

1

我最终使用了一个单独的 servlet 来监听我的图像、css、js 文件夹(您可以在此处添加任意数量的 urlPatterns)。

@WebServlet(name="CommonRequestHandler", urlPatterns={"/images/*", "/css/*"})
public class CommonRequestHandler extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ServletContext context = getServletContext();
    String path = request.getRequestURI().substring(request.getContextPath().length()+1, request.getRequestURI().length());
    String fileName = context.getRealPath(path);

    //Get MIME type
    String mimeType = context.getMimeType(fileName);
    if(mimeType == null) {
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        return;
    }

    //Set content type
    response.setContentType(mimeType);

    //Set content size
    File file = new File(fileName);
    response.setContentLength((int) file.length());

    //Open file and output streams
    FileInputStream in = new FileInputStream(file);
    OutputStream out = response.getOutputStream();

    //Copy file content to output stream
    byte[] buf = new byte[1024];
    int count = 0;
    while((count = in.read(buf)) >= 0) {
        out.write(buf, 0, count);
    }
    in.close();
    out.close();
}
}

代码只是找到文件并将字节返回给浏览器。

参考:http: //java-espresso.blogspot.com/2011/09/webxml-problem-and-solution-for-url.html

于 2013-08-29T04:50:10.953 回答
0

我认为在这种情况下您需要使用 Servlet过滤器,而不是 Servlet。Servlet 过滤器是一种在请求流周围添加任何代码的方法。网上有很多例子,这里是其中之一

于 2013-08-28T07:12:45.017 回答
0

您可能希望创建/使用 servlet 过滤器来正确重写路径。这里有一个很好的示例,其中包含看起来可能有用的源代码。

我已经包含以下内容以供参考,因为描述符的实际功能经常被误解为它们应该如何实际实现。

SRV.11.2 映射规范

在 Web 应用程序部署描述符中,使用以下语法来定义映射:

  • 以 / 字符开头并以 /* 后缀结尾的字符串用于路径映射。
  • 以 * 开头的字符串。前缀用作扩展映射。
  • 仅包含 / 字符的字符串表示应用程序的“默认”servlet。在这种情况下,servlet 路径是请求 URI 减去上下文路径,并且路径信息为空。

所有其他字符串仅用于完全匹配。

于 2013-08-28T08:04:03.987 回答