我正在使用catch all 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,但也可以加载这些资源?
答案 0 :(得分:0)
我认为在这种情况下你需要使用Servlet 过滤器,而不是Servlets。 Servlet过滤器是一种在请求流周围添加任何代码的方法。互联网上有很多例子,这里是one of them。
答案 1 :(得分:0)
您可能希望创建/使用servlet过滤器来正确重写路径。 There's a good example of one here complete with source code看起来可能会有所帮助。
我已经包含以下内容以供参考,因为描述符的实际功能经常被错误地解释为应该如何实现它们。
SRV.11.2映射规范
在Web应用程序部署描述符中,以下语法用于定义映射:
所有其他字符串仅用于完全匹配。
答案 2 :(得分:0)
我最终使用了一个单独的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