Servlet:如何获取自己的URL模式?

时间:2014-03-07 19:43:52

标签: java servlets servlet-filters

servlet或过滤器可以查找自己的网址格式吗?

意思是,如果我将一些servlet或过滤器绑定到/first/*/second/*并且有一个请求进来,我可以找出这两种模式中的哪一种触发了它吗?

即使servlet只绑定到一个模式,有没有办法从servlet内部查找(而不是硬编码一个值)?

3 个答案:

答案 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映射匹配才能确定。您必须转到规范以了解映射的实际工作方式。