servlet或过滤器可以查找自己的网址格式吗?
意思是,如果我将一些servlet或过滤器绑定到/first/*
和/second/*
并且有一个请求进来,我可以找出这两种模式中的哪一种触发了它吗?
即使servlet只绑定到一个模式,有没有办法从servlet内部查找(而不是硬编码一个值)?
答案 0 :(得分:7)
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()
答案 1 :(得分:4)
您可以通过
获取servlet的<url-pattern>
注册
ServletContext servletContext = getServletContext();
ServletRegistration servletRegistration = servletContext.getServletRegistration();
java.util.Collection<java.lang.String> mappings = servletRegistration.getMappings()
并获取
final String path = getServletPath();
来自request
的正如Andreeas建议的那样,并尝试通过比较字符串模式找出映射
<强> Javadoc中强>
答案 2 :(得分:1)
如果您特别需要URL映射,有几种方法,但它们都需要部署中的一些信息。
例如,如果您知道Servlet的名称,则可以使用ServletContext#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映射匹配才能确定。您必须转到规范以了解映射的实际工作方式。