我正在使用版本2.4的Servlet
,我需要通过init()
方法得到ContextPath
方法,因此我没有任何请求对象可能会调用getContextPath()
,并且因为Servlet版本I在ServletContext
中也没有getContextPath()
方法。如何在Servlet版本2.4的init()方法中获取ContextPath
有没有办法让这ContextPath()
莫名其妙?
我正在使用版本2.4的Servlet
,我需要通过init()
方法得到ContextPath
方法,因此我没有任何请求对象可能会调用getContextPath()
,并且因为Servlet版本I在ServletContext
中也没有getContextPath()
方法。如何在Servlet版本2.4的init()方法中获取ContextPath
有没有办法让这ContextPath()
莫名其妙?
试试这个代码:
class demo extends HttpServlet {
public void init(ServletConfig config) {
String path = config.getServletContext().getRealPath("/");
}
}
它应该工作
这将给webapp目录(例如'/ var/tomcat/webapps/foo')提供真正的文件系统路径,而不是部署应用程序的上下文路径('/ foo') 。正如krampstudio所说的,Servlet 2.5将'getContextPath()'添加到'ServletContext'中,为应用程序返回“主”上下文路径,但在2.4或更早版本中,您只能获取特定请求的路径。 –
这似乎是唯一可能的形式的servlet 2.5在这篇文章解释说:ServletContext getContextPath()
你是对的在Servlet 2.4中的对象ServeltContext没有方法getContextPath。
我可以建议两个选项:
设置上下文路径作为servlet的参数:
<servlet
>
<servlet-name>initServlet</servlet-name>
<servlet-class>net.cirrus-it.InitServlet`</servlet-class>
<init-param>
<param-name>contextPath</param-name>
<param-value>/myApp</param-value>
</init-param>
</servlet
>
尝试确定来自t的上下文路径他方法getRealPath()
根据文档:
返回包含对于给定的虚拟路径的实际路径的字符串。 例如,路径“/index.html”返回 上的绝对文件路径,服务器的文件系统将由 “http://host/contextPath/index.html”请求提供服务,其中contextPath是上下文路径这个ServletContext。
一个Web应用程序可以在多个不同的上下文路径被公开,所以在上下文路径(单数)是仅在特定请求的上下文中有意义。 Servlet 2.5添加了getContextPath()
到ServletContext
,指定为此Web应用程序返回“主”上下文路径,但在以前的spec版本中没有独立于容器的方式来访问此信息。
可能有些技巧适用于某些容器,例如在Tomcat上,ServletContext.getResource()
方法返回带有定制方案的URL,格式为jndi://hostname/context/...
。因此,您可以使用
ctx.getResource("/").getPath()
获得在Tomcat上下文路径(或可能getResource("/WEB-INF/web.xml")
和剪掉尾巴,为getResource()
被指定为返回null
如果你问它是不存在的文件) 。你将不得不尝试使用不同的容器来寻找类似的技巧。
[ServletContext.getServletContextName()](http://docs.oracle.com/javaee/1.4/api/javax/servlet/ServletContext.html#getServletContextName()) - 。ServletConfig.getServletContext()getServletContextName() –
在我的情况下这是空的:/ – Lama