如何在战争中获取当前的jsp文件路径?

时间:2015-06-17 01:31:25

标签: java jsp

由于很多转发请求,很难识别当前显示的jsp文件。是否有可能在战争中获取当前的jsp文件路径?如何实现?

举个例子: 网址:http://localhost:8080/controller/action

文件路径:/view/dev/test.jsp

<%= getServletContext().getRealPath("/") %> 

上述语句不起作用,它显示C:\ Projects \ test \ build \ web \而不是C:\ Projects \ test \ build \ web \ view \ dev \ test.jsp

1 个答案:

答案 0 :(得分:0)

这将取决于实现,但由于许多实现使用Jasper,它可能比您想象的更便携。当然,可移植性可能不是问题。

但简单的例子就是你采用了完整的合格班级名称&#34;这个&#34;从JSP中,您可以从中导出路径名。每个JSP都被编译成一个Servlet,它们每个都需要自己独特的类。

例如,在Glassfish中,它使用来自Tomcat / Apache的Jasper:

我有一个简单的jsp,root.jsp:

<html>
    <body>
        <% out.println(this.getClass()); %>
    </body>
</html>

它位于WAR的根级别。当我运行它时,我明白了:

class org.apache.jsp.root_jsp

当我创建目录d并将root.jsp复制到其中并执行它时,我得到了:

class org.apache.jsp.d.root_jsp

因此,您可以看到/root.jsp的类名是org.apache.jsp.root_jsp。对于/d/root.jsp,它是org.apache.jsp.d.root_jsp

如果您从班级名称中删除org.apache.jsp,请转换剩余的&#34;。&#34;到&#34; /&#34;,&#34; _&#34;到了&#34;。&#34;你会得到:

/root.jsp
/d/root.jsp

有效地为您提供所需的信息。

如果你在运行时覆盖JSP,那么它会开始将_1和_2粘贴到最后,所以你必须考虑到这一点。

但要玩弄它,它应该对你有用,并让你到达你去的地方。

请记住,它不是可移植的,它显然适用于Jasper(Tomcat,TomEE,Jetty,Glassfish),但我无法谈论WebLogic或WebSphere。

但是,它可能会。容器必须以某种方式将JSP文件映射到类,这是一种直观的方式。

所以,试一试,看看你是否可以让它与你的容器一起使用。