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

4

一个servlet或filter可以查找自己的URL模式吗?

也就是说,如果我将某些servlet或filter绑定到/first/*/second/*,并且有一个请求进来了,我能否找出哪个模式触发了它?

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


你是真的需要模式还是只需要URL? - Sotirios Delimanolis
1
@SotiriosDelimanolis 我实际上想要这个模式 ;) - Gili
3个回答

8

这个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()


5
您可以通过以下方式获取servlet的<url-pattern>注册:
ServletContext servletContext = getServletContext();
ServletRegistration servletRegistration = servletContext.getServletRegistration();
java.util.Collection<java.lang.String> mappings = servletRegistration.getMappings()

并获得该

内容

final String path = getServletPath();

建议使用 request,并通过比较字符串模式来找到映射关系。


Javadocs


我该如何在servlet 2.5中获取url模式?由于旧版本中不支持servlet注册。 - Imran Ali
servletContext.getServletRegistration() 不存在,只有 servletContext.getServletRegistration(String servletName)。为了使用它,您可以重写 GenericServlet.init(ServletConfig config) 并通过执行 Collection<String> mappings=getServletContext().getServletRegistration(config.getServletName()).getMappings(); 来获取映射。此外,servletRegistration.getMapping() 不存在。应该改为 servletRegistration.getMappings() - TXN

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映射进行匹配,以确保正确。 您需要查看规范以了解映射实际上是如何工作的。


如何在servlet 2.5中获取URL模式?由于旧版本中没有servlet注册,因此需要注意。 - Imran Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接