一个servlet或filter可以查找自己的URL模式吗?
也就是说,如果我将某些servlet或filter绑定到/first/*
和/second/*
,并且有一个请求进来了,我能否找出哪个模式触发了它?
即使一个servlet只绑定到一个模式,是否有办法从servlet内部查找它(而不是硬编码一个值)?
一个servlet或filter可以查找自己的URL模式吗?
也就是说,如果我将某些servlet或filter绑定到/first/*
和/second/*
,并且有一个请求进来了,我能否找出哪个模式触发了它?
即使一个servlet只绑定到一个模式,是否有办法从servlet内部查找它(而不是硬编码一个值)?
这个HttpServletRequest类的方法可以帮助你。在任何由HTTP请求调用的Servlet方法中,您都可以获得HttpServletRequest的实例。
getServletPath
java.lang.String getServletPath() 返回调用servlet的此请求URL的部分。此路径以“/”字符开头,包括servlet名称或servlet的路径,但不包括任何额外的路径信息或查询字符串。与CGI变量SCRIPT_NAME的值相同。
看一下这个:
http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#getServletPath()
<url-pattern>
注册:ServletContext servletContext = getServletContext();
ServletRegistration servletRegistration = servletContext.getServletRegistration();
java.util.Collection<java.lang.String> mappings = servletRegistration.getMappings()
内容
final String path = getServletPath();
建议使用 request
,并通过比较字符串模式来找到映射关系。
Javadocs
servletContext.getServletRegistration()
不存在,只有 servletContext.getServletRegistration(String servletName)
。为了使用它,您可以重写 GenericServlet.init(ServletConfig config)
并通过执行 Collection<String> mappings=getServletContext().getServletRegistration(config.getServletName()).getMappings();
来获取映射。此外,servletRegistration.getMapping()
不存在。应该改为 servletRegistration.getMappings()
。 - TXNServletContext#getServletRegistration(String)
。ServletContext context = ...;
Collection<String> mappings = context.getServletRegistration("servlet-name").getMappings();
ServletContext#getServletRegistrations()
获取所有名称。Map<String, ? extends ServletRegistration> registrations = context.getServletRegistrations();
尝试通过比较类(您的servlet类与ServletRegistration
中的类名进行比较)来寻找您的类。
请注意,您仍然可能需要尝试将当前请求的URL与Servlet的URL映射进行匹配,以确保正确。 您需要查看规范以了解映射实际上是如何工作的。