我正在使用Tomcat7来提供一些JAXRS服务。我还想让一些静态网页由同一个应用程序使用默认的servlet提供服务。这就是我定义映射的方式:
public void contextInitialized(ServletContextEvent sce) {
sce.getServletContext().getServletRegistrations().get("default").addMapping("/backoffice/*");
}
我的问题是,访问这些静态文件的唯一方法是使用http://myserver.com/backoffice/index.html.我只想用http://myserver.com/backoffice我在web.xml文件中没有定义任何映射,只是我的主要JAXRS应用程序。我尝试过用这种方式使用欢迎文件列表:
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
我没有找到任何解决这个问题的方法,而且我定义映射到默认servlet的方式是我发现唯一有效的方法。
谢谢你的帮助。
我只能想到两种可能性。
- 在web.xml中定义到html文件的servlet映射,或者
- 创建一个servlet,用@WebServlet对其进行注释,然后在doGet()方法中分派/重定向到html文件
如果愿意,可以动态注册servlet。
我的结局是:
在我的Servlet上下文监听器中,我添加了:
public void contextInitialized(ServletContextEvent sce) {
String name = "backoffice-filter";
sce.getServletContext().addFilter(name, new StaticRedirectionFilter(basePath, targetPath));
sce.getServletContext().getFilterRegistrations().get(name).addMappingForUrlPatterns(null, false, pathDepart);
sce.getServletContext().getServletRegistrations().get("default").addMapping("/backoffice/*");
}
类StaticRedirectionFilter:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
String requestURI = request.getServletPath();
if (requestURI.equals(basePath)) {
HttpServletResponse response = (HttpServletResponse) res;
response.sendRedirect(request.getContextPath() + targetPath);
}
else {
chain.doFilter(req, res);
}
}
正如Alex所提到的,我本可以在StaticRedirectionFilter类上使用注释@WebFilter("/backoffice")来完成这项工作,但在上下文中使用映射似乎更便于重用。
我也认为它在Servlet 3之前就可以工作,即使我没有尝试过。